当我使用 Postman 发送普通 GET 请求时,这需要大约 228 毫秒一致,并产生 json 响应。正如您所看到的,我在请求中禁用了 cookie 和标头以获得完全相同的请求。生成的卷曲似乎证实了这一点。请仔细看看我的前两张 Postman 截图作为证据(我也会怀疑我)。根本没有标头,即使在调试控制台的第二张图像中,您也会看到不应发送标头。
当我用 PhpStorm 的 HTTP 客户端尝试同样的事情时
代码中同样的事情:
$result = Http::timeout(10)
->get('https://mobileapi.jumbo.com/v17/products');
dump($result->body());
在
curl
中提出请求更奇怪:
因此,对于看似相同的请求,我们有 3 种不同的响应:
更新 找到了解决我的问题的方法,但 Postman 在没有它的情况下工作的原因仍然让我困惑:用户代理标头恰好包含“Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Firefox/102.0”作品。但是,正如您在上面的屏幕截图中看到的那样,我不会在 Postman 中发送此标头,并且无需它即可工作。关于为什么会发生这种情况的问题仍然存在。
为什么使用看似相同的请求会得到不同的行为? 当然,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)
会导致超时。正如其他回复中提到的,可能存在用户代理黑名单。
确实很奇怪,但答案很简单:该网站使用黑名单来过滤
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 可以使用您设置的标头工作,因为每个用户代理都可以工作,但不在(奇怪的解析)黑名单上。
严肃地说,有人应该告诉他们有关速率限制或其他一些防止超额流量的方法。
Postman 有一个默认的用户代理,如果您没有指定不同的用户代理,它会随每个请求发送(临时标头)。这可能就是为什么您能够在 Postman 中发出请求而无需显式设置 User-Agent 标头的原因。 api 端点可能会识别 Postman 的默认用户代理并允许请求。
您可以尝试在标题部分启用标题,但将值字段留空。这将覆盖邮递员设置的临时标头。
PhpStorm 的内置 HTTP 客户端不会自动向请求添加 User-Agent 标头。如果您想包含 User-Agent 标头,您需要手动将其添加到您的请求中。
api端点可能需要设置一些标头,否则会阻止请求。