首页 文章

使用python向RESTful API发出请求

提问于
浏览
162

我有一个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/requestspython/urllib2 将上述内容转换为API请求(不确定要使用哪一个 - 已使用urllib2,但听到请求更好......)?我是否以 Headers 或其他方式传递?

4 回答

  • 8

    因此,您希望在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()
    
  • 6

    下面是在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)
    
  • 255

    使用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)
    

    根据您的API返回的响应类型,您可能希望查看 response.textresponse.json() (或者可能首先检查 response.status_code ) . 请参阅快速入门文档here,尤其是this section .

  • 78

    使用requestsjson使其变得简单 .

    • 调用API

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

    • 循环通过dict提取信息 .

    Requests模块为您提供循环成功和失败的有用功能 .

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

相关问题