为了账号安全,请及时绑定邮箱和手机立即绑定

使用python向RESTful API发出请求

/ 猿问

使用python向RESTful API发出请求

慕雪6442864 2019-11-05 14:53:28

我有一个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": {}

}'

如何使用python/requests或python/urllib2(不确定要使用哪一个-一直在使用urllib2,但听说请求更好……)将以上转换为API请求?我是否可以作为标题传递?


查看完整描述

3 回答

?
慕妹3242003

使用请求:


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先检查)。请参阅此处的快速入门文档,尤其是本节。


查看完整回答
反对 2019-11-05
?
饮歌长啸

使用请求和json使其变得简单。


调用API

假设API返回JSON,请使用json.loads函数将JSON对象解析为Python dict

遍历字典以提取信息。

请求模块为您提供有用的功能,以循环执行成功和失败。


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


查看完整回答
反对 2019-11-05
?
胡子哥哥

因此,您想在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()


查看完整回答
反对 2019-11-05

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信