为什么我在PhpStorm HTTP Client和Laravel HTTP Client中得到超时,而在Postman中没有?

taor4pac  于 2023-08-05  发布在  Postman
关注(0)|答案(4)|浏览(168)

当我用Postman发送一个普通的GET请求时,这大约需要228 ms一致,并产生一个JSON响应。正如你所看到的,我在请求中禁用了cookie和header,以获得完全相同的请求。生成的 curl 似乎证实了这一点。请仔细看看我的前两张Postman截图作为证据(我也会怀疑我)。根本没有标头,即使在调试控制台的第二个图像中,您也会看到不应发送标头。
x1c 0d1x的数据



当我用PhpStorm的HTTP客户端做同样的事情时
我得到一个超时(除了1次在30秒后工作)

在代码中也是一样:

$result = Http::timeout(10)
    ->get('https://mobileapi.jumbo.com/v17/products');

dump($result->body());

字符串
curl中发出请求更奇怪:



因此,对于看似相同的请求,我们有3种不同的响应:

  • Postman :快速响应(<400 ms),预期身体
  • phpStorm和php代码:即使允许时间超过10秒也会超时
  • Postman生成的curl请求:访问被拒绝
    更新找到了解决我问题的方法,但Postman没有它也能工作的原因仍然让我困惑:一个User-Agent标头,包含确切的“Mozilla/5.0(Macintosh; Intel Mac OS X 10.15; rv:102.0)Gecko/20100101 Firefox/102.0”可以工作。然而,正如你可以看到在上面的截图,我不发送此邮件头在 Postman 和有它的作品没有。至于为什么会发生这种情况的问题仍然存在。
e1xvtsh3

e1xvtsh31#

**为什么你会用看似相同的请求得到不同的行为?**当然,Web服务器有一些基于HTTP头的请求过滤规则。

即使看起来所有的HTTP客户端都发送相同的请求,实际情况是每个客户端都默默地附加了稍微不同的头部。因此,我创建了一个RequestBin来检查客户端之间的差异。

curl --location 'https://...'

Host: envyr05unq3bk.x.pipedream.net
X-Amzn-Trace-Id: Root=1-64a95ba2-4633081a75af397c63ece198
User-Agent: curl/7.71.1
Accept: */*

字符串

仅带Host头的Postman

Host: envyr05unq3bk.x.pipedream.net
X-Amzn-Trace-Id: Root=1-64a95bac-102cc1e826a026f328c6c583

PhpStorm HTTP客户端

Host: envyr05unq3bk.x.pipedream.net
X-Amzn-Trace-Id: Root=1-64a95cc5-40d9098a346629e74f52f4d9
User-Agent: Apache-HttpClient/4.5.14 (Java/17.0.7)
Accept-Encoding: br,deflate,gzip,x-gzip


检查您的域,似乎将User-Agent设置为curl/7.71.1Apache-HttpClient/4.5.14 (Java/17.0.7)会导致超时。正如在其他回复中提到的,可能存在用户代理的黑名单。

ndasle7k

ndasle7k2#

这通常是由于发送或接收请求的方式存在一些细微的差异。以下是一些可能的原因:

标题:Postman可能会自动包含PhpStorm、Laravel或curl不包含的头文件。
SSL/TLS配置:如果服务器使用HTTPS,SSL/TLS设置可能会导致差异。
代理:客户端之间代理设置的差异可能会影响结果。
Cookies:确保在所有客户端中真正禁用Cookie。

比较每个客户端中发送的实际请求以识别任何差异是很重要的。另一个可能的原因是防火墙设置

fnx2tebb

fnx2tebb3#

Postman有一个默认的User-Agent,如果你不指定一个不同的User-Agent,它会在每个请求(temporary headers)中发送。这可能就是为什么您能够在Postman中发出请求而无需显式设置User-Agent头的原因。API端点可能识别Postman的默认User-Agent并允许请求。

  • 您可以尝试启用标题部分中的标题,但将值字段留空。这将覆盖 Postman 设置的临时邮件头。*

PhpStorm的内置HTTP客户端不会自动向请求添加User-Agent头。如果您想包含User-Agent标头,则需要手动将其添加到请求中。
API端点可能需要设置一些头,否则它将阻止请求。

qmelpv7a

qmelpv7a4#

很奇怪,但答案很简单:该网站使用黑名单来过滤User-Agent的,很可能是用一个自制的解决方案。

第一个指标是看他们的主页的robots.txt,这可能表明他们已经看到了增加的流量,由于ChatGPT机器人或只是不想被刮。这是一个相当“有点”老式的方法和禁止列表在那里看起来像手动放在一起。
其次至少对于API来说,他们似乎解析了User-Agent并进行了一些检查。例如,将UA设置为\0会产生400 Bad Request回复。
第三,使用Curl并将User-Agent设置为Cool,返回正确的结果:

$ curl --header "User-Agent: Cool" https://mobileapi.jumbo.com/v17/products

字符串

第四,字母php似乎在那个黑名单上,这意味着任何以它开头的User-Agent(PhpStormphpstormphp2020)似乎都不会导致回复。用户代理ThePhpThisIsA Php Bot工作虽然.
然而,最后,他们似乎也使用白名单。将header设置为PhpStorm,请求超时。将其设置为Mozilla PhpStorm,然后返回正确的回复。不适用于PhpMozillaPhp Mozilla从这一点上,我只能假设他们首先检查已知的浏览器标识符,如果找到就回复,然后检查黑名单字符串(* 但没有正确地检查子字符串 *),如果他们都没有找到,他们仍然回复(这似乎是Postman和我荒谬的例子的情况)。

例如,将UA设置为StackOverflow也会产生良好的回复。啊,guzzle似乎也在黑名单上(我猜那是你的Laravel UA)。

TL;DRPostman可以使用您设置的头文件工作,因为每个用户代理都可以在(奇怪的解析)黑名单上工作。

  • 在一个严重的注意,有人应该告诉他们有关速率限制或其他一些方法来防止过顶流量。*

相关问题