-1
votes

Demande de Python () Renvoie la réponse 400 lorsque vous essayez d'obtenir un fichier d'API

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. xxx pré>

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()


4 commentaires

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.


3 Réponses :


2
votes

paramètres code> sont les paramètres de requête dans l'URL.

par exemple p>

www.stackoverflow.com?Parameter=test code> p> P>

Ceci peut être exprimé sous la forme P>

payload = {
     "parameter": "test"
}


2 commentaires

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



0
votes

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: xxx

}


1 commentaires

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?



0
votes

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!"


0 commentaires