Проблема с почтовым запросом с использованием запросов Python lib и dict of dicts

Я новичок в Python, и мне нужно создать библиотеку Python, которая подключается к нашей службе API, отправляя некоторые данные json, все работает нормально, но одна вещь: мне нужно отправить несколько dict dicts, выполняющих POST-запрос:

    def create_project(self, project):
        print project
        params = simplejson.dumps(project)
        print params
        req = requests.post(self.url+'/projects/addSpeedy.json',
            data=params, 
            auth=HTTPBasicAuth(self.api_id, self.api_key),verify=False)
        data = simplejson.loads(req.text)
        return data

параметр проекта, который я передаю этой функции, содержит следующую структуру:

    script = {
        'part001': 'HI',
        'part002': 'WORLD'
    }
    project = {
        'title': 'Project posted from Python Carrot',
        'script': script,
        'remarks': "I want the voice be similar to Bugs Bunny.",
        'test': '1'
    }

Однако при выполнении запроса API сообщает мне, что требуемое поле «заголовок» отсутствует, однако при печати данных в функции все выглядит нормально, кодировку dict json я видел на сайте запросов для этих случаев: http://docs.python-requests.org/en/latest/user/quickstart/#more-complicated-post-requests

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


person Jorge Luis Vargas    schedule 28.09.2012    source источник
comment
этот python 2.x использует urllib2? Разве вам не нужно отправлять запрос, прежде чем вы получите ответ? Кроме того, вы, вероятно, захотите убедиться, что вы включили заголовок типа контента. Возможно: req.add_header('Content-Type', 'application/json')   -  person monkut    schedule 28.09.2012
comment
когда вы добавляете «.json», API обнаруживает, что он должен ответить на запрос в формате json, также у меня есть другие функции почтового запроса, которые работают нормально, проблема с запросом заключается в том, что я использую dict dicts. Также API отвечает с ошибкой. Это не проблема подключения, это данные, которые я отправляю.   -  person Jorge Luis Vargas    schedule 28.09.2012
comment
Рассматривали ли вы возможность использования такой библиотеки, как github.com/VoiceBunny/python-carrot?   -  person korylprince    schedule 28.09.2012
comment
Korylprince, это библиотека, которую я расширяю :)   -  person Jorge Luis Vargas    schedule 28.09.2012


Ответы (1)


Трудно догадаться, что происходит, без дополнительных подробностей о вашем http-клиенте и серверном API. Моей первой попыткой отладки будет захватить wireshark и проверить, идентичны ли ваши сгенерированные запросы запросам, сгенерированным с помощью реализации ваших других клиентов со следующими вопросами, чтобы ответить:

  • Некоторые заголовки отличаются?
  • Content-Length и Content-Type указаны правильно?
  • Аутентификация прошла успешно или ответ с отсутствующим заголовком используется довольно часто?
person Michael    schedule 28.09.2012
comment
Как я уже говорил монкуту, проблема не в соединении, а в данных, которые я отправляю, я использовал запросы для других запросов, и это работает правильно, как в этом случае: def quote(self, params): req = requests.post(self.url+'/projects/quote.json', params, auth=HTTPBasicAuth(self.api_id, self.api_key),verify=False) data = simplejson.loads(req.text) return data API, который я пытаюсь подключить, API VoiceBunny voicebunny.com/developers/projects/addSpeedy - person Jorge Luis Vargas; 28.09.2012
comment
Ну я бы и тогда начал отладку со сравнения окончательно переданных данных. Вы уже посмотрели на простое тело вашего запроса и проверили, что это допустимый json? Может быть, какие-то скобки вокруг ваших данных отсутствуют? Возможно, ваш API понимает только определенные кавычки имен полей вместо ', а simplejson будет использовать неправильный? Наблюдение за фактическим сетевым трафиком мгновенно покажет вам любые из этих небольших различий. - person Michael; 28.09.2012
comment
Спасибо! Я попробовал другой подход перед отправкой аргумента скрипта в виде строки, но я использовал «не в моей строке json, это сработало!» script = '{"part001": "HI", "part002": "WORLD", "part003": "LOL"}' - person Jorge Luis Vargas; 28.09.2012
comment
Еще одна вещь, на которую следует обратить внимание, это то, что данные были потеряны после того, как я отладил то, что API получал в запросе. Я понятия не имею, почему, так как я использовал предложенный подход запроса doc. - person Jorge Luis Vargas; 28.09.2012
comment
Я только что просмотрел спецификацию json. В нем упоминаются только такие кавычки ", так что это нормально, если ваш сервер не понимает другие, но потеря данных действительно странная вещь. - person Michael; 28.09.2012