我在 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 许可协议
您的 Postman 请求是一个 JSON 正文。只需在 Python 中重现相同的主体。您的 Python 代码没有发送 JSON,也没有发送与您的 Postman 示例相同的数据。
对于初学者,通过
data
参数发送字典会将字典编码为application/x-www-form-urlencoded
形式,而不是 JSON。其次,您似乎正在发送一个过滤器。以下代码完全复制了您的 Postman 帖子:
请注意,
filters
是一个 Python 数据结构,它被传递给json
关键字参数。使用后者做两件事:Content-Type
header toapplication/json
(as you did in your Postman configuration by picking theJSON
option in the dropdown menu after pickingraw
对于身体)。requests
否则 只是一个 HTTP API ,它不能让 Cassandra 比任何其他 HTTP 库做更多的事情。urllib.request.urlopen
代码发送GET
请求,并简单地翻译成requests
:我删除了
if
分支并将其替换为使用params
参数,它将键值对字典转换为正确编码的 URL 查询(将用户名作为user_name
键)。注意响应中的
json()
调用;这负责解码从服务器返回的 JSON 数据。这仍然需要很长时间,您在这里没有太多过滤 Cassandra 数据。