it-swarm.dev

Effettuare una richiesta a un'API RESTful usando python

Ho un'API RESTful che ho esposto utilizzando un'implementazione di Elasticsearch su un'istanza EC2 per indicizzare un corpus di contenuti. Posso interrogare la ricerca eseguendo quanto segue dal mio terminale (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": {}
}'

Come faccio a girare sopra in una richiesta API usando python/requests o python/urllib2 (non sono sicuro di quale scegliere - ho usato urllib2, ma sento che le richieste sono migliori ...)? Passo come testata o altrimenti?

166
user7289

Usando richieste :

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)

A seconda del tipo di risposta restituita dall'API, sarà probabilmente necessario esaminare response.text o response.json() (o eventualmente esaminare response.status_code prima). Vedi i documenti quickstart here , specialmente questa sezione .

264
andersschuller

Usare request e json lo rende semplice.

  1. Chiama l'API
  2. Supponendo che l'API restituisca un JSON, analizza l'oggetto JSON in un dict Python utilizzando la funzione json.loads
  3. Passa attraverso il dict per estrarre le informazioni.

Requests module fornisce una funzione utile per il loop per il successo e l'insuccesso.

if(Response.ok): ti aiuterà a determinare se la tua chiamata API ha successo (codice di risposta - 200)

Response.raise_for_status() ti aiuterà a recuperare il codice http che viene restituito dall'API.

Di seguito è riportato un codice di esempio per effettuare tali chiamate API. Inoltre può essere trovato in github . Il codice presuppone che l'API faccia uso dell'autenticazione digest. È possibile saltare questo o utilizzare altri moduli di autenticazione appropriati per autenticare il client che richiama l'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()
80
HVS

Quindi vuoi passare i dati nel corpo di una richiesta GET, meglio sarebbe farlo in POST call. È possibile ottenere questo utilizzando entrambe le richieste.

Richiesta grezza

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": {}
}

Esempio di chiamata con richieste

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

Di seguito è il programma per eseguire il resto api in 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)
6
Shashank G