Python请求:如何在正文中输入字符串?

Mat*_*ias 2 python rest http python-requests

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

r = requests.put(url, data = string)
Run Code Online (Sandbox Code Playgroud)

然后我可以在r.request.body这个电话之后看到它None.此外,服务器响应"411 Length Required"错误.

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

有任何想法吗?

PS:我使用的是Python 2.7.3和Python请求1.2.0

aba*_*ert 6

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

首先,r = requests.put(url, data = string)返回Response,其中没有一个body,但它确实有一个requesthistory0以上的请求重定向,所有这一切都是PreparedRequest对象,它确实有body属性.

另一方面,如果你这样做r.requests.Request(method='PUT', url=url, data=string),那将返回一个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'
Run Code Online (Sandbox Code Playgroud)

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

如果重定向和历史的快速入门教程没有帮助,请阅读详细的API文档,或者只是与他们的实验,直到你看着办吧.

或者这样做:

resp = request.put('http://localhost/nosuchurl', data='abc', allow_redirects=False)
Run Code Online (Sandbox Code Playgroud)

然后手动执行重定向处理.