后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载本指南以 Guzzle v3guzzle/guzzle 3.9.3官方文档为骨架完整讲解 HTTP 客户端的三大核心组成Client / Request / Response、Base URL 合并规则、全部请求选项Request Options以及并行请求与插件事件机制并结合 CRMEB 商城源码展示它在对象存储上传、第三方云 SDK 依赖中的真实应用场景。读完本文你将能熟练使用 Guzzle v3 构造任意 HTTP 请求、配置认证与代理、控制超时与 SSL 校验并理解它在 CRMEB 项目中的落地位置。一、Guzzle HTTP Client 是什么三大核心部件Guzzle 让 PHP 开发者能够完全掌控 HTTP 请求同时遵循 HTTP/1.1 的最佳实践。它的 HTTP 功能是构建在 PHP libcurl 绑定之上的健壮框架。其核心由三部分组成对应文档 crmeb/vendor/guzzle/guzzle/docs/http-client/client.rst组成类职责ClientsGuzzle\Http\Client创建并发送请求将响应关联到请求上RequestsGuzzle\Http\Message\Request无请求体的请求RequestsGuzzle\Http\Message\EntityEnclosingRequest携带请求体的请求ResponsesGuzzle\Http\Message\Response服务端返回的响应对象Client 对象负责三件事创建请求、发送请求、把响应设置到请求对象上。所有请求都由请求工厂Guzzle\Http\Message\RequestFactoryInterface创建默认工厂通常够用你也可以通过$client-setRequestFactory()注入自定义工厂。二、创建客户端与 Base URL 合并规则2.1 基本用法实例化 Client 时可以传入一个可选的 base URL本质是一个 URI 模板和一个可选配置数组。使用相对 URL 创建请求时base URL 会自动与请求 URL 合并use Guzzle\Http\Client; // 创建客户端并提供 base URL $client new Client(https://api.github.com); $request $client-get(/user); $request-setAuth(user, pass); echo $request-getUrl(); // https://api.github.com/user // 必须显式发送请求才会真正发起传输 $response $request-send(); echo $response-getBody(); // {type:User, ... echo $response-getHeader(Content-Length); // 792 $data $response-json(); echo $data[type]; // User2.2 Base URL 与相对 URL 的合并规则Guzzle 遵循 RFC 3986 的 5.2 节来合并 base URL 与相对 URL。注意上文例子中传给get()的是/user带前导斜杠它是绝对路径形式的相对 URL因此合并后实际得到https://api.github.com/user。具体规则如下绝对路径带前导斜杠如/path/to/something会覆盖 base URL 中的既有路径同时相对 URL 携带的查询字符串会替换 base URL 的查询字符串。相对路径不带前导斜杠会追加到 base URL 路径之后。例如 base URL 为https://api.twitter.com/v1.1用statuses/user_timeline.json创建 GET 请求得到https://api.twitter.com/v1.1/statuses/user_timeline.json。如果同时提供了查询字符串则相对路径追加到 base URL 路径查询参数合并进 base URL 的查询字符串。绝对 URL如http://httpbin.org/ip请求完全按该 URL 原样发送base URL 的任何组成部分都不会参与合并。从源码看Client 内部将 baseUrl 解析为Guzzle\Http\Url对象在 Client.php 的createRequest()中完成合并逻辑你可以直接在源码中验证上述三种合并分支。三、客户端配置选项Configuration Options构造函数第二个参数是配置数组可以包含 URI 模板变量或改变客户端行为的特殊选项配置项说明request.options关联数组作为每个请求的默认 Request options作用于客户端创建的所有请求redirect.disable禁用客户端创建的每个请求的 HTTP 重定向跟随curl.options关联数组作为每个请求的 cURL 选项若某项的键或值是字符串Guzzle 会自动匹配对应的 cURL 常量如字符串CURLOPT_PROXY会被转换为常量CURLOPT_PROXYssl.certificate_authority值为true时使用 Guzzle 内置的 SSL 证书包默认行为system使用系统证书包字符串指向某个证书文件字符串指向某目录则使用其中多个证书false则关闭 SSL 校验不推荐。当 Guzzle 运行在 phar 中时内置证书会被解压到系统临时目录每次创建客户端都会做 MD5 完整性校验command.params使用Guzzle\Service\Client时作为每个命令默认选项的关联数组3.1 综合配置示例下面的示例设置了默认请求头、默认查询参数、默认认证方案和默认代理。配置数组中的变量还可以注入到 base URL 中即 URI 模板use Guzzle\Http\Client; $client new Client(https://api.twitter.com/{version}, array( version v1.1, request.options array( headers array(Foo Bar), query array(testing 123), auth array(username, password, Basic|Digest|NTLM|Any), proxy tcp://localhost:80 ) ));3.2 自定义 User-Agent默认 User-Agent 格式为Guzzle/Guzzle_Version curl/curl_version PHP/PHP_VERSION可通过setUserAgent()定制// 完全覆盖默认 User-Agent $client-setUserAgent(Test/123); // 在默认 User-Agent 前追加字符串 $client-setUserAgent(Test/123, true);该方法的签名在 Client.php 中为setUserAgent($userAgent, $includeDefault false)第二个参数控制是否保留默认串。四、使用客户端创建各类请求Client 暴露了多种创建 Request 对象的方法$client-createRequest($method, $uri, array $headers, $body, $options)— 创建任意自定义 HTTP 请求$client-get($uri, array $headers, $options)— 创建 GET 请求$client-head($uri, array $headers, $options)— 创建 HEAD 请求$client-delete($uri, array $headers, $body, $options)— 创建 DELETE 请求$client-post($uri, array $headers, $postBody, $options)— 创建 POST 请求$client-put($uri, array $headers, $body, $options)— 创建 PUT 请求$client-patch($uri, array $headers, $body, $options)— 创建 PATCH 请求use Guzzle\Http\Client; $client new Client(http://baseurl.com/api/v1); // 相对 URL相对路径追加到 base URL 路径 // 最终 URL: http://baseurl.com/api/v1/path?query123valueabc $request $client-get(path?query123valueabc); $response $request-send(); // 带绝对路径的相对 URL覆盖 base URL 的路径部分 // 最终 URL: http://baseurl.com/path?query123valueabc $request $client-head(/path?query123valueabc); $response $request-send(); // 绝对 URL完全按原样发送 $request $client-delete(http://www.example.com/path?query123valueabc); $response $request-send(); // PUT以 PHP 流的内容作为请求体并指定自定义请求头 $request $client-put(http://www.example.com/upload, array( X-Header My Header ), fopen(http://www.test.com/, r)); $response $request-send(); // POST手动追加文件 $request $client-post(http://localhost:8983/solr/update) -addPostFiles(array(file /path/to/documents.xml)); $response $request-send(); // 探测资源是否允许 DELETE 方法 $supportsDelete $client-options(/path)-send()-isMethodAllowed(DELETE);这些便捷方法在 Client.php 中均有对应实现内部统一调用createRequest()。五、静态客户端StaticClientGuzzle 还提供了静态门面可以更方便地发送简单 HTTP 请求无需实例化客户端// 挂载静态客户端之后即可通过 \Guzzle 访问 Guzzle\Http\StaticClient::mount(); $response Guzzle::get(http://guzzlephp.org);静态客户端的每个请求方法get()、post()、put()等都接受一个请求选项关联数组$response Guzzle::post(http://test.com, array( headers array(X-Foo Bar), body array(Test 123), timeout 10 ));从 StaticClient.php 源码看mount($className Guzzle, ClientInterface $client null)通过class_alias注册别名request()内部惰性创建new Client()并调用createRequest($method, $url, null, null, $options)。六、请求选项Request Options全解析请求选项可以在创建请求时指定也可以在客户端的request.options中配置为默认值。它可以控制请求头、查询字符串、响应下载位置、代理、认证等各个方面。6.1 headers应用到请求的请求头关联数组。当在创建方法的$options参数中指定时$options中的 headers 会覆盖$headers参数中同名的头部$request $client-get($url, array(), array( headers array(X-Foo Bar) ));也可以在客户端上配置默认请求头$client new Guzzle\Http\Client(); // 用路径语法设置单个请求头 $client-setDefaultOption(headers/X-Foo, Bar); // 设置全部请求头 $client-setDefaultOption(headers, array(X-Foo Bar));此外任何客户端默认请求选项都可以通过配置对象设置$client-getConfig()-setPath(request.options/headers/X-Foo, Bar);6.2 query请求的查询字符串参数关联数组。在$options中指定时会覆盖$url中的同名查询参数$request $client-get($url, array(), array( query array(abc 123) ));也可在客户端上配置默认查询参数$client new Guzzle\Http\Client(); // 路径语法设置单个查询参数 $client-setDefaultOption(query/abc, 123); // 设置一组默认查询参数 $client-setDefaultOption(query, array(abc 123));6.3 body设置请求体。body选项的值可以是Guzzle\Http\EntityBodyInterface、字符串、fopen资源或发送 POST 时的数组。一旦指定body选项它会覆盖创建方法中的$body参数。6.4 auth指定 HTTP 认证参数的数组。数组第 0 位是用户名第 1 位是密码第 2 位可选认证类型。可选类型为Basic默认、Digest、NTLM、Any$request $client-get($url, array(), array( auth array(username, password, Digest) )); // 让客户端每个请求都携带认证头 $client-setDefaultOption(auth, array(username, password, Digest));6.5 cookies指定要添加到请求中的 cookie 关联数组。6.6 allow_redirects指定请求是否跟随重定向。默认跟随设为false则禁用等价于配置项redirect.disable内部对应Guzzle\Http\RedirectPlugin::DISABLE常量。6.7 save_to指定响应体下载到何处可以传文件路径、fopen资源或Guzzle\Http\EntityBodyInterface对象。6.8 eventsevents选项让挂载事件监听器变得简单它必须是事件名 → Closure或包含 Closure 与优先级的数组的关联数组$request $client-get($url, array(), array( events array( request.before_send function (\Guzzle\Common\Event $e) { echo About to send . $e[request]; } ) )); // 静态客户端用法 Guzzle::get($url, array( events array( request.before_send function (\Guzzle\Common\Event $e) { echo About to send . $e[request]; } ) ));6.9 pluginsplugins选项让你为请求挂载一组插件Guzzle::get($url, array( plugins array( new Guzzle\Plugin\Cache\CachePlugin(), new Guzzle\Plugin\Cookie\CookiePlugin() ) ));6.10 exceptionsexceptions选项用于在非成功的 HTTP 响应码如 404、500 等下禁用异常抛出。设为false则不抛异常。6.11 paramsparams选项用于向请求添加数据参数关联数组。注意这不是查询字符串参数。6.12 timeout / connect_timeouttimeout整个传输允许的最长秒数超时即中断。connect_timeout连接等待的最长秒数。两者设为0表示无限期等待。$request $client-get(http://www.example.com, array(), array( timeout 20, connect_timeout 1.5 ));6.13 verifytrue启用 SSL 证书校验默认false禁用或者传入 CA bundle 路径使用自定义证书进行校验。6.14 certcert指定 PEM 格式的 SSL 客户端证书用于要求双向认证的服务器。如果证书需要密码用数组且密码作为第二个元素。通常与ssl_key配合使用$request $client-get(https://www.example.com, array(), array( cert /etc/pki/client_certificate.pem )); $request $client-get(https://www.example.com, array(), array( cert array(/etc/pki/client_certificate.pem, s3cr3tp455w0rd) ));6.15 ssl_keyssl_key指定 PEM 格式私钥文件可带密码保护。密码属于敏感信息请妥善保管包含它的 PHP 脚本。通常与cert配合使用$request $client-get(https://www.example.com, array(), array( ssl_key /etc/pki/private_key.pem )); $request $client-get(https://www.example.com, array(), array( ssl_key array(/etc/pki/private_key.pem, s3cr3tp455w0rd) ));6.16 proxyproxy用于指定 HTTP 代理格式如http://username:password192.168.16.1:10。6.17 debugdebug用于显示一次传输的详细 cURL 输出。6.18 stream使用静态客户端时stream设为true会返回一个Guzzle\Stream\Stream对象可以按需从流中拉取数据而不是让 cURL 一次性把整个响应下载到内存$stream Guzzle::get(http://guzzlephp.org, array(stream true)); while (!$stream-feof()) { echo $stream-readLine(); }七、发送请求串行与并行7.1 send() 发送单个请求请求可以通过 Request 对象的send()发送也可以通过 Client 的send()发送$request $client-get(http://www.amazon.com); $response $client-send($request);7.2 并行发送Parallel RequestsClient 的send()既可以接受单个Guzzle\Http\Message\RequestInterface对象也可以接受一个 RequestInterface 对象数组——传入数组时请求将被并行发送。串行发送大量 HTTP 请求会因前一个请求必须完成后才能发起下一个而造成脚本无谓的延迟并行发送则让整个请求池以其中最慢请求的速度完成大幅缩短多个 HTTP 请求的总耗时。Guzzle 对 PHP 的 curl_multi 函数提供了封装。并行发送三个请求的示例use Guzzle\Common\Exception\MultiTransferException; try { $responses $client-send(array( $client-get(http://www.google.com/), $client-head(http://www.google.com/), $client-get(https://www.github.com/) )); } catch (MultiTransferException $e) { echo The following exceptions were encountered:\n; foreach ($e as $exception) { echo $exception-getMessage() . \n; } echo The following requests failed:\n; foreach ($e-getFailedRequests() as $request) { echo $request . \n\n; } echo The following requests succeeded:\n; foreach ($e-getSuccessfulRequests() as $request) { echo $request . \n\n; } }成功时返回一组Guzzle\Http\Message\Response对象。单个请求失败不会导致整个请求池失败——传输过程中抛出的所有异常会被聚合成Guzzle\Common\Exception\MultiTransferException。对应实现为 Client.php 的sendMultiple()其内部使用CurlMultiProxy默认 MAX_HANDLES 3即最多同时打开 3 个 cURL 句柄。八、插件与事件系统Guzzle 提供了易用的请求插件通过基于 Symfony2 Event Dispatcher 的信号槽事件通知为请求添加行为。任何挂载到 Client 对象上的事件监听器或订阅者都会自动挂载到该客户端创建的每一个请求上。8.1 让每个请求共享同一 cookie 会话将Guzzle\Plugin\Cookie\CookiePlugin挂到客户端即可让该客户端创建的每个请求都支持 cookie且共用同一个 cookie 会话use Guzzle\Plugin\Cookie\CookiePlugin; use Guzzle\Plugin\Cookie\CookieJar\ArrayCookieJar; // 创建 cookie 插件 $cookiePlugin new CookiePlugin(new ArrayCookieJar()); // 将插件作为订阅者挂到客户端 $client-addSubscriber($cookiePlugin);8.2 客户端发出的事件Guzzle\Http\Client对象发出如下事件事件名说明事件数据client.create_request客户端创建请求时触发client客户端对象request已创建的请求use Guzzle\Common\Event; use Guzzle\Http\Client; $client new Client(); // 监听请求创建打印出来 $client-getEventDispatcher()-addListener(client.create_request, function (Event $e) { echo Client object: . spl_object_hash($e[client]) . \n; echo Request object: {$e[request]}\n; });九、CRMEB 项目中的真实落地9.1 Guzzle v3 的引入来源CRMEB 的 crmeb/composer.lock 中锁定了guzzle/guzzlev3.9.3它并非由 CRMEB 直接声明而是由腾讯云对象存储 SDKqcloud/cos-sdk-v5间接依赖requireguzzle/guzzle: ~3.7带入的。此外 crmeb/composer.json 还直接声明了guzzlehttp/guzzle: 6.5.5与guzzlehttp/psr7: ^1.7因此 CRMEB 中同时存在 v3 与 v6 两代 Guzzle 代码路径属于依赖生态的典型叠加。9.2 EntityBody 在文件流上传中的使用文档提到的Guzzle\Http\EntityBodyInterface在 CRMEB 上传组件中有直接应用。以阿里云 OSS 存储实现 crmeb/crmeb/services/upload/storage/Oss.php 为例stream()方法在上传前把文件内容包装为 Guzzle 的 EntityBodyuse Guzzle\Http\EntityBody; // ... $fileContent (string)EntityBody::factory($fileContent); $uploadInfo $this-app()-putObject($this-storageName, $key, $fileContent);同样地京东云存储 crmeb/crmeb/services/upload/storage/Jdoss.php 也通过EntityBody::factory()将上传内容转换为统一实体对应文档中body选项支持Guzzle\Http\EntityBodyInterface值的说明。9.3 与 Guzzle v6 / PSR-7 的共存CRMEB 的云存储模块在另一些实现中则使用新一代 PSR-7 工具类腾讯云 COSCos.php、华为云 OBSObs.php、火山引擎 TOSTyoss.php都use GuzzleHttp\Psr7\Utils;微信 OAuth 服务WechatOauth.php也使用GuzzleHttp\Psr7\Uri处理 URI。这两套命名空间可以共存正是 Guzzle 三代架构设计v3 基于Guzzle\Http\*自定义消息体系、v6 起全面拥抱 PSR-7在真实项目中的体现。9.4 对照CRMEB 自研的 curl 封装值得注意的是CRMEB 核心业务代码并未直接依赖 Guzzle 发送常规 HTTP 请求而是封装了自己的 crmeb/crmeb/services/HttpService.php基于原生 curl提供getRequest()、postRequest()、request()等静态方法并统一处理超时、HTTPS 证书校验、header 输出与http_code判定。这也解释了 Guzzle 在 CRMEB 中主要作为第三方云 SDK 的传输层依赖而非项目自有 HTTP 客户端的定位——你可以对照本文的timeout/verify/proxy等选项理解这些概念在 curl 参数CURLOPT_TIMEOUT、CURLOPT_SSL_VERIFYPEER等中的等价映射。十、小结与注意事项Guzzle v3 的核心工作流是创建 Client → 用便捷方法创建 Request →send()发送 → 解析 ResponseBase URL 合并遵循 RFC 3986三类 URL 形态绝对路径 / 相对路径 / 绝对 URL的合并行为截然不同务必区分。客户端配置request.options、curl.options、ssl.certificate_authority等与单次请求选项headers、query、auth、timeout、verify、proxy等是两套机制前者作用于所有请求后者单次覆盖。需要同时请求多个资源时优先使用send(array(...))并行模式失败请求通过MultiTransferException::getFailedRequests()与getSuccessfulRequests()分别处理。在 CRMEB 仓库中Guzzle v3 由qcloud/cos-sdk-v5间接引入guzzle/guzzle ~3.7锁版本为 v3.9.3其EntityBody被用于 OSS / 京东云文件流上传若需在项目内直接使用 Guzzle 发送请求请确认引入路径与版本命名空间Guzzle\Http\*为 v3GuzzleHttp\*为 v6避免混用导致类加载错误。赞分享后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载相关推荐Guzzle HTTP 客户端请求选项详解Guzzle HTTP 客户端请求选项详解 概述 Guzzle 是一个功能强大的 PHP HTTP 客户端它提供了丰富的请求选项 Request Option后端vue-resource与GraphQL使用HTTP客户端发送GraphQL请求vue resource与GraphQL使用HTTP客户端发送GraphQL请求 在现代前端开发中高效的数据获取是构建优秀用户体验的关键。你是否还在为RES前端Guzzle HTTP客户端PHP开发者必备的HTTP请求工具Guzzle HTTP客户端PHP开发者必备的HTTP请求工具 什么是Guzzle Guzzle是一个功能强大的PHP HTTP客户端库它极大地简化了发送后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考