2

我需要将字符串(无字典)中的数据作为对 REST API 的调用主体。
当我打电话

r = requests.put(url, data = string)

然后我可以在r.request.body这个电话之后看到它是None。此外,服务器响应“411 长度要求”错误。

但是,当我使用 dict 而不是字符串尝试它时,它会起作用,因为服务器会使用正确的 JSON 数据进行响应。此外,在那种情况下,我可以看到r.request.body正确的数据。

有任何想法吗?

PS:我正在使用 Python 2.7.3 和 Python-requests 1.2.0

4

1 回答 1

6

即使经过三次尝试澄清这个问题,仍然不清楚你在这里问什么,但我可以尝试抛出足够的信息,你可以找出答案。

首先,r = requests.put(url, data = string)返回 a Response,它没有 a body,但它确实有 a request,以及history0 个或多个重定向请求的 a ,它们都是PreparedRequest对象,它们确实具有body属性。

另一方面,如果你这样做了r.requests.Request(method='PUT', url=url, data=string),那将返回 a Request,它必须是prepare()d 在它有一个主体之前。

无论哪种方式,如果我做一个简单的测试并查看结果,我发现body总是正确的:

>>> resp = requests.put('http://localhost/nosuchurl', data='abc')
>>> resp.request.body
'abc'
>>> resp = requests.put('http://localhost/redirect_to_https', data='abc')
>>> resp.history[-1].request.body
'abc'
>>> req = requests.Request(method='PUT', url='http://localhost/nosuchurl', data='abc')
>>> preq = req.prepare()
>>> preq.body
'abc'

我最好的猜测是你需要在看resp.history[0].request.body,但你在看resp.request.body,或类似的东西。

如果快速入门教程中的重定向和历史没有帮助,请阅读详细的 API 文档,或者只是尝试所有这些,直到你弄明白为止。

或者这样做:

resp = request.put('http://localhost/nosuchurl', data='abc', allow_redirects=False)

然后手动进行重定向处理。

于 2013-04-25T01:08:39.493 回答