web-dev-qa-db-de.com

Anforderung an eine RESTful-API mit python

Ich habe eine RESTful-API, die ich mithilfe einer Implementierung von Elasticsearch auf einer EC2-Instanz zur Indizierung eines Inhaltskorpus bereitgestellt habe. Ich kann die Suche abfragen, indem ich auf meinem Terminal (MacOSX) Folgendes ausführe:

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

Wie verwandle ich mich mit python/requests oder python/urllib2 in eine API-Anfrage? Übergebe ich als Header oder auf andere Weise?

186
user7289

Mit Anfragen :

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)

Abhängig von der Art der Antwort, die Ihre API zurückgibt, möchten Sie sich wahrscheinlich zuerst response.text oder response.json() (oder möglicherweise response.status_code) ansehen. Siehe die Schnellstart-Dokumentation hier , insbesondere dieser Abschnitt .

291
andersschuller

Die Verwendung von Anfragen und json macht es einfach.

  1. Rufen Sie die API auf
  2. Angenommen, die API gibt eine JSON zurück, dann analysieren Sie das JSON-Objekt mit der Funktion json.loads in ein Python -Dict
  3. Durchlaufen Sie das Diktat, um Informationen zu extrahieren.

Requests Modul bietet eine nützliche Funktion, um über Erfolg und Misserfolg zu entscheiden.

if(Response.ok): Hilft Ihnen festzustellen, ob Ihr API-Aufruf erfolgreich war (Antwortcode - 200)

Response.raise_for_status() hilft Ihnen dabei, den von der API zurückgegebenen http-Code abzurufen.

Unten finden Sie einen Beispielcode für das Ausführen solcher API-Aufrufe. Kann in github auch gefunden werden. Der Code setzt voraus, dass die API die Digest-Authentifizierung verwendet. Sie können dies entweder überspringen oder andere geeignete Authentifizierungsmodule verwenden, um den Client zu authentifizieren, der die API aufruft.

#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()
88
HVS

Wenn Sie also Daten im Hauptteil einer GET-Anforderung übergeben möchten, ist es besser, dies im POST -Aufruf zu tun. Sie können dies erreichen, indem Sie beide Requests verwenden.

Rohe Anfrage

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

Beispielanruf mit Anfragen

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

Nachfolgend finden Sie das Programm, mit dem Sie die restliche API in Python ausführen können.

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