requests - web apis python
Hacer una solicitud a una API RESTful usando python (4)
A continuación se muestra el programa para ejecutar el resto api en python-
import requests
url = ''https://url''
data = ''{ "platform": { "login": { "userName": "name", "password": "pwd" } } }''
response = requests.post(url, data=data,headers={"Content-Type": "application/json"})
print(response)
sid=response.json()[''platform''][''login''][''sessionId''] //to extract the detail from response
print(response.text)
print(sid)
Tengo una API RESTful que expuse al usar una implementación de Elasticsearch en una instancia de EC2 para indexar un corpus de contenido. Puedo consultar la búsqueda ejecutando lo siguiente desde mi terminal (MacOSX):
curl -XGET ''http://ES_search_demo.com/document/record/_search?pretty=true'' -d ''{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}''
¿Cómo puedo convertir lo anterior en una solicitud API usando python/requests
o python/urllib2
(no estoy seguro de cuál buscar, he estado usando urllib2, pero sé que las solicitudes son mejores ...)? ¿Paso como un encabezado o de otra manera?
Entonces, si desea pasar datos en el cuerpo de una solicitud GET, sería mejor hacerlo en una llamada POST. Puedes lograr esto usando ambas Solicitudes.
Solicitud sin procesar
GET http://ES_search_demo.com/document/record/_search?pretty=true HTTP/1.1
Host: ES_search_demo.com
Content-Length: 183
User-Agent: python-requests/2.9.0
Connection: keep-alive
Accept: */*
Accept-Encoding: gzip, deflate
{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}
Ejemplo de llamada con solicitudes
import requests
def consumeGETRequestSync():
data = ''{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}''
url = ''http://ES_search_demo.com/document/record/_search?pretty=true''
headers = {"Accept": "application/json"}
# call get service with headers and params
response = requests.get(url,data = data)
print "code:"+ str(response.status_code)
print "******************"
print "headers:"+ str(response.headers)
print "******************"
print "content:"+ str(response.text)
consumeGETRequestSync()
Puede ver más llamadas usando solicitudes en [ http://stackandqueue.com/?p=75]
Usando requests :
import requests
url = ''http://ES_search_demo.com/document/record/_search?pretty=true''
data = ''''''{
"query": {
"bool": {
"must": [
{
"text": {
"record.document": "SOME_JOURNAL"
}
},
{
"text": {
"record.articleTitle": "farmers"
}
}
],
"must_not": [],
"should": []
}
},
"from": 0,
"size": 50,
"sort": [],
"facets": {}
}''''''
response = requests.post(url, data=data)
Dependiendo del tipo de respuesta que devuelva su API, probablemente quiera consultar response.text
o response.json()
(o posiblemente inspeccionar response.status_code
primero). Vea los documentos de inicio rápido here , especialmente esta sección .
Usar las requests y json hace simple.
- Llamar a la API
- Suponiendo que la API devuelve un JSON, analizar el objeto JSON en un dict de Python utilizando la función
json.loads
- Pasa por el dict para extraer información.
requests módulo de requests proporciona una función útil para repetir el éxito y el fracaso.
if(Response.ok)
: lo ayudará a determinar si su llamada API fue exitosa (Código de respuesta - 200)
Response.raise_for_status()
te ayudará a buscar el código http que se devuelve desde la API.
A continuación se muestra un código de muestra para hacer tales llamadas API. También se puede encontrar en github . El código supone que la API hace uso de autenticación resumida. Puede omitir esto o utilizar otros módulos de autenticación adecuados para autenticar al cliente que invoca la API.
#Python 2.7.6
#RestfulClient.py
import requests
from requests.auth import HTTPDigestAuth
import json
# Replace with the correct URL
url = "http://api_url"
# It is a good practice not to hardcode the credentials. So ask the user to enter credentials at runtime
myResponse = requests.get(url,auth=HTTPDigestAuth(raw_input("username: "), raw_input("Password: ")), verify=True)
#print (myResponse.status_code)
# For successful API call, response code will be 200 (OK)
if(myResponse.ok):
# Loading the response data into a dict variable
# json.loads takes in only binary or string variables so using content to fetch binary content
# Loads (Load String) takes a Json file and converts into python data structure (dict or list, depending on JSON)
jData = json.loads(myResponse.content)
print("The response contains {0} properties".format(len(jData)))
print("/n")
for key in jData:
print key + " : " + jData[key]
else:
# If response code is not ok (200), print the resulting http error code with description
myResponse.raise_for_status()