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

标签 python json django python-3.x cassandra

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

首先,我向此 URL ( http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets) 发送一个 POST 请求,将 Postman 中的以下过滤器应用到 Body,并选择了原始和 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 TOORBETWEEN 运算符,因此我无法使用这些运算符过滤 URL,除了与 AND

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

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作为使它工作的教程,但似乎我的有效负载没有被读取。

最佳答案

您的 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 值)。
  • Content-Type header 设置为 application/json(就像您在 Postman 配置中所做的那样,通过在下拉列表中选择 JSON 选项为正文选择 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 数据。

关于python - 如何使用 Python 请求库发出 post 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45201628/

相关文章:

python - 具有边缘畸变和 1 个缺失角的方形检测

python - for循环中的可变步骤

python - Replace() 方法在函数内不起作用

javascript - 在 d3 中堆叠一个矩阵而不重新映射到 json

c# - 如果 DateTime 为 NULL,则无法获取 JSON 响应

javascript - 获取本地 JSON

django - 无法快速上传嵌套的多部分表单数据

mysql - 如何使用 gitlab CI/CD 设置与 MySql 数据库的连接

python - Django-CKEditor 图片上传

python - 是否有 Eclipse 插件可以构建用于分发的 python 可执行文件?