Tengo dos scripts de Python. Uno usa la biblioteca Urllib2 y el otro usa la biblioteca Requests .
He encontrado que las solicitudes son más fáciles de implementar, pero no puedo encontrar un equivalente para la read()
función de urlib2 . Por ejemplo:
...
response = url.urlopen(req)
print response.geturl()
print response.getcode()
data = response.read()
print data
Una vez que he creado mi URL de publicación, data = response.read()
me proporciona el contenido: estoy tratando de conectarme a una instancia de la API de vcloud director y la respuesta muestra los puntos finales a los que tengo acceso. Sin embargo, si uso la biblioteca de solicitudes de la siguiente manera ...
....
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
y print post_call.content
no devuelve nada, aunque el código de estado sea igual a 200 en las solicitudes posteriores a la llamada.
¿Por qué mi respuesta de Solicitudes no devuelve ningún texto o contenido?
post_call.headers
Respuestas:
Las solicitudes no tienen un equivalente a las de 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
Parece que la solicitud POST que está realizando no devuelve contenido. Que suele ser el caso de una solicitud POST. ¿Quizás puso una galleta? El código de estado le dice que el POST se realizó correctamente después de todo.
fuente
response.content
es unaBytes
instancia, y loresponse.text
esstr
, por lo que ya no compararán iguales directamente (pero la decodificaciónresponse.content
con la codificación correcta debería regresar)response.text
Si la respuesta está en json, podría hacer algo como (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])
Para ver todo en la respuesta, puede usar
.__dict__
:fuente
Si envía, por ejemplo, una imagen a alguna API y desea que la dirección de resultado (respuesta) vuelva, puede hacer:
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)
fuente