
后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载导读Requests for PHPrmccue/requests是一个用纯 PHP 编写的 HTTP 请求库它以为人类设计为理念把 cURL 与 fsockopen 的底层复杂性抽象成一套一致、简洁的 API。本文以 YOURLS 仓库中随附的 Requests README 为主体结合仓库内 核心实现 与 YOURLS 的 HTTP 封装层系统讲解该库的 API 设计、核心选项、传输层原理、SSL 验证机制以及它在 YOURLS 短链接服务中的真实落地方式含 SSRF 防护钩子。读完本文你将能够独立在 PHP 项目中安装、调用 Requests并理解 YOURLS 是如何基于它构建统一 HTTP 请求能力的。Requests 是什么为人类设计的 PHP HTTP 库Requests 是 an HTTP library written in PHP, for human beings其 API 设计大致借鉴了 Python 著名的 Requests 库 中也有印证rmccue/requests: ^2.0被声明为项目唯一的外部 HTTP 依赖。为什么要专门写一个 HTTP 库README 给出了清晰的理由尽管 PHP 是 Web 语言但它发送 HTTP 请求的工具却相当匮乏——cURL 的curl_setoptAPI 复杂难用且不一定在所有环境可用Socket 只能提供底层访问大部分 HTTP 响应解析都需要自己动手。Requests 正是为解决这一痛点而生它根据系统环境自动在 cURL 与 fsockopen 之间选择传输方式把所有脏活累活抽象掉对外提供一致的 API。核心特性一览README 明确列出的特性包括International Domains and URLs国际化域名与 URL内置 IDN 解析与编码支持Browser-style SSL Verification浏览器式 SSL 验证默认启用证书链与主机名校验行为接近现代浏览器Basic/Digest AuthenticationBasic/Digest 认证以数组形式一行配置即可Automatic Decompression自动解压自动处理 gzip/deflate 压缩响应Connection Timeouts连接超时支持独立的连接超时与总体超时配置。支持的 HTTP 方法包括HEAD、GET、POST、PUT、DELETE 和 PATCH源码中另有 TRACE、OPTIONS请求头、表单数据、multipart 文件与查询参数都可以用普通数组表达响应数据也以同样直观的方式访问。快速上手一行 GET 请求README 给出的首个示例完整展示了为人类设计的体验$headers array(Accept application/json); $options array(auth array(user, pass)); $request WpOrg\Requests\Requests::get(https://api.github.com/gists, $headers, $options); var_dump($request-status_code); // int(200) var_dump($request-headers[content-type]); // string(31) application/json; charsetutf-8 var_dump($request-body); // string(26891) [...]请求返回的是一个\WpOrg\Requests\Response对象status_code、headers、body直接可读。认证只需要在$options里给一个[user, pass]数组——这正是 set_defaults() 的底层行为当$options[auth]是数组时会被转换为WpOrg\Requests\Auth\Basic对象并注册到 hooks 中。在 Requests.php 源码中可以看到除get()外还提供了head()、delete()、trace()以及带$data参数的post()、put()、options()、patch()——它们最终全部收敛到同一个核心方法request()。核心入口request() 方法与完整选项表所有请求最终都经由 Requests::request() 处理。它的签名是public static function request($url, $headers [], $data [], $type self::GET, $options [])$options的默认值集中定义在 OPTION_DEFAULTS 常量 中下面是结合源码 PHPDoc 整理出的完整选项表选项类型默认值说明timeoutfloat10等待响应的总超时秒可到毫秒精度如0.01。注意 cURL 的 DNS 解析以秒为粒度最小值实际为 1 秒connect_timeoutfloat10等待建立连接的超时秒毫秒精度useragentstringphp-requests/2.0.18发送给服务器的 User-Agentprotocol_versionfloat1.1HTTP 协议版本follow_redirectsbooltrue是否跟随 3xx 重定向redirectsint10重定向上限超过即报错blockingbooltrue是否阻塞等待请求完成typestringGETHTTP 方法使用类常量filenamestring|boolfalse将响应体流式写入该文件authAuth|array|boolfalseBasic 认证的用户名/密码数组或认证器对象proxyProxy|array|string|boolfalse代理配置cookiesarray|JarfalseCookie 数组或 Cookie Jar 对象max_bytesint|boolfalse响应体大小上限idnbooltrue是否启用 IDN 解析hooksHookManagernull钩子系统详见下文 YOURLS 集成transportstring|Transportnull自定义传输类默认自动探测verifystring|boolcertificates/cacert.pemSSL 证书验证true使用系统根证书库字符串为自定义 CA 文件路径false关闭verifynamebooltrue是否校验 SSL 证书的 Common Namedata_formatstring随方法而定query或bodyGET/HEAD/DELETE 默认queryPOST/PUT/OPTIONS/PATCH 默认bodyrequest()的完整流程可以从源码中还原先做参数校验非法参数抛InvalidArgument异常合并默认选项然后set_defaults()检查 URL 必须是 http(s) 协议否则抛nonhttp异常、实例化 hooks、转换 auth/proxy/cookies、执行 IDN 编码最后按需选择传输层并调用$transport-request()再经过requests.before_parse钩子后由parse_response()解析成Response对象返回。传输层原理cURL 与 fsockopen 的自动选择Requests 的一个关键设计是根据系统有什么就用什么默认支持的传输类定义在 DEFAULT_TRANSPORTS即Transport\Curl与Transport\Fsockopen。get_transport_class() 会按能力矩阵探测可用传输请求https://地址时传入[Capability::SSL true]随后对每个已注册传输调用静态test($capabilities)方法第一个通过者被选中并缓存。若没有任何可用传输则抛出notransport异常get_transport()。你也可以通过 add_transport() 注册自定义传输或用has_capabilities()探测能力。两个默认传输的实现分别位于 src/Transport/Curl.php 与 src/Transport/Fsockopen.php。以 cURL 传输为例verify选项被映射为CURLOPT_SSL_VERIFYHOST/CURLOPT_SSL_VERIFYPEER字符串形式的verify则作为CURLOPT_CAINFO传入Curl.php 第 192-202 行。SSL 验证与证书管理README 强调的 Browser-style SSL Verification 在仓库中有完整支撑默认证书文件位于 certificates/cacert.pem附带 cacert.pem.sha256 校验文件。Requests.php 第 177 行 将默认证书路径指向该文件get_default_options()会把verify默认值设为此路径。如果你需要更换 CA 证书包可以用公开的静态方法WpOrg\Requests\Requests::set_certificate_path(/path/to/your/cacert.pem); $path WpOrg\Requests\Requests::get_certificate_path();set_certificate_path()接受字符串或布尔值false表示关闭验证传参不合法时抛InvalidArgument异常。安装方式README 提供了四种安装路径其中 Composer 是官方推荐1. Composer 安装推荐composer require rmccue/requests或写入composer.json{ require: { rmccue/requests: ^2.0 } }2. 从源码安装克隆后引入并注册自动加载器require_once /path/to/Requests/src/Autoload.php; WpOrg\Requests\Autoload::register();3. 从 tarball/zipball 安装用curl -L ... | tar xzv或wget ... -O - | tar xzv解压stable分支归档。4. 使用 PSR-4 类加载器以 Symfony Class Loader 为例把WpOrg\Requests\前缀映射到path/to/vendor/Requests/src。兼容性提示仓库中的 library/ 目录 已标记为deprecated——它仅用于对 Requests 1.x 提供向后兼容如 library/Deprecated.php并计划在 Requests v4.0.0 中移除。新代码应使用WpOrg\Requests\命名空间。并发请求request_multiple()除了单个请求Requests 还支持同时发送多个请求request_multiple()。$requests是一个以 ID 为键的数组每个元素包含url必填、headers、data、type、cookies字段$options作为全局默认选项可统一设置钩子系统与方法类型还支持complete回调——每个请求完成时回调收到Response或Exception与该请求的 ID。并发模式依赖传输层实现cURL 传输天然支持多句柄并发。YOURLS 中的真实集成从封装到 SSRF 防护Requests 在 YOURLS 中不是孤立存在而是整个短链接服务出站 HTTP 能力的基石。以 includes/functions-http.php 为线索可以还原完整集成链路1. 统一封装入口。yourls_http_request() 是核心封装先经过shunt_yourls_http_request过滤器允许插件短路合并默认选项根据代理配置决定是否卸载proxy选项再依次对 type/url/headers/data/options 应用过滤器最后调用Requests::request()捕获到的\WpOrg\Requests\Exception会写入调试日志。基于它还派生了yourls_http_get()、yourls_http_post()等便捷函数。2. 钩子机制的实战用法。README 提到的hooks选项在 YOURLS 中被用来实现安全策略。例如 yourls_http_options_no_local_redirect() 创建了一个\WpOrg\Requests\Hooks()实例注册requests.before_redirect回调并把redirects限制为 3function yourls_http_options_no_local_redirect(): array { $hooks new \WpOrg\Requests\Hooks(); $hooks-register( requests.before_redirect, yourls_http_abort_local_redirect ); return array( hooks $hooks, redirects 3, ); }3. SSRF 防护重定向到内网主机即中止。回调 yourls_http_abort_local_redirect() 解析重定向目标的主机名若目标不是公开主机yourls_host_is_local()判定为本地地址就抛出\WpOrg\Requests\Exception错误码yourls.local_redirect中断请求。代码注释特别强调必须抛\WpOrg\Requests\Exception而不是普通\Exception因为只有前者会被yourls_http_request()捕获否则异常会逃逸导致致命错误——这正是围绕文档特性讲解底层原理的典型细节。该行为有对应的测试用例见 tests/tests/http/SSRFTest.php 与 tests/tests/http/HTTPRequestsTest.php。4. 代理支持。YOURLS 通过yourls_http_get_proxy()读取代理配置并借助yourls_send_through_proxy()判断特定 URL 是否应绕过代理functions-http.php 第 476-478 行与 Requests 的proxy选项Proxy\Http类配合实现全局代理策略。测试100% 覆盖率目标README 说明 Requests 以 100% 代码覆盖率为目标并附带详尽的测试套件。运行方式非常直接先确认 PHP JSON 扩展已启用然后在库根目录执行$ phpunit若只想运行某一组测试指定名称即可$ phpunit Transport/cURL关于 PSR-7 / PSR-18README 明确指出PSR-7HTTP 消息接口与 PSR-18HTTP 客户端接口都是在 Requests 诞生之后才制定的因此库本身不打算原生实现这两套标准。如果项目需要 PSR-7/PSR-18 兼容的 HTTP 客户端社区提供了适配包如art4/requests-psr18-adapter可以将 Requests 作为 PSR-18 HTTP Client 使用。小结Requests for PHP 凭借为人类设计的 API、无外部依赖、双传输自动切换与浏览器式 SSL 验证成为 YOURLS 这类自托管应用的理想 HTTP 基础件。从本文可以看出理解一个第三方库的 README最有价值的方式是回到源码与宿主项目中去——YOURLS 在 includes/functions-http.php 中通过Requests::request()封装统一出站请求、通过requests.before_redirect钩子实现 SSRF 防护正是 README 中一致 API 与钩子系统特性在真实业务场景中的最佳注脚。后续你可以继续阅读 src/Requests.php 的完整 PHPDoc或通过phpunit在 tests 目录下验证文中涉及的各项行为。赞分享后端【免费下载链接】YOURLS The standard, self hosted, powerful and customizable, URL shortener in PHP项目地址https://gitcode.com/gh_mirrors/yo/YOURLS点击查看免费下载相关推荐Requests - 为Gophers优化的HTTP客户端库Requests 为Gophers优化的HTTP客户端库 在Go语言中进行HTTP客户端编程时你可能会遇到一个问题net/http包虽然强大且灵活但它的使如何快速上手Viking-33B5步完成多语言大模型部署如何快速上手Viking 33B5步完成多语言大模型部署 Viking 33B是一款强大的多语言大模型基于Llama架构构建拥有7168的隐藏层大小和56为什么你的macOS下载工具总是卡顿Aria2GUI实用故障排除指南为什么你的macOS下载工具总是卡顿Aria2GUI实用故障排除指南 Aria2GUI for macOS是一款高效的多线程下载工具但新手在使用过程中常会遇桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考