with requests example consumir apis python api rest elasticsearch

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.

  1. Llamar a la API
  2. Suponiendo que la API devuelve un JSON, analizar el objeto JSON en un dict de Python utilizando la función json.loads
  3. 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()