2013-06-25 17 views
109

Mam RESTful API, które ujawniłem za pomocą implementacji Elasticsearch na instancji EC2 w celu indeksowania korpusu treści. Mogę kwerendy wyszukiwania poprzez prowadzenie następujących od mojego terminala (MacOSX):Wysyłanie żądania do RESTful API przy użyciu pythona

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

Jak włączyć powyższe na żądanie API z wykorzystaniem python/requests lub python/urllib2 (nie wiem, który z nich, aby przejść do - zostały przy użyciu urllib2, ale usłyszeć, że prośby są lepsze ...)? Czy przekazuję jako nagłówek lub w inny sposób?

Odpowiedz

179

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

zależności od rodzaju reakcji Twoich zwrotów API, będzie to prawdopodobnie chcesz spojrzeć na response.text lub response.json() (ewentualnie skontrolować response.status_code pierwszy). Zobacz dokument Szybki start here, zwłaszcza this section.

+3

Myślę, że powinno być: response = requests.post (url, data = data) –

+4

"requests.get" nie przyjmuje parametru "data".Może to wymagać opcjonalnego parametru "params", który zwykle jest łańcuchem znaków zapytania. Jeśli ładunek jest niezbędny do pobrania danych (takich jak przykład zamieszczony w pytaniu), należy użyć "requests.post". Dodatkowo użycie biblioteki "json" ułatwia analizę odpowiedzi jsona. – HVS

+2

Czy działa z pythonem 3? –

55

Korzystanie z requests i jest proste.

  1. połączeń API
  2. Zakładając API zwraca JSON, analizowania obiekt JSON w Pythonie przy użyciu dict json.loads funkcja
  3. Loop przez dict wydobyć informacje. Moduł

Requests zapewnia użyteczną funkcję do zapętlenia sukcesu i niepowodzenia.

if(Response.ok): pomoże pomoże Ci określić, czy wywołanie API jest udany (kod Response - 200)

Response.raise_for_status() pomoże Ci pobrać kod HTTP, który jest zwracany z API.

Poniżej znajduje się przykładowy kod do wykonywania takich wywołań API. Można go również znaleźć pod adresem github. Kod zakłada, że ​​interfejs API korzysta z uwierzytelniania skrótu. Można to pominąć lub użyć innych odpowiednich modułów uwierzytelniania w celu uwierzytelnienia klienta wywołującego interfejs 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() 
+1

Last część z iteracją kluczy nie zawsze działa, ponieważ dokument JSON może mieć tablicę jako element najwyższego poziomu. Tak więc byłoby błędem próbować uzyskać 'jData [klucz]' –

+0

@DenisTheMenace, jeśli jest to tablica, w jaki sposób mógłbym ją obejść? – qasimalbaqali

+0

@qasimalbaqali w ten sam sposób, w jaki przeglądasz słownik. Ale elementy tablicy będą po prostu 'jData', a nie' jData [klucz] ' –

8

Więc chcesz przekazać dane w ciele żądania GET, lepiej byłoby to zrobić w wywołanie POST. Możesz to osiągnąć, używając obu wniosków.

Raw Zapytanie

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

wezwanie Próbka wniosków

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

Możesz sprawdzić więcej połączeń z wykorzystaniem wniosków w [http://stackandqueue.com/?p=75]

+0

dostał tam martwy link – user3157940

0

Poniżej jest program do wykonania API odpoczynek w 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) 
Powiązane problemy