JSON pranešimas naudojant Python užklausas

Turiu siųsti JSON iš kliento į serverį. Aš naudoju Python 2.7.1 ir simplejson. Klientas naudoja prašymus. „CherryPy“ serveris. Aš galiu gauti JSON su kietuoju kodu iš serverio (kodas nerodomas), bet kai bandau atlikti POST JSON serveryje, gaunu „400 Bad Request“.

Čia yra mano kliento kodas:

 data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'} data_json = simplejson.dumps(data) payload = {'json_payload': data_json} r = requests.post("http://localhost:8080", data=payload) 

Čia yra serverio kodas.

 class Root(object): def __init__(self, content): self.content = content print self.content # this works exposed = True def GET(self): cherrypy.response.headers['Content-Type'] = 'application/json' return simplejson.dumps(self.content) def POST(self): self.content = simplejson.loads(cherrypy.request.body.read()) 

Bet kokios idėjos?

374
16 марта '12 в 10:46 2012-03-16 10:46 Charlesas R yra nustatytas kovo 16, 12, 10:46 2012-03-16 10:46
@ 6 atsakymai

Kaip ir 2.4.2 ir vėlesnių versijų užklausose, skambutyje galite naudoti „json“ parametrą, kuris jį supaprastina.

 >>> import requests >>> r = requests.post('http://httpbin.org/post', json={"key": "value"}) >>> r.status_code 200 >>> r.json() {'args': {}, 'data': '{"key": "value"}', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'close', 'Content-Length': '16', 'Content-Type': 'application/json', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.4.3 CPython/3.4.0', 'X-Request-Id': 'xx-xx-xx'}, 'json': {'key': 'value'}, 'origin': 'xxxx', 'url': 'http://httpbin.org/post'} 

EDIT: Ši funkcija pridėta prie oficialių dokumentų. Ją galite peržiūrėti čia: Dokumentacija apie užklausas

585
13 окт. Zeyang Lin spalio 13 d. atsakymas 2014-10-13 19:08 '14, 19:08, 2014-10-13 19:08

Pasirodo, aš praleidau antraštės informaciją. Šie darbai:

 url = "http://localhost:8080" data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'} headers = {'Content-type': 'application/json', 'Accept': 'text/plain'} r = requests.post(url, data=json.dumps(data), headers=headers) 
281
31 марта '12 в 6:26 2012-03-31 06:26 atsakymą įteikė Karlas R , kovo 31 d. 12 val. 2012-03-31 06:26

Iš užklausų 2.4.2 ( https://pypi.python.org/pypi/requests ) parametras „json“ yra palaikomas. Nereikia nurodyti „turinio tipo“. Taigi, trumpesnė versija:

 requests.post('http://httpbin.org/post', json={'test': 'cheers'}) 
44
10 дек. Atsakymas pateikiamas ZZY 10 gruodis. 2014-12-10 13:08 '14, 13:08 2014-12-10 13:08

Geriausias būdas:

 url = "http://xxx.xxxx.xx" datas = {"cardno":"6248889874650987","systemIdentify":"s08","sourceChannel": 12} headers = {'Content-type': 'application/json'} rsp = requests.post(url, json=datas, headers=headers) 
8
04 мая '17 в 10:26 2017-05-04 10:26 atsakymas pateikiamas ellen 04 gegužės 17 d., 10:26, 2017-05-04 10:26

Veikia puikiai su 3.5 + pythonu

klientas:

 import requests data = {'sender': 'Alice', 'receiver': 'Bob', 'message': 'We did it!'} r = requests.post("http://localhost:8080", json={'json_payload': data}) 

Serveris:

 class Root(object): def __init__(self, content): self.content = content print self.content # this works exposed = True def GET(self): cherrypy.response.headers['Content-Type'] = 'application/json' return simplejson.dumps(self.content) @cherrypy.tools.json_in() @cherrypy.tools.json_out() def POST(self): self.content = cherrypy.request.json return {'status': 'success', 'message': 'updated'} 
0
21 янв. atsakymą pateikė Ruhil Jaiswal 21 jan. 2017-01-21 00:10 '17 ne 0:10 2017-01-21 00:10

Tai veikia Python 3.5 versijoje, jei URL yra užklausos / parametrų eilutės reikšmė,

Užsisakyti URL = https://bah2.com/ws/rest/v1/concept/

Parametrų vertė = 21f6bb43-98a1-419d-8f0c-8133669e40ca

 import requests r = requests.post('https://bah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca',auth=('username', 'password'),verify=False, json={"name": "Value"}) headers = {'Content-type': 'application/json'} print(r.status_code) 
-1
13 окт. Atsakymas pateikiamas MAX 13 okt. 2016-10-13 11:30 '16, 11:30, 2016-10-13 11:30

Kiti klausimai apie „ etiketes „ arba „ Klauskite“