Мне нужно отправить JSON от клиента к серверу. Я использую Python 2.7.1 и simplejson. Клиент использует запросы. Сервер является CherryPy. Я могу получить жестко закодированный JSON с сервера (код не показан), но когда я пытаюсь отправить JSON на сервер, я получаю «400 Bad Request».
Вот мой код клиента:
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)
Вот код сервера.
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())
Любые идеи?
python
json
python-requests
cherrypy
Чарльз Р
источник
источник
__init__
методы класса сcontent
аргументом (и не претендует на указанную вами ссылку). В подробном примере, который у них есть, пользователь предоставляет код, который вызывает__init__
и предоставляет аргументы, которых мы здесь не видели, поэтому я понятия не имею, в каком состоянии находится ваш объект, когда ваш# this works
комментарий актуален.cherrypy.quickstart(Root(), '/', conf)
,Ответы:
Начиная с версии 2.4.2 запросов, вы можете альтернативно использовать параметр json в вызове, что упрощает его.
РЕДАКТИРОВАТЬ: Эта функция была добавлена в официальную документацию. Вы можете просмотреть его здесь: Запрос документации
источник
json
. Мне пришлось зайти в Github, прежде чем я увидел упоминания об этом: github.com/kennethreitz/requests/blob/…Оказывается, мне не хватало информации заголовка. Следующие работы:
источник
application/json
инGET
и как - то пропустил , что вы не предоставили его по требованию. Вам также может потребоваться убедиться, что вы что-то возвращаетеPOST
или можете получить500
.r
, я получаю<Response [200]>
.json.dumps
здесь.data
Параметрrequests
прекрасно работает со словарями. Нет необходимости конвертировать в строку.Из запросов 2.4.2 ( https://pypi.python.org/pypi/requests ) поддерживается параметр "json". Не нужно указывать «Content-Type». Итак, более короткая версия:
источник
Лучший способ :
источник
Content-type: application/json
является излишним , посколькуjson=
уже намекает , что.Content-type
text/html; charset=UTF-8
. Тогда выше не будет работать?Отлично работает с питоном 3.5+
клиент:
сервер:
источник
Какой параметр между (data / json / files) следует использовать, на самом деле это зависит от заголовка запроса с именем ContentType (обычно проверяйте это с помощью инструментов разработчика вашего браузера),
когда Content-Type является application / x-www-form-urlencoded, код должен быть:
когда Content-Type - это application / json, ваш код должен быть одним из следующих:
когда Content-Type является multipart / form-data, он используется для загрузки файлов, поэтому ваш код должен быть:
источник