11

Как отправить JSON-данные с помощью Python Requests?

11

Я столкнулся с проблемой при отправке 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 ответ(ов)

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 перед отправкой.

1

С версии requests 2.4.2 (https://pypi.python.org/pypi/requests) поддерживается параметр "json". Теперь нет необходимости указывать "Content-Type". Таким образом, можно использовать более короткую запись:

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

Лучший способ сделать это — использовать библиотеку 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-формат.

0

Чтобы отправить 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

Таким образом, вы отправите данные на сервер, и полученный ответ будет напечатан в консоли.

0

Ваш код отлично работает с 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, чтобы клиент мог его достать. Если у вас возникли вопросы или нужны дальнейшие разъяснения, не стесняйтесь обращаться!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь