如何从Python请求中读取响应?


79

我有两个Python脚本。一种使用Urllib2库,另一种使用Requests库

我发现请求更容易实现,但是找不到urlib2的等效read()函数。例如:

...
response = url.urlopen(req)
print response.geturl()
print response.getcode()
data = response.read()
print data

建立完发布网址后,请data = response.read()给我内容-我正尝试连接到vcloud Director api实例,并且响应显示了我有权访问的端点。但是,如果我按以下方式使用请求库:.....

....

def post_call(username, org, password, key, secret):

    endpoint = '<URL ENDPOINT>'
    post_url = endpoint + 'sessions'
    get_url = endpoint + 'org'
    headers = {'Accept':'application/*+xml;version=5.1', \
               'Authorization':'Basic  '+ base64.b64encode(username + "@" + org + ":" + password), \
               'x-id-sec':base64.b64encode(key + ":" + secret)}
    print headers
    post_call = requests.post(post_url, data=None, headers = headers)
    print post_call, "POST call"
    print post_call.text, "TEXT"
    print post_call.content, "CONTENT"
    post_call.status_code, "STATUS CODE"

....

.... theprint post_call.text和不print post_call.content返回任何内容,即使请求后调用中的状态代码等于200。

为什么我对请求的响应不返回任何文本或内容?


1
您知道从URL获得的响应类型吗?Json,XML等?您从urllib2得到的响应是什么?
shshank

POST请求可能正在返回重定向响应。检查响应标头:post_call.headers
John Keyes 2013年

Answers:


133

请求不具有与Urlib2等效的请求read()

>>> import requests
>>> response = requests.get("http://www.google.com")
>>> print response.content
'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"><head>....'
>>> print response.content == response.text
True

您发出的POST请求似乎不返回任何内容。POST请求通常是这种情况。也许它设置了一个cookie?状态代码告诉您POST毕竟成功。


3
好,谢谢。也许我在某个地方感到困惑。urllib2向我展示了内容,因此我需要了解我做错了什么以及两个库之间的不同调用。
奥利(Oli)2013年

在某个终结点上,我想读取请求,但是无法使用request.get(“ url”)。而且,它花费了不合理的时间来执行。不提供任何参数也会引发错误,指出需要1个参数。
Eswar

检查响应代码。您可能会收到超时,而不是2XX的响应。那可以解释为什么还要花这么长时间。
Aychedee'1

完美的解决方案。你节省了我的时间。谢谢
Soham Navadiya

1
在Python 3中,response.content是一个Bytes实例,并且response.textstr,因此它们将不再直接比较等于(但response.content应返回使用正确编码的解码response.text
snakecharmerb,

23

如果响应位于json中,则可以执行类似(python3)的操作:

import json
import requests as reqs

# Make the HTTP request.
response = reqs.get('http://demo.ckan.org/api/3/action/group_list')

# Use the json module to load CKAN's response into a dictionary.
response_dict = json.loads(response.text)

for i in response_dict:
    print("key: ", i, "val: ", response_dict[i])

要查看响应中的所有内容,您可以使用.__dict__

print(response.__dict__)

1

如果将示例图像推送到某个API并想要返回结果地址(响应),则可以执行以下操作:

import requests
url = 'https://uguu.se/api.php?d=upload-tool'
data = {"name": filename}
files = {'file': open(full_file_path, 'rb')}
response = requests.post(url, data=data, files=files)
current_url = response.text
print(response.text)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.