python
  • json
  • http
  • python-requests
  • 2013-04-01 4 views 3 likes 
    3

    Я работаю над оболочкой API. Спецификации Я пытаюсь построить для имеют следующий запрос в нем:Модуль запросов python: urlencoding json data

    curl -H "Content-type:application/json" -X POST -d data='{"name":"Partner13", "email":"[email protected]"}' http://localhost:5000/ 
    

    Этот запрос производит следующий ответ от небольшого теста сервер установки I, чтобы увидеть exatly каких заголовки/Титулы и т.д. посылается как. Этот небольшой скрипт производит:

    uri: http://localhost:5000/, 
    method: POST, 
    api_key: None, 
    content_type: application/json, 
    params: None, 
    data: data={"name":"Partner13", "email":"[email protected]"} 
    

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

    Я использую модуль запросов python, который является самым красивым HTTP-lib, который я когда-либо использовал. Итак, вот мой код-питон:

    uri = "http://localhost:5000/" 
    headers = {'content-type': 'application/json' } 
    params = {} 
    data = {"name":"Partner13", "email":"[email protected]"} 
    params["data"] = json.dumps(data) 
    r = requests.post(uri, data=params, headers=headers) 
    

    Такой простой материал. Установите заголовки и создайте словарь для параметров POST. В этом словаре есть одна запись с именем «data», которая является строкой JSON для данных, которые я хочу отправить на сервер. Затем я называю этот пост. Тем не менее, результат мой маленький тестовый скрипт дает обратно:

    uri: http://localhost:5000/, 
    method: POST, 
    api_key: None, 
    content_type: application/json, 
    params: None, 
    data: data=%7B%22name%22%3A+%22Partner13%22%2C+%22email%22%3A+%22example%40example.com%22%7D 
    

    Так по существу данные JSON я хотел отправить в параметре данных было urlendcoded.

    Кто-нибудь знает, как это исправить? Я просмотрел документацию по запросам и не могу найти способ не автоматически перенаправлять данные отправки.

    Большое спасибо, Кевин

    +0

    Данные из вашего примера скручивания недействительны json. Это сочетание между кодировкой формы и json. –

    ответ

    3

    При создании объекта для ключевого слова данных, просто присвоить переменной результат json.dumps (данные).

    Кроме того, поскольку HTTP POST может принимать как параметры URL-адреса, так и данные в теле запроса, а также потому, что функция request.post имеет аргумент ключевого слова с именем «params», возможно, лучше использовать другую переменную имя для удобочитаемости. В запросах docs используется имя переменной «полезная нагрузка», поэтому я использую это.

    data = {"name":"Partner13", "email":"[email protected]"} 
    payload = json.dumps(data) 
    r = requests.post(uri, data=payload, headers=headers) 
    
    0

    запросы автоматически URL кодирует словари, передаваемые в качестве данных here. Решение John_GG работает, потому что вместо публикации словаря, содержащего закодированную строку JSON в поле данных, он просто передает строчную кодировку JSON: строки не кодируются автоматически. Я не могу сказать, что я понимаю причину такого поведения в запросах, но независимо от того, что это такое. Невозможно отключить это поведение, которое я могу найти.

    Удачи в этом, Кевин.

    +0

    «Здесь» вы имеете в виду параметры кодирования url, которые, поскольку они входят в URL-адрес, конечно, кодируются по URL-адресу. В сигнатуре функции post post, «params» относится к параметрам url, тогда как «данные» относятся к телу POST. –

    +0

    @John_GG На самом деле это также используется для кодирования тела запроса. Стек вызова представляет собой нечто вроде 'Request.init()' -> 'PreparedRequest.prepare()' -> 'PreparedRequest.prepare_body()' -> 'RequestEncodingMixin._encode_params()'. Это, как представляется, автоматически обрабатывать запросы с содержимым 'application/x-www-form-urlencoded'. – augurar

     Смежные вопросы

    • Нет связанных вопросов^_^