使用Python向RESTful API发出请求

我有一个RESTful API,我在EC2实例上使用Elasticsearch的实现公开了它,以索引内容语料库。我可以通过在我的终端(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/requestspython/urllib2(不确定哪一个去-一直在使用urllib2,但听说请求更好…)?我是否作为头文件传递?

724128 次浏览

使用请求:

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.textresponse.json()(或者可能先检查response.status_code)。请参阅快速入门文档在这里,特别是本节

使用请求json可以简化。

  1. 调用API
  2. 假设API返回一个JSON,将JSON对象解析为一个 Python dict使用json.loads函数
  3. 循环字典以提取信息。

请求模块提供了有用的函数来循环成功和失败。

if(Response.ok):将帮助您确定API调用是否成功(响应代码- 200)

Response.raise_for_status()将帮助你获取从API返回的http代码。

下面是进行此类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调用中进行。您可以通过使用这两个请求来实现这一点。

原始的请求

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

下面是用python-执行其余api的程序

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)