C'est ma première gâche avec API. J'ai écrit du code pour obtenir des données de l'API d'USASPender à l'aide d'un appel "Obtenir" et ça fonctionne. J'essaie maintenant d'obtenir des données d'un autre point final qui n'a que «post». Le code ci-dessous renvoie la réponse «400». Je ne sais pas ce que je dois changer pour que la sortie soit produite. Je ne sais pas si cela compte, mais ce point final produit un fichier zip. merci d'avance p> mise à jour: p> C'est ce que je enfin utilisé. J'ai la date comme dynamique afin que je puisse automatiser cette pull mensuellement à l'aide du planificateur de tâches. Si vous souhaitez extraire une date précise, supprimez la référence de la variable de date dans la déclaration d'en-tête et exécuter. P> pl_str1 = """{
"filters": {
"prime_award_types": [
"A",
"B",
"C",
"D",
"IDV_A",
"IDV_B",
"IDV_B_A",
"IDV_B_B",
"IDV_B_C",
"IDV_C",
"IDV_D",
"IDV_E",
"02",
"03",
"04",
"05",
"10",
"06",
"07",
"08",
"09",
"11"],
"agency": 54,
"date_type": "action_date","""
# Inserting date_range variable into API call
pl_str2 = '"date_range": {"start_date":' + date_3Months_prior +', "end_date":' + date_today + '}'
pl_str3 = """},
"columns": [],
"file_format": "csv"}"""
desired_payload = pl_str1 + pl_str2 + pl_str3
# $$$$$$$$$$$$$$$$$$$$$$$$$$$ REQUESTING DESIRED INFO FROM THE API HERE $$$$$$
url = 'https://api.usaspending.gov/api/v2/bulk_download/awards/'
headers = {'Content-Type': 'application/json'}
resp = requests.post(url, headers=headers, data=desired_payload)
if resp.status_code == 200:
print('success')
print(resp.content)
else:
print('fail')
# API returns a zip file; grabbing that
# This will turn the API response into a string I can use regex on
test = resp.content.decode('UTF-8')
# Extracting url for zip we want to retrieve
test2 = re.findall(r"file_url\S+\.zip", test)[0]
test3 = re.findall(r"https\S+\.zip", test2)[0]
import zipfile
import io
import time
r = requests.get(test3)
# add sleep in case it takes a while for the API to return stuff; not sure if
# but just in case
time.sleep(5)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
3 Réponses :
par exemple p> Ceci peut être exprimé sous la forme P> paramètres code> sont les paramètres de requête dans l'URL.
www.stackoverflow.com?Parameter=test code> p> P>
payload = {
"parameter": "test"
}
Eh bien c'est un début. Maintenant, je reçois une réponse de 500 au lieu de 400. Je suppose que c'est quelque chose que j'ai besoin de faire ressortir les administrateurs de site?
Ceci est un bogue ou une erreur dans leur serveur. Non votre partie n'est bien fait, utilisez une autre API, voir
Lorsque vous exécutez cette URL ( https://api.usaspending.gov/ API / V2 / BULK_DOWNLOAD / Awards / ) Dans le navigateur et remplir le formulaire avec votre demande. Vous aurez une réponse comme celle-ci { "Détail": "Manquant un ou plusieurs paramètres de corps requis: prime_award_types ou sub_award_types" }
Ajouter Fliters, Data_Range, Data_Type, Agency, Prime_Award_Types
Votre demande devrait être comme ceci: p> } p> p>
Pawel, pourquoi votre code fonctionne-t-il lorsque je le branche-t-il dans l'URL mais que je n'en mangeais pas via Python?
Obtenez des données de formulaire dans la fonction et envoyez-la une autre fonction avec demande.
import requests from flask import Flask, return , request, @videos.route("/ajaxprocess", methods=["GET","POST"]) def ajaxprocess(): if request.method =="POST": text = request.form.get('text_text') font = request.form.get('font_text') color = request.form.get('color_text') start_text = request.form.get('start_text') end_text = request.form.get('end_text') video_id = request.form.get('vid') all_data = {'status':'OK','text':text,'font':font,'color':color,'start_text':start_text,'end_text':end_text,'vid':video_id} r = requests.post("http://127.0.0.1:5000/videos/test_text",json=all_data) print(r) return redirect(url_for("videos.show_videos")) @videos.route("/test_text", methods = ['POST']) def test_text(): data = request.get_json("") print(data) return "success!"
400 signifie mauvaise demande. Pour savoir ce qui ne va pas avec votre demande, nous devons savoir ce que le point final de l'API attend.
Vous n'êtes pas certains paramètres requis. Voir ici
Oui j'ai vu ça. Selon leur documentation, le seul paramètre requis est "Filtres"
@ wolf7687 Avez-vous déjà eu ce travail? Je reçois aussi l'erreur 500.