Ma compréhension est que request.args
in Flask contient les paramètres codés URL d'une demande GET
tandis que request.form
contient POST
données. Ce que j'ai du mal à comprendre, c'est pourquoi lors de l'envoi d'une demande POST
, en essayant d'accéder aux données avec request.form
renvoie un 400
erreur mais quand j'essaye d'y accéder avec request.args
Cela semble marcher correctement.
J'ai essayé d'envoyer la demande avec Postman
et curl
et les résultats sont identiques.
curl -X POST -d {"name":"Joe"} http://127.0.0.1:8080/testpoint --header "Content-Type:application/json"
Code:
@app.route('/testpoint', methods = ['POST'])
def testpoint():
name = request.args.get('name', '')
return jsonify(name = name)
Vous POSTEZ JSON, ni request.args
Ni request.form
Ne fonctionneront.
request.form
Ne fonctionne que si vous POST data with the right content types ; les données du formulaire sont POSTÉES avec les encodages application/x-www-form-urlencoded
ou multipart/form-data
.
Lorsque vous utilisez application/json
, Vous N'AFFICHEZ PLUS de données de formulaire. Utilisez request.get_json()
pour accéder aux données JSON POST à la place:
@app.route('/testpoint', methods = ['POST'])
def testpoint():
name = request.get_json().get('name', '')
return jsonify(name = name)
Comme vous le dites, request.args
Ne contient que des valeurs incluses dans la chaîne de requête, la partie facultative d'une URL après le point d'interrogation ?
. Comme il fait partie de l'URL, il est indépendant du corps de la requête POST.
Vos données json en curl sont incorrectes, donc Flask n'analyse pas les données pour former.
Envoyer des données comme ceci: '{"name":"Joe"}'
curl -X POST -d '{"name":"Joe"}' http://example.com:8080/testpoint --header "Content-Type:application/json"