Как отправить JSON-данные с помощью Python Requests?
Я столкнулся с проблемой при отправке JSON с клиента на сервер. Я использую Python 2.7.1 и библиотеку simplejson. Клиент использует библиотеку Requests, а сервер работает на 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 # это работает
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())
Не знаете, в чем может быть проблема?
5 ответ(ов)
Похоже, я пропустил информацию заголовка. Вот рабочий пример:
import requests
import json
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)
Убедитесь, что вы импортировали библиотеку json
, чтобы успешно сериализовать данные в формате JSON перед отправкой.
С версии requests 2.4.2 (https://pypi.python.org/pypi/requests) поддерживается параметр "json". Теперь нет необходимости указывать "Content-Type". Таким образом, можно использовать более короткую запись:
requests.post('http://httpbin.org/post', json={'test': 'cheers'})
Лучший способ сделать это — использовать библиотеку requests
для отправки POST-запроса с JSON-данными. Вот пример кода:
import requests
url = "http://xxx.xxxx.xx"
data = {
"cardno": "6248889874650987",
"systemIdentify": "s08",
"sourceChannel": 12
}
resp = requests.post(url, json=data)
В этом примере мы определяем URL, по которому будет отправлен запрос, и создаем словарь data
, содержащий нужные параметры. Затем мы используем метод post
из библиотеки requests
, указывая в качестве тела запроса параметр json
, что автоматически преобразует словарь в JSON-формат.
Чтобы отправить POST-запрос с данными в формате JSON на указанный URL с указанными заголовками, вы можете использовать следующий код на Python с библиотекой requests
. Обратите внимание, что вам нужно заменить PORT_NUM
на номер используемого порта и YOUR_JSON_DATA
на ваши данные JSON.
import requests
# Указываем заголовки, включая кодировку и тип контента
headers = {"charset": "utf-8", "Content-Type": "application/json"}
url = 'http://localhost:PORT_NUM/FILE.php' # Замените PORT_NUM на номер порта
# Отправляем POST-запрос с данными в формате JSON
r = requests.post(url, json=YOUR_JSON_DATA, headers=headers)
# Печатаем ответ сервера
print(r.text)
Убедитесь, что вы импортировали библиотеку requests
. В случае, если эта библиотека не установлена, вы можете установить её с помощью команды:
pip install requests
Таким образом, вы отправите данные на сервер, и полученный ответ будет напечатан в консоли.
Ваш код отлично работает с Python 3.5+. Чтобы получить его работоспособность, вы можете использовать следующий пример для клиента и сервера.
Клиент:
import requests
data = {
'sender': 'Alice',
'receiver': 'Bob',
'message': 'We did it!'
}
r = requests.post("http://localhost:8080", json={'json_payload': data})
print(r.json()) # Выводит ответ от сервера
В данном примере мы отправляем POST-запрос на сервер с указанием JSON-данных.
Сервер:
import cherrypy
import simplejson
class Root(object):
def __init__(self, content):
self.content = content
print(self.content) # Это работает
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'}
if __name__ == '__main__':
cherrypy.quickstart(Root({'status': 'initial'}), '/')
В этом коде сервер использует CherryPy для обработки HTTP-запросов. Метод POST
принимает JSON-данные, которые были отправлены клиентом, и обновляет состояние внутренней переменной content
. Ответ включает статус выполнения операции.
Также убедитесь, что у вас установлены необходимые библиотеки (requests
, cherrypy
и simplejson
), и что сервер запущен на localhost:8080
, чтобы клиент мог его достать. Если у вас возникли вопросы или нужны дальнейшие разъяснения, не стесняйтесь обращаться!
Как обойти "datetime.datetime не сериализуем в JSON"?
Почему Python не может разобрать эти данные JSON? [закрыто]
Как записать данные JSON в файл?
Как сделать класс сериализуемым в JSON
Как отсортировать список/кортеж списков/кортежей по элементу на заданном индексе