当我用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 和有它的作品没有。至于为什么会发生这种情况的问题仍然存在。
4条答案
按热度按时间e1xvtsh31#
**为什么你会用看似相同的请求得到不同的行为?**当然,Web服务器有一些基于HTTP头的请求过滤规则。
即使看起来所有的HTTP客户端都发送相同的请求,实际情况是每个客户端都默默地附加了稍微不同的头部。因此,我创建了一个RequestBin来检查客户端之间的差异。
curl --location 'https://...'
字符串
仅带Host头的Postman
型
PhpStorm HTTP客户端
型
检查您的域,似乎将User-Agent设置为
curl/7.71.1
或Apache-HttpClient/4.5.14 (Java/17.0.7)
会导致超时。正如在其他回复中提到的,可能存在用户代理的黑名单。ndasle7k2#
这通常是由于发送或接收请求的方式存在一些细微的差异。以下是一些可能的原因:
标题:Postman可能会自动包含PhpStorm、Laravel或curl不包含的头文件。
SSL/TLS配置:如果服务器使用HTTPS,SSL/TLS设置可能会导致差异。
代理:客户端之间代理设置的差异可能会影响结果。
Cookies:确保在所有客户端中真正禁用Cookie。
比较每个客户端中发送的实际请求以识别任何差异是很重要的。另一个可能的原因是防火墙设置
fnx2tebb3#
Postman有一个默认的User-Agent,如果你不指定一个不同的User-Agent,它会在每个请求(temporary headers)中发送。这可能就是为什么您能够在Postman中发出请求而无需显式设置User-Agent头的原因。API端点可能识别Postman的默认User-Agent并允许请求。
PhpStorm的内置HTTP客户端不会自动向请求添加User-Agent头。如果您想包含User-Agent标头,则需要手动将其添加到请求中。
API端点可能需要设置一些头,否则它将阻止请求。
qmelpv7a4#
很奇怪,但答案很简单:该网站使用黑名单来过滤
User-Agent
的,很可能是用一个自制的解决方案。第一个指标是看他们的主页的robots.txt,这可能表明他们已经看到了增加的流量,由于ChatGPT机器人或只是不想被刮。这是一个相当“有点”老式的方法和禁止列表在那里看起来像手动放在一起。
其次至少对于API来说,他们似乎解析了User-Agent并进行了一些检查。例如,将UA设置为
\0
会产生400 Bad Request回复。第三,使用Curl并将User-Agent设置为
Cool
,返回正确的结果:字符串
第四,字母
php
似乎在那个黑名单上,这意味着任何以它开头的User-Agent(PhpStorm
,phpstorm
,php2020
)似乎都不会导致回复。用户代理ThePhp
或ThisIsA Php Bot
工作虽然.然而,最后,他们似乎也使用白名单。将header设置为
PhpStorm
,请求超时。将其设置为Mozilla PhpStorm
,然后返回正确的回复。不适用于PhpMozilla
或Php Mozilla
从这一点上,我只能假设他们首先检查已知的浏览器标识符,如果找到就回复,然后检查黑名单字符串(* 但没有正确地检查子字符串 *),如果他们都没有找到,他们仍然回复(这似乎是Postman和我荒谬的例子的情况)。例如,将UA设置为
StackOverflow
也会产生良好的回复。啊,guzzle
似乎也在黑名单上(我猜那是你的Laravel UA)。TL;DRPostman可以使用您设置的头文件工作,因为每个用户代理都可以在(奇怪的解析)黑名单上工作。