为什么我在 PhpStorm HTTP 客户端和 Laravel HTTP 客户端中遇到超时,但在 Postman 中却没有?

问题描述 投票:0回答:3

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

当我用 PhpStorm 的 HTTP 客户端尝试同样的事情时

我超时了(除了 1 次在 30 秒后起作用)

代码中同样的事情:

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


dump($result->body());

curl
中提出请求更奇怪:

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

  • 邮递员:快速响应(< 400ms) with expected body
  • PhpStorm 和 php 代码:即使允许时间超过 10 秒也会超时
  • Postman 生成的curl 请求:访问被拒绝

更新 找到了解决我的问题的方法,但 Postman 在没有它的情况下工作的原因仍然让我困惑:用户代理标头恰好包含“Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Firefox/102.0”作品。但是,正如您在上面的屏幕截图中看到的那样,我不会在 Postman 中发送此标头,并且无需它即可工作。关于为什么会发生这种情况的问题仍然存在。

laravel http postman phpstorm guzzle
3个回答
1
投票

为什么使用看似相同的请求会得到不同的行为? 当然,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: 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

检查您的域,似乎将用户代理设置为

curl/7.71.1
Apache-HttpClient/4.5.14 (Java/17.0.7)
会导致超时。正如其他回复中提到的,可能存在用户代理黑名单。


1
投票

确实很奇怪,但答案很简单:该网站使用黑名单来过滤

User-Agent
,并且很可能使用 自制 解决方案来做到这一点。

第一个指标正在查看他们主页的robots.txt,这可能表明他们已经看到由于ChatGPT机器人而导致的流量增加,或者只是不想被抓取。这是相当“有点”老式的方法,其中的禁止列表看起来像是手动组合在一起的。

第二至少对于API来说,他们似乎解析了用户代理并进行了一些检查。 例如,将 UA 设置为

\0
会产生 400 Bad Request 回复。

第三,使用 Curl 并将 User-Agent 设置为

Cool
返回正确的结果:

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

第四,字母

php
似乎在该黑名单上,这意味着任何以它开头的用户代理(
PhpStorm
phpstorm
php2020
)似乎都不会导致回复。用户代理
ThePhp
ThisIsA Php Bot
可以工作...

但是最后,他们似乎也使用了白名单。 将标头设置为

PhpStorm
并且请求超时。将其设置为
Mozilla PhpStorm
并返回正确的回复。不适用于
PhpMozilla
Php Mozilla
由此我只能假设他们首先检查已知的浏览器标识符并在找到时回复,然后检查黑名单字符串(但没有正确检查子字符串),如果他们都没有找到,他们仍然回复(邮递员和我的荒谬例子似乎就是这种情况)。

例如将 UA 设置为

StackOverflow
也会产生很好的回复。啊,
guzzle
似乎也在该黑名单上(我猜那是你的 Laravel UA)。

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

严肃地说,有人应该告诉他们有关速率限制或其他一些防止超额流量的方法。


0
投票

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

您可以尝试在标题部分启用标题,但将值字段留空。这将覆盖邮递员设置的临时标头。

PhpStorm 的内置 HTTP 客户端不会自动向请求添加 User-Agent 标头。如果您想包含 User-Agent 标头,您需要手动将其添加到您的请求中。

api端点可能需要设置一些标头,否则会阻止请求。

© www.soinside.com 2019 - 2024. All rights reserved.