266 votes

Effectuer une requête vers une API RESTful à l'aide de Python

J'ai une API RESTful que j'ai exposée en utilisant une implémentation d'Elasticsearch sur une instance EC2 pour indexer un corpus de contenu. Je peux interroger la recherche en exécutant la commande suivante depuis mon 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": {}
}'

Comment puis-je transformer ce qui précède en une demande d'API à l'aide de python/requests o python/urllib2 (je ne suis pas sûr du choix à faire - j'ai utilisé urllib2, mais j'ai entendu dire que requests était meilleur...) ? Dois-je le passer en en-tête ou autrement ?

377voto

andersschuller Points 2282

Utilisation de demande :

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)

En fonction du type de réponse que votre API renvoie, vous voudrez probablement examiner les éléments suivants response.text o response.json() (ou éventuellement inspecter response.status_code d'abord). Voir les documents de démarrage rapide ici notamment cet article .

115voto

vs1984 Points 100

Utilisation de demande y json rend les choses simples.

  1. Appeler l'API
  2. En supposant que l'API renvoie un JSON, analysez l'objet JSON dans un fichier dict Python en utilisant json.loads fonction
  3. Bouclez à travers le dict pour extraire l'information.

Demandes vous fournit une fonction utile pour boucler les succès et les échecs.

if(Response.ok) : vous aidera à déterminer si votre appel API est réussi (code de réponse - 200)

Response.raise_for_status() vous aidera à récupérer le code http qui est renvoyé par l'API.

Vous trouverez ci-dessous un exemple de code permettant d'effectuer de tels appels API. Vous pouvez également le trouver dans github . Le code suppose que l'API utilise l'authentification digest. Vous pouvez ignorer cette hypothèse ou utiliser d'autres modules d'authentification appropriés pour authentifier le client qui invoque 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()

12voto

gvir Points 240

Vous voulez donc transmettre des données dans le corps d'une requête GET, le mieux serait de le faire dans un appel POST. Vous pouvez y parvenir en utilisant les deux requêtes.

Demande brute

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

Exemple d'appel avec des requêtes

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

10voto

Shashank G Points 393

Voici le programme pour exécuter le rest 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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X