Muszę wysłać JSON z klienta na serwer. Używam Python 2.7.1 i simplejson. Klient korzysta z żądań. Serwer to CherryPy. Mogę pobrać z serwera zakodowany na stałe kod JSON (kod nie pokazano), ale gdy próbuję wysłać JSON na serwer, otrzymuję komunikat „400 Bad Request”.
Oto mój kod klienta:
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)
Oto kod serwera.
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())
Jakieś pomysły?
python
json
python-requests
cherrypy
Charles R.
źródło
źródło
__init__
metod klasowych zcontent
argumentem (i nie twierdzi, że w podanym linku). W szczegółowym przykładzie, jaki mają, użytkownik dostarcza kod, który wywołuje__init__
i podaje argumenty, których nie widzieliśmy tutaj, więc nie mam pojęcia, w jakim stanie jest twój obiekt, gdy# this works
komentarz jest odpowiedni.cherrypy.quickstart(Root(), '/', conf)
.Odpowiedzi:
Począwszy od wersji 2.4.2 Żądań, można alternatywnie użyć parametru „json” w wywołaniu, co upraszcza.
EDYCJA: Ta funkcja została dodana do oficjalnej dokumentacji. Możesz go zobaczyć tutaj: Żąda dokumentacji
źródło
json
. Musiałem wejść do Github, zanim zobaczyłem jakąkolwiek wzmiankę: github.com/kennethreitz/requests/blob/…Okazuje się, że brakowało mi informacji nagłówka. Następujące prace:
źródło
application/json
inGET
i jakoś brakowało, że nie dostarczyła je na żądanie. Może być również konieczne upewnienie się, że coś zwróciszPOST
lub możesz dostać500
.r
, dostaję<Response [200]>
.json.dumps
tutaj.data
Parametrrequests
działa dobrze ze słownikami. Nie ma potrzeby konwersji na ciąg.Z żądań 2.4.2 ( https://pypi.python.org/pypi/requests ) obsługiwany jest parametr „json”. Nie trzeba określać „Content-Type”. Krótsza wersja:
źródło
Lepszym sposobem jest :
źródło
Content-type: application/json
jest zbędny, ponieważjson=
już sugeruje, że.Content-type
text/html; charset=UTF-8
. Czy powyższe nie zadziała?Działa idealnie z python 3.5+
klient:
serwer:
źródło
Który parametr między (dane / json / pliki) powinien zostać użyty, to zależy od nagłówka żądania o nazwie ContentType (zwykle sprawdź to za pomocą narzędzi programistycznych w przeglądarce),
gdy typem treści jest application / x-www-form-urlencoded, kod powinien być:
gdy typem treści jest application / json, twój kod powinien być jednym z poniższych:
gdy typem treści jest wieloczęściowy / formularz-dane, służy on do przesyłania plików, więc kod powinien być:
źródło