如何使用 Python 请求库发出 post 请求?

新手上路,请多包涵

我在 Postman 中使用以下过滤器在 Web API 中发出 POST 请求,但我无法在 Python 中使用请求库发出简单的 POST 请求。

首先,我向此 URL ( http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets ) 发送一个 POST 请求,并在 Postman 中将以下过滤器应用于主体,原始和 JSON(application/json) 选项被选中。

 Filters in Postman

{
  "filter": {
    "filters": [
      {
        "field": "RCA_Assigned_Date",
        "operator": "gte",
        "value": "2017-05-31 00:00:00"
      },
      {
        "field": "RCA_Assigned_Date",
        "operator": "lte",
        "value": "2017-06-04 00:00:00"
      },
      {
        "field": "T_Subcategory",
        "operator": "neq",
        "value": "Temporary Degradation"
      },
      {
        "field": "Issue_Status",
        "operator": "neq",
        "value": "Queued"
      }],
     "logic": "and"
    }
}

存储数据的数据库是Cassandra,根据下面的链接 Cassandra not equal operator , Cassandra OR operator , Cassandra Between order by operators , Cassandra 不支持 NOT EQUAL TO , OR , BETWEEN operators ,所以我没办法可以使用除 AND 之外的这些运算符过滤 URL。

其次,我使用以下代码对请求库应用一个简单的过滤器。

 import requests
payload = {'field':'T_Subcategory','operator':'neq','value':'Temporary Degradation'}
url = requests.post("http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets",data=payload)

但我得到的是票的完整数据,而不是那些不是临时降级的票。

第三,系统实际上正在运行,但我们遇到了 2-3 分钟的延迟才能看到数据。逻辑如下: _我们有 8 个用户,我们想查看每个用户的所有不是临时降级的工单,然后我们这样做_:

 def get_json():
    if user_name == "user 001":
        with urllib.request.urlopen(
    "http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets?user_name=user&001",timeout=15) as url:
            complete_data = json.loads(url.read().decode())

    elif user_name == "user 002":
        with urllib.request.urlopen(
    "http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets?user_name=user&002",timeout=15) as url:
            complete_data = json.loads(url.read().decode())
    return complete_data

def get_tickets_not_temp_degradation(start_date,end_date,complete_):
    return Counter([k['user_name'] for k in complete_data if start_date < dateutil.parser.parse(k.get('DateTime')) < end_date and k['T_subcategory'] != 'Temporary Degradation'])

基本上,我们得到了当前和去年的整套票,然后我们让 Python 按用户过滤整套票,到目前为止只有 10 个用户,这意味着这个过程重复了 10 次,这让我感到惊讶发现为什么我们会延迟……

我的问题是如何解决请求库的这个问题?我正在使用以下链接 Requests library documentation 作为教程来使其正常工作,但似乎我的有效负载没有被读取。

原文由 abautista 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 400
2 个回答

您的 Postman 请求是一个 JSON 正文。只需在 Python 中重现相同的主体。您的 Python 代码没有发送 JSON,也没有发送与您的 Postman 示例相同的数据。

对于初学者,通过 data 参数发送字典会将字典编码为 application/x-www-form-urlencoded 形式,而不是 JSON。其次,您似乎正在发送一个过滤器。

以下代码完全复制了您的 Postman 帖子:

 import requests

filters = {"filter": {
    "filters": [{
        "field": "RCA_Assigned_Date",
        "operator": "gte",
        "value": "2017-05-31 00:00:00"
    }, {
        "field": "RCA_Assigned_Date",
        "operator": "lte",
        "value": "2017-06-04 00:00:00"
    }, {
        "field": "T_Subcategory",
        "operator": "neq",
        "value": "Temporary Degradation"
    }, {
        "field": "Issue_Status",
        "operator": "neq",
        "value": "Queued"
    }],
    "logic": "and"
}}

url = "http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets"
response = requests.post(url, json=filters)

请注意, filters 是一个 Python 数据结构,它被传递给 json 关键字参数。使用后者做两件事:

  • 将 Python 数据结构编码为 JSON(生成与原始 Postman 正文值完全相同的 JSON 值)。
  • Set the Content-Type header to application/json (as you did in your Postman configuration by picking the JSON option in the dropdown menu after picking raw 对于身体)。

requests 否则 只是一个 HTTP API ,它不能让 Cassandra 比任何其他 HTTP 库做更多的事情。 urllib.request.urlopen 代码发送 GET 请求,并简单地翻译成 requests

 def get_json():
    url = "http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets"
    response = requests.get(url, params={'user_name': user}, timeout=15)
    return response.json()

我删除了 if 分支并将其替换为使用 params 参数,它将键值对字典转换为正确编码的 URL 查询(将用户名作为 user_name 键)。

注意响应中的 json() 调用;这负责解码从服务器返回的 JSON 数据。这仍然需要很长时间,您在这里没有太多过滤 Cassandra 数据。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

我建议使用 json 属性而不是数据。它为您处理倾销。

 import requests

data = {'user_name':'user&001'}
headers = {'Content-Type': 'application/json', 'Accept': 'application/json'}
url = "http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets/"
r = requests.post(url, headers=headers, json=data)

更新,回答问题 3。您使用 urllib 有什么原因吗?对于此请求,我也会使用 python 请求。

 import requests

def get_json():
    r = requests.get("http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets”, params={"user_name": user_name.replace(" ", "&")})

    return r.json

# not sure what you’re doing here, more context/code example would help
def get_tickets_not_temp_degradation(start_date, end_date, complete_):
    return Counter([k['user_name'] for k in complete_data if start_date < dateutil.parser.parse(k.get('DateTime')) < end_date and k['T_subcategory'] != 'Temporary Degradation'])

另外,用户名真的应该是 user+001 而不是 user&001user 001 吗?

原文由 teewuane 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题