【问题标题】:Issue with post request using requests Python lib and dict of dicts使用请求 Python lib 和 dict 的 dict 发布请求的问题
【发布时间】:2012-09-28 03:42:00
【问题描述】:

我是 Python 新手,我需要构建一个 Python 库来连接到我们的 API 服务发送一些 json 数据,一切正常,但有一件事,我需要发送一些执行 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,因为我们有其他语言的库,而且工作正常。

【问题讨论】:

  • 这是使用 urllib2 的 python 2.x 吗?您不必在收到回复之前发送请求吗?此外,您可能希望确保包含内容类型标头。也许:req.add_header('Content-Type', 'application/json')
  • 当您添加“.json”时,API 检测到它必须回答 json 中的请求,而且我还有其他可以正常工作的发布请求功能,请求的问题是当我使用字典的字典。 API 也回答错误。我发送的数据不是连接问题。
  • 您是否考虑过使用诸如github.com/VoiceBunny/python-carrot 之类的库?
  • Korylprince 那是我正在扩展的库 :)

标签: python json simplejson python-requests


【解决方案1】:

很难猜测,如果没有关于您的 http 客户端和服务器 API 的更多详细信息,出了什么问题。我的第一次尝试调试是获取wireshark 并检查您生成的请求是否与其他客户端的实现生成的请求相同,并回答以下问题:

  • 有些标题不同吗?
  • Content-Length 和 Content-Type 指定正确吗?
  • 身份验证是否成功,或者缺少标题的响应是否非常通用?

【讨论】:

  • 正如我之前告诉蒙库特的那样,问题不在于连接,而在于我发送的数据,我已将请求用于其他请求并且它工作正常,就像在这种情况下:@987654324 @ 我尝试连接的 API 是 VoiceBunny API voicebunny.com/developers/projects/addSpeedy
  • 好吧,即便如此,我还是会通过比较最终传输的数据开始调试。您是否已经查看了请求的简单正文并检查了它是否是有效的 json?也许您的数据周围缺少一些括号?您的 API 是否可能只理解字段名的特定引用," 而不是 ',并且 simplejson 会使用错误的引用?观察实际的网络流量会立即向您显示这些细微的差异。
  • 谢谢!在将脚本参数作为 str 发送之前,我尝试了另一种方法,但我在 json str 中使用了“not”,它起作用了!script = '{"part001": "HI", "part002": "WORLD", "part003": "LOL"}'
  • 另外需要指出的是,在我调试了 API 在请求中接收到的内容后,数据丢失了。我不知道为什么,因为我使用的是请求文档的建议方法。
  • 我刚刚快速浏览了json specification。它只提到了"这种引号,所以如果你的服务器不理解其他的也没关系,但是丢失数据确实很奇怪。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多