web-dev-qa-db-fra.com

Python3: JSON POST Requête SANS bibliothèque de requêtes

Je veux envoyer des données encodées JSON à un serveur en utilisant uniquement des bibliothèques natives Python. J'aime les requêtes mais je ne peux tout simplement pas les utiliser car je ne peux pas les utiliser sur la machine qui exécute le script Je dois le faire sans.

newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
params = urllib.parse.urlencode(newConditions)
params = params.encode('utf-8')

req = urllib.request.Request(conditionsSetURL, data=params)
urllib.request.urlopen(req)        

Mon serveur est un serveur WAMP local. J'ai toujours un

urllib.error.HTTPError: Erreur HTTP 500: Erreur de serveur interne

Je suis sûr à 100% que c'est PAS un problème de serveur, car les mêmes données, avec la même URL, sur le même machine, avec le même serveur fonctionne avec la bibliothèque de demandes et Postman.

23
moritzg

Vous ne publiez pas de JSON, vous publiez un application/x-www-form-urlencoded demande.

Encodez en JSON et définissez les en-têtes appropriés:

import json

newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
params = json.dumps(newConditions).encode('utf8')
req = urllib.request.Request(conditionsSetURL, data=params,
                             headers={'content-type': 'application/json'})
response = urllib.request.urlopen(req)

Démo:

>>> import json
>>> import urllib.request
>>> conditionsSetURL = 'http://httpbin.org/post'
>>> newConditions = {"con1":40, "con2":20, "con3":99, "con4":40, "password":"1234"} 
>>> params = json.dumps(newConditions).encode('utf8')
>>> req = urllib.request.Request(conditionsSetURL, data=params,
...                              headers={'content-type': 'application/json'})
>>> response = urllib.request.urlopen(req)
>>> print(response.read().decode('utf8'))
{
  "args": {}, 
  "data": "{\"con4\": 40, \"con2\": 20, \"con1\": 40, \"password\": \"1234\", \"con3\": 99}", 
  "files": {}, 
  "form": {}, 
  "headers": {
    "Accept-Encoding": "identity", 
    "Connection": "close", 
    "Content-Length": "68", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.4", 
    "X-Request-Id": "411fbb7c-1aa0-457e-95f9-1af15b77c2d8"
  }, 
  "json": {
    "con1": 40, 
    "con2": 20, 
    "con3": 99, 
    "con4": 40, 
    "password": "1234"
  }, 
  "Origin": "84.92.98.170", 
  "url": "http://httpbin.org/post"
}
44
Martijn Pieters