为什么通过Python`requests`发出的请求比Postman中的请求花费几乎七倍的时间?

时间:2018-07-30 18:53:34

标签: python python-requests http-post

我目前正在使用requests.post()向Python 2.7中的服务器发出HTTP Post请求,这大约需要700毫秒。绝对也没有可能导致延迟的代理服务器,但是我仍然绕过任何代理服务器,因为这似乎是该库的问题。

尽管如此,我还是对那段时间感到好奇,因为我认为答案大约需要230个字符,这需要很长时间。这就是为什么我在Postman中尝试了相同的请求。结果是Postman中的请求不到100毫秒!这对于我要做的任务更合适。时间到了。

我想知道requests.post()中是否有任何必须设置的特定参数,或者该功能这么慢?

当前请求看起来像这样(非常基本的东西):

req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) 
json = req.json()

如果需要,来自服务器的标头:

cache-control →private
content-length →228
content-type →application/json; charset=utf-8
date →Mon, 30 Jul 2018 17:58:05 GMT
server →Microsoft-IIS/7.5
x-aspnet-version →2.0.50727
x-powered-by →ASP.NET

3 个答案:

答案 0 :(得分:1)

不知道为什么这个重要问题尚未回答。

无论如何,可能的原因是:默认情况下requests.get(...)requests.post(...)不使用会话。
由于这个原因,每次我们调用这些方法时,每次它重新配置连接时以及所有其他网络内容。
这就是为什么每次都花很多时间和以前的请求一起花费的原因。

为了克服这个问题,我们可以使用会话。

import requests

url_call = "https://en.wikipedia.org/wiki/Jamal_Nazrul_Islam"
session = requests.Session()
session.get(url_call)

通过使用会话,第一次通话会花费很多时间。从第二次通话开始,在同一域中,将花费更少的时间。

我的实验:

首次通话:2154毫秒
第二通话:318毫秒
第三通话:124毫秒
第四次通话:125毫秒

答案 1 :(得分:1)

尝试使用 http.client

import http.client
import json
​
conn = http.client.HTTPSConnection("example.com")
payload = {'Username': 'username', 'Password': 'password', 'TerminalNo': 'terminalno'}
body = json.dumps(payload)
headers = {
  'authorization': 'XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX',
  'x-api-key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
}
​
for i in range(10):
    start = time.time()
    conn.request("GET", "/", body, headers)
    res = conn.getresponse()
    data = res.read()
    response_time = time.time() - start
    print('{} {} ms'.format(i+1, round(response_time * 1000)))

结果

1 906 ms
2 215 ms
3 193 ms
4 219 ms
5 203 ms
6 223 ms
7 210 ms
8 282 ms
9 204 ms
10 204 ms

答案 2 :(得分:0)

这可能是由于服务器的响应格式不正确,导致解析问题。

您可以通过不阅读从服务器收到的响应来进行检查。如果代码仍然很慢,那么这不是您的问题,但是如果此问题得以解决,则问题可能出在解析响应上。

  1. 如果某些标头设置不正确,则会导致解析错误,从而阻止分块传输(source)。
  2. 在其他情况下,手动设置编码可能会解决解析问题(source)。

要解决这些问题,请尝试:

req = requests.post(url, json={"Username": username, "Password": password, "TerminalNo": terminalno)}) 
r.raw.chunked = True # Fix issue 1
r.encoding = 'utf-8' # Fix issue 2
json = req.json()

不能解决您的问题吗?

如果那不能解决您的问题,我还收集了其他一些可能的解决方法here