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

2024-03-28 21:07:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

首先,我向这个URL(http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets)发送一个POST请求,其中Postman中的以下过滤器应用于主体,并选中raw和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 operatorCassandra OR operatorCassandra Between order by operators,Cassandra不支持之间的不等于、运算符,因此除了使用运算符之外,我无法使用这些运算符筛选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作为一个教程,使其工作,但它只是似乎我的有效载荷没有被读取。


Tags: nameapihttpurlfielddatavalueoperator
3条回答

我认为,您可以使用请求库,如下所示:

import requests
import json

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=json.dumps(payload))

我建议使用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

您的邮递员请求是一个JSON主体。只需在Python中复制相同的主体。Python代码没有发送JSON,也没有发送与Postman示例相同的数据。

首先,通过data参数发送字典会将字典编码为application/x-www-form-urlencoded格式,而不是JSON格式。其次,您似乎发送了一个过滤器。

以下代码完全复制您的邮递员邮件:

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 body值完全相同的JSON值)。
  • Content-Type头设置为application/json(就像在为正文选择raw后,通过在下拉菜单中选择JSON选项在Postman配置中所做的那样)。

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数据。这仍然需要很长时间,你没有过滤卡桑德拉的数据在这里很多。

相关问题 更多 >