elasticsearch example - Hacer una solicitud a una API RESTful usando python




requests consumir (5)

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]

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?


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()

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 .


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)

Lea https://web.archive.org/web/20090207081238/http://faqts.com/knowledge_base/view.phtml/aid/2609/fid/378 , que puede ayudarlo más:

Intente la función dormir en el módulo de tiempo.

import time
time.sleep(60)

Y ponga esto en un bucle while y una instrucción solo se ejecutará en el minuto ... Eso le permite ejecutar una instrucción en intervalos predefinidos sin importar cuánto demore el comando (siempre que tome menos de un minuto o 5 o 60 minutos). o lo que sea que configures para) Por ejemplo, quería ejecutar un ping una vez por minuto. Si solo time.sleep(60) o time.sleep(45) incluso, el ping no siempre llevará la misma cantidad de tiempo. Aquí está el código :)

time.sleep(time.localtime(time.time())[5])

El [5] simplemente extrae los segundos del valor de retorno de time.localtime() .

Lo bueno de time.sleep es que admite números de punto flotante.

import time
time.sleep(0.1) 

http://python.org/doc/current/lib/module-time.html





python api rest elasticsearch