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



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

首先,我向这个 URL (http://10.61.202.98:8081/T/a/api/rows/cat/ect/tickets( 发送一个 POST 请求,并将 Postman 中的以下过滤器应用于正文,并选择了原始和 JSON(应用程序/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不等于运算符,Cassandra OR运算符, Cassandra 在运算符排序之间,Cassandra 不支持NOT EQUALtoORBETWEEN运算符,因此除了使用 ANDD之外,我无法使用这些运算符过滤 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 次,发现为什么我们得到延迟让我毫不奇怪......

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

您的邮递员请求是一个 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 正文值完全相同的 JSON 值(。
  • Content-Type标题设置为application/json(就像您在 Postman 配置中所做的那样,在为正文选择raw后,在下拉菜单中选择JSON选项(。

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 数据。

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

我认为,您可以按如下方式使用请求库:

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

您正在以 url 发送用户,通过 post 使用它,但它取决于端点的实现方式。您可以尝试以下代码:

import requests
from json import dumps
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, data=dumps(data))

最新更新