2012-03-16 30 views
288

Bir istemciden sunucuya bir JSON POST işlemi yapmam gerekiyor. Python 2.7.1 ve simplejson kullanıyorum. Müşteri İstekleri kullanıyor. Sunucu CherryPy. Sunucudan kodlanmış bir JSON ALABİLİRİM (kod gösterilmiyor), ancak sunucuya bir JSON POST yapmaya çalıştığımda "400 Kötü İstek" aldım.Python İstekleri Kullanarak JSON Gönderme

İşte
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) 

sunucu kodu:

İşte müvekkilim kodudur.

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

Herhangi bir fikir?

+0

[document] 'in (http://docs.cherrypy.org/dev/progguide/REST.html) bir örneğinin soyulmuş bir sürümünü kullanıyorum. –

+0

Benim yorumum hala geçerli - CherryPy 'content' argümanıyla '__init__' yöntemlerini çağırmıyor (ve sağladığınız bağlantıda talepte bulunmuyor). Sahip oldukları ayrıntılı örnekte, kullanıcı '__init__' olarak adlandırılan kodu sağlar ve burada görmediğimiz argümanları sağlar, böylece '# bu eser' yorumunuz ilgili olduğunda nesnenizin hangi durumda olduğunu bilmem. –

+1

Örneğin oluşturulduğu satırı görmeyi mi istiyorsun? –

cevap

434
İstekler sürümü 2.4.2 itibariyle

ve sonrası, alternatif olarak daha basit hale getirir çağrısında 'json' parametresini kullanabilirsiniz.

>>> 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': 'x.x.x.x', 
'url': 'http://httpbin.org/post'} 

DÜZENLEME: Bu özellik, resmi belgelere eklendi. Buradan görüntüleyebilirsiniz: Requests documentation

+36

Ben Cevabınız tökezletici önce boşa ne kadar zaman inanamıyorum. ** istekleri ** dokümanların güncellenmesi gerekiyor, json' parametresinde kesinlikle hiçbir şey yok. Bunun herhangi bir söz görmeden Github içine gitmek zorunda kaldı: https://github.com/kennethreitz/requests/blob/76f7ce8a249e57df5ed1f2331a43e635895bdbba/requests/api.py bu 2.4 gibi daha deyimsel olduğundan – IAmKale

+1

kabul edilen yanıt olarak ayarlandığında, 0,2. Unutmayın, çılgın unicode için bu işe yaramayabilir. –

+0

@IAmKale ile aynı ayakkabıdaydım. Bu, AWS'nin API Ağ Geçidi ile yaşadığım baş ağrısını hafifletti. Varsayılan olarak JSON biçimindeki POST verilerini gerektirir. – jstudios

250

Başlık bilgilerini kaçırıyordum. Aşağıdaki işler:

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) 
+0

İyi yakalamak - Ben GET' 'daki' application/json' gördü ve bir şekilde istek üzerine sağlanan olmadığını kaçırdı. Ayrıca, POST'tan bir şey döndürdüğünüzden emin olmanız veya "500" sahibi olmanız gerekebilir. –

+0

Gerekli görünmüyor. "R" yi yazdırdığımda, 'ı aldım. –

+0

Bu json'u sunucu tarafında nasıl alabilirim? – VaidAbhishek

35

İstekler 2.4.2'den (https://pypi.python.org/pypi/requests), "json" parametresi desteklenir. "İçerik Türü" belirtmeye gerek yok. Yani kısa versiyon:

requests.post('http://httpbin.org/post', json={'test': 'cheers'}) 
-1

Bu Python Version 3.5, için mükemmel çalışır URL Sorgu Dizi/Parametre değerini,

URL iste = içeriyorsa https://bah2.com/ws/rest/v1/concept/

Parametre değeri = 21f6bb43-98a1- 419d-8f0c-8133669e40ca piton ile

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

İşleri mükemmel 3.5+

istemci:

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

sunucusu:

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'} 
4

iyi yoludur:

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) 
+0

'içerik tipi: uygulama/json' zaten ima '=' json olarak gereksizdir. – Moshe

0

sizin pip sürümünü yükseltin.

sudo pip3 install --upgrade requests 
+0

Bu pip sürümünü yükseltme değil, bu yeni mevcut sürüme belirtilen tüm paketler Yükseltme --upgrade, kütüphaneye -U yükseltir. bağımlılıklarının kullanımı, kullanılan yükseltme stratejisine bağlıdır. –

İlgili konular