Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I read a response from Python Requests?

I have two Python scripts. One uses the Urllib2 library and one uses the Requests library.

I have found Requests easier to implement, but I can't find an equivalent for urlib2's read() function. For example:

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

Once I have built up my post url, data = response.read() gives me the content - I am trying to connect to a vcloud director api instance and the response shows the endpoints that I have access to. However if I use the Requests library as follows.....

....  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"  .... 

....the print post_call.text and print post_call.content returns nothing, even though the status code equals 200 in the requests post call.

Why isn't my response from Requests returning any text or content?

like image 537
Oli Avatar asked Sep 15 '13 09:09

Oli


2 Answers

Requests doesn't have an equivalent to Urlib2's 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 

It looks like the POST request you are making is returning no content. Which is often the case with a POST request. Perhaps it set a cookie? The status code is telling you that the POST succeeded after all.

Edit for Python 3:

Python now handles data types differently. response.content returns a sequence of bytes (integers that represent ASCII) while response.text is a string (sequence of chars).

Thus,

>>> print response.content == response.text False  >>> print str(response.content) == response.text True 
like image 90
aychedee Avatar answered Oct 01 '22 05:10

aychedee


If the response is in json you could do something like (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]) 

To see everything in the response you can use .__dict__:

print(response.__dict__) 
like image 39
Jortega Avatar answered Oct 01 '22 05:10

Jortega