Создание запроса к RESTful API с помощью python
У меня есть RESTful API, который я представил с помощью реализации Elasticsearch на экземпляре EC2 для индексирования корпуса контента. Я могу запросить поиск, запустив следующее из моего терминала (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": {}
}'
Как включить в запрос API с помощью python/requests
или python/urllib2
(не уверен, какой из них идти - были с помощью urllib2, но услышать, что запросы лучше...)? Я передаю как заголовок или иначе?
4 ответа:
используя запросы:
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)
в зависимости от того, какой ответ возвращает ваш API, вы, вероятно, захотите посмотреть на
response.text
илиresponse.json()
(или, возможно, проверитьresponse.status_code
первая). См. В разделе краткое руководство документы здесь, особенно в этом разделе.
используя запросы и json делает его простым.
- вызовите API
- предполагая, что API возвращает JSON, проанализируйте объект JSON в a Python dict с помощью
json.loads
функции- цикл через дикт для извлечения информации.
запросы модуль предоставляет вам полезную функцию для цикла для успеха и неудачи.
if(Response.ok)
: поможет вам определить, если ваш вызов API успешно (код ответа - 200)
Response.raise_for_status()
поможет вам получить код http, который возвращается из API.Ниже приведен пример кода для выполнения таких вызовов API. Также можно найти в github. Код предполагает, что API использует дайджест-проверку подлинности. Вы можете пропустить это или использовать другие соответствующие модули проверки подлинности для проверки подлинности клиента, вызывающего 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()
таким образом, вы хотите передать данные в теле запроса GET, лучше было бы сделать это в POST call. Вы можете достичь этого, используя оба запроса.
Raw Запрос
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": {} }
пример вызова с запросами
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()
Ниже приведена программа для выполнения REST api в 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)