如何使用 Python 请求发送 POST 请求,每个有效负载在其自己的行上

How to send POST request with each payload on its own line using Python requests

我必须向 /batch 端点发送 POST 请求:'https://www.google-analytics.com'.

Documentation 中所述,我必须将请求发送到 /batch 端点并 在其自己的行上指定每个负载。

我使用 POSTMAN 实现了这一点,如下所示:

我的查询是使用 Python 的 requests

发出 POST 请求

我试过这样的事情:

import requests

text = '''v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=bookmarks&ev=13
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=upvotes&ev=65
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=questions&ev=15
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=postviews&ev=95'''

response = requests.post('https://www.google-analytics.com/batch', data=text)

但它不起作用。

更新

我试过了,很有效!

import http.client

conn = http.client.HTTPSConnection("www.google-analytics.com")
payload = "v=1&cid=43223523&tid=UA-200248207-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=bookmarks&ev=13\r\nv=1&cid=43223523&tid=UA-200248207-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=upvotes&ev=63\r\nv=1&cid=43223523&tid=UA-200248207-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=questions&ev=11\r\nv=1&cid=43223523&tid=UA-200248207-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=postviews&ev=23"
headers = {
  'Content-Type': 'text/plain'
}
conn.request("POST", "/batch", payload, headers)
res = conn.getresponse()

但问题仍然悬而未决,requests 这里有什么问题。

您不需要对换行符进行两次转义。

此外,对于多行字符串,您根本不需要换行符。

而且您在多行字符串中的缩进也被计算在内:

test = '''abc
def
ghi'''

print(test)

这是一个 SO 答案,用一些其他方法来解释这个问题:

现在是请求正文。

文档说

payload_data – The BODY of the post request. The body must include exactly 1 URI encoded payload and must be no longer than 8192 bytes.

所以请尝试对您的负载进行 uri 编码:

text = '''v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=bookmarks&ev=13
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=upvotes&ev=65
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=questions&ev=15
v=1&cid=43223523&tid=UA-XXXXXX-1&t=event&ec=aggregated_stats&ea=daily_kpi&el=postviews&ev=95'''

text_final = requests.utils.quote(text)

response = requests.post('https://www.google-analytics.com/batch', data=text_final)

最后,我自己想出了解决办法。

正在为其他人的帮助更新。

问题是我在 AWS Cloud9 上工作,正如 documentation

中提到的

Some environments are not able to send hits to Google Analytics directly. Examples of this are older mobile phones that can't run JavaScript or corporate intranets behind a firewall.

所以我们只需要包括 User Agent parameter

ua=Opera/9.80

在我们每个 payloads

有效!