PHP调用file_get_contents请求API返回bool(false)但浏览器可正常访问
故障原因
- 最核心的错误是你对完整URL执行了
urlencode()操作:urlencode()是用来编码URL中的参数值的,不是编码整个URL的。编码后的完整URL会变成https%3A%2F%2Fapi.helium.io%2Fv1%2F...这种格式,完全不符合URL规范,请求根本无法正确发送到目标服务器,自然返回false。 - 其次你使用的User-Agent是2011年的旧版iOS Safari标识,近期helium API大概率更新了反爬策略,会拦截特征过于老旧或者异常的请求。
- 另外
file_get_contents默认遇到HTTP 4xx/5xx响应时会直接返回false,不会返回响应体,你看不到具体的错误提示,也会增加排查难度。
解决方案
第一步:修正URL编码逻辑
删除对$input2的urlencode()调用,只在参数值包含中文、特殊符号时对单个参数值做编码,你的参数都是数字,不需要额外编码。
第二步:优化请求头配置
更新User-Agent为现代浏览器标识,补充Accept等请求头,同时开启ignore_errors配置方便排查错误,示例配置如下:
$opts = [ "http" => [ "method" => "GET", "ignore_errors" => true, "header" => implode("\r\n", [ "Accept: application/json", "Accept-Language: en-US,en;q=0.9", "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" ]) ] ]; $context = stream_context_create($opts); $ViewLat = 40.7; $ViewLng = -73.9; $Distance = 1000; $input2 = "https://api.helium.io/v1/hotspots/location/distance?lat=$ViewLat&lon=$ViewLng&distance=$Distance"; $json_string = file_get_contents($input2, false, $context); // 调试用,打印错误和响应头 if ($json_string === false) { var_dump(error_get_last()); } var_dump($http_response_header); var_dump($json_string);
备选方案:改用cURL发送请求
如果修改后仍然被拦截,建议换成cURL扩展发起请求,cURL的请求特征更接近真实浏览器,调试信息也更全面,兼容性远高于file_get_contents做HTTP请求。
内容的提问来源于stack exchange,提问作者David Headrick
相关产品推荐
相关产品推荐

