Laravel中Guzzle和Curl请求小米运动接口结果不同的原因是什么?

laravel中guzzle和curl请求小米运动接口结果不同的原因是什么?

Laravel框架下Guzzle与Curl请求小米运动接口结果差异分析及解决方案

在Laravel开发中,使用Guzzle HTTP客户端替换Curl进行网络请求时,有时会遇到结果差异。本文以小米运动登录接口为例,分析Guzzle和Curl请求返回结果不同的原因,并提供解决方案。

问题:使用Curl请求小米运动登录接口,返回HTTP状态码303;而使用Guzzle重写后,返回状态码200,且数据不同。

Curl请求代码片段(省略部分细节):

function request_post($url, $post_data, $header) {
    // ... (Curl请求代码) ...
}
// ... (调用request_post方法) ...
登录后复制

Guzzle请求代码片段(使用Laravel的Http facade):

use IlluminateSupportFacadesHttp;

// ...
$response = Http::asForm()->withHeaders($header)->post($url, $data);
登录后复制

根本原因:Curl默认会跟随HTTP重定向(例如303状态码),而Guzzle默认不会。小米运动登录接口返回303,包含实际登录结果的URL。Curl自动跳转到该URL并返回最终结果,Guzzle则只返回303响应。

解决方案:在Guzzle请求中使用withoutRedirecting()方法,禁止自动跟随重定向。修改后的Guzzle代码如下:

$response = Http::asForm()->withHeaders($header)->withoutRedirecting()->post($url, $data);
登录后复制

为了完整处理登录流程,需要进一步处理重定向后的URL,提取access token等信息:

$location = Http::asForm()->withHeaders($header)->withoutRedirecting()->post($url, $data)->header('Location');
parse_str(parse_url($location, PHP_URL_QUERY), $query);
// ... (提取access token的代码) ...
登录后复制

通过withoutRedirecting()方法,Guzzle的行为与Curl保持一致,从而获得相同的返回结果,解决HTTP重定向导致的请求结果差异问题。

以上就是Laravel中Guzzle和Curl请求小米运动接口结果不同的原因是什么?的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1239319.html

发表回复

Your email address will not be published. Required fields are marked *