laravel学习笔记——HTTP 客户端组件

Posted 小明的编程笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel学习笔记——HTTP 客户端组件相关的知识,希望对你有一定的参考价值。

    在php使用HTTP请求时,最常用的就是php_curl,其实这个请求的使用也不算麻烦,但是如果你学习过一些Python,一定知道一个爬虫包requests。这样相比来说php_curl,不管是请求还是返回数据的解析,都显得极其麻烦。今天阅读laravel7的升级说明:提供一套围绕 Guzzle HTTP 客户端 构建的精简且高效的 API,我看到有这样一个组件提供感觉期盼已久。举个例子对比一下这2种方法对接一个商城平台接口。

    就我当前维护的公司的订单系统来说,由于开发接手的人员众多,也没有人主导封装一个好用的HTTP请求接口,所以目前我们订单系统估计至少存在几十个php_curl的请求方法应用由各种平台接口请求。拿对接shopify商城的接口来举例,下面是php_curl请求退款订单的接口方法:

public function SpiderRefundOrder($url,$params=array()){
    if (!empty($params)){
        $params = http_build_query($params);
        $url = $url."/admin/api/2019-10/orders.json?".$params;
    }
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);

    if(env('APP_ENV') == "production") {
        // 使用代理
        curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0');
        curl_setopt($curl, CURLOPT_HTTPPROXYTUNNEL, true);
        curl_setopt($curl, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
        curl_setopt($curl, CURLOPT_PROXY, "hk-proxy.xxx.cn");
        curl_setopt($curl, CURLOPT_PROXYPORT, "8881");
    }

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($curl, CURLOPT_HEADER, true);

    $response = curl_exec($curl);

    if (curl_errno($curl)) {
        return curl_error($curl);
    }
    curl_close($curl);
    // 历史退款日志过多不记录
    // LogService::backupRequestAndResponseJson($url, $response,'Shopify',$this->account);
    $response = explode("\r\n",$response);
    $data = array_pop($response);
    $linkStr = '';
    foreach ($response as $str){
        $arr = explode(":", $str, 2);
        if (in_array("Link", $arr) || in_array("link", $arr)){
            $linkStr = $arr[1];
        }
    }
    if (preg_match('/rel="previous"/', $linkStr) && preg_match('/rel="next"/', $linkStr)) {
        preg_match("/<(.*?)>.*?<(.*?)>/",$linkStr,$matches);
        $link = $matches[2];
    }else if(preg_match('/rel="next"/', $linkStr)){
        preg_match("/<(.*?)>/",$linkStr,$matches);
        $link = $matches[1];
    }else{
        $link = "";
    }
    $data = json_decode($data,true);
    $data["next"] = $link;
    return $data;
}

    这个请求显然不适用很多情况,只是一个很基本get请求和返回结果解析,就需求编写这么多的代码。特别糟糕的体验是,要获取返回结果的请求头获取下一页的临时链接,需要额外做设置而且返回的请求头信息是一个完全需要自己去分解的字符串(在编写Python爬虫来说获取请求头是十分需要的返回信息,对于php_curl http请求这么麻烦真的十分不解)。下面看使用Guzzle HTTP 客户端 请求:

use Illuminate\Support\Facades\Http;

public function SpiderRefundOrder($url,$params=array()){
     if (!empty($params)){
         $params = http_build_query($params);
         $url = $url."/admin/api/2019-10/orders.json?".$params;
    }    
    $response = Http::asForm()->get($url, [
        'proxy' => [
            'http'  => 'hk-proxy.xxx.cn:8881'// Use this proxy with "http"
            'https' => 'hk-proxy.xxx.cn:8881'// Use this proxy with "https",
    ]);
    // 或者可以使用withBasicAuth('taylor@laravel.com', 'secret') 而不用组装包含token的url
    $data   = $response->body();  
    $header = $response->header($header);
     // 完整的代码不再演示
}

    而且通常接口请求会由于网络或者请求过多偶尔返回错误,所以我们需要自己做循环,而Guzzle HTTP 客户端只需要例如:$response = Http::retry(3, 100)->post(…)。

    Guzzle HTTP 对于返回的错误信息解析判断和测试支持方式都极其友好。

    其他的功能和使用可阅读文档详细了解:

  • Guzzle HTTP 客户端的简单使用可以参考laravel中文社区:https://learnku.com/docs/laravel/7.x/http-client/7487。

    laravel7会自动加载该组件

  • 官方文档:http://docs.guzzlephp.org。


以上是关于laravel学习笔记——HTTP 客户端组件的主要内容,如果未能解决你的问题,请参考以下文章

发现laravel简单易学,贼欢喜,学习笔记如下

php laravel框架学习笔记 基本工作原理

tomcat学习笔记系统架构和原理

tomcat学习笔记系统架构和原理

HTTP协议学习笔记

9.Laravel5学习笔记:在laravel中注冊自己的服务到容器中