轻HTTP 基于PHP的一款超灵活专业级HTTP轻量网络请求库

简介

轻HTTP请求库是一款专业级轻量的PHP HTTP客户端,用于发送各种HTTP请求。它支持GET、POST、HEAD、DELETE、PUT、PATCH等方法,可以轻松发送JSON、XML等格式的数据。

$client = new Client();
$response = $client->get('http://www.example.com');
echo $response; // 输出响应体

该库的主要特性:

  • 支持主流的HTTP方法:GET、POST、HEAD、DELETE、PUT、PATCH 等。可以发送各种请求,获取不同的响应。
  • 支持URL参数、请求体、请求头、Cookie等设置。可以定制灵活的请求参数。
  • 发送请求体支持JSON、XML、文本等格式。支持的请求数据类型丰富。
  • 简单易用,代码量小巧轻量,使用方法灵活。接口简单明了,学习成本低。
  • 基于PHP原生curl扩展,性能高效稳定。利用curl实现,性能优秀。

项目地址:https://gitee.com/yh-it/php-http-request

觉得本项目不错的话可以帮忙点一下星星Star哦

安装

通过 Composer 安装

1. 安装 Composer

curl -sS https://getcomposer.org/installer | php

2. 运行安装命令

composer require network/http:dev-master

3. 启用 Composer 自动加载

require 'vendor/autoload.php';

启用后,可直接使用 $client = new Client();

基本使用

use network\http\Client;

$client = new Client();

$client->param('name', '易航'); // 设置请求参数

$client->header('User-Agent', 'Mozilla/5.0'); // 设置请求头

$response = $client->get('http://www.bri6.cn'); // 发送GET请求

echo $response; // 输出响应体

请求参数用于构造请求URL的参数,请求头用于定制客户端信息,发起GET请求后获取响应,并输出响应体。

实例化 Client

$client = new network\http\Client();

param 和 header 方法

可以调用 param() 方法添加URL参数, header() 方法添加请求头。它们既支持单个设置,也支持批量设置:

// 单个设置
$client->param('name', '易航');  
$client->header('User-Agent', 'Mozilla/5.0');

// 批量设置
$client->param(['name' => '易航', 'age' => 25]);  
$client->header(['User-Agent' => 'Mozilla/5.0', 'Content-Type' => 'application/json']);

发送GET请求

$response = $client->get('http://bri6.cn');
$response = $client->send('http://www.bri6.cn','GET');
$response = $client->modth('GET')->send('http://www.bri6.cn');
$response = $client->url('http://www.bri6.cn')->send();

可以传入请求头和查询参数:

$response = $client->get('http://bri6.cn', ['name' => '易航'], ['Accept' => 'application/json']);

发送POST请求

$response = $client->post('http://bri6.cn', ['name' => '易航']);  

可以传入请求体、请求头:

$response = $client->post('http://bri6.cn', ['name' => '易航'], ['Content-Type' => 'application/x-www-form-urlencoded']);

其他请求方法

  • delete(): 发送DELETE请求
  • put(): 发送PUT请求
  • patch(): 发送PATCH请求
$response = $client->delete('http://www.bri6.cn');

$response = $client->put('http://www.bri6.cn', ['title' => 'Easy']);

$response = $client->patch('http://www.bri6.cn', ['views' => 999]);

send 方法

send 方法是该库中最为核心和灵活的一个方法,它可以接收三个参数,并可以对这三个参数的顺序进行混合传参。

传统方式

$client->send('http://www.bri6.cn', 'GET', ['name' => '易航']);

方法和URL顺序交换

$client->send('GET', 'http://www.bri6.cn', ['name' => '易航']);

URL和参数顺序交换

$client->send(['name' => '易航'], 'http://www.bri6.cn', 'GET');

链式设置URL和方法,最后传入参数

$client->url('http://www.bri6.cn')->method('GET')->send(['name' => '易航']);

链式设置参数,最后传入URL和方法

$client->param(['name' => '易航'])->send('http://www.bri6.cn', 'GET');

链式设置方法,最后传入URL和参数

$client->method('GET')->send('http://www.bri6.cn', ['name' => '易航']);

send 方法会自动识别第一个参数是 URL、方法还是参数。同时并不强制要求三个参数全部传入,可以只传入一个或两个参数,并可以通过链式调用的方式进行参数设置。

所以根据不同的参数顺序和参数类型,您可以选择一种简洁清晰和习惯的方式进行请求发送。send 方法力求代码的灵活性,同时也不会造成使用上的困扰。

send 方法核心代码:

class Client
{

    public function send($param1 = null, $param2 = null, $param3 = null)
    {
        $info = $this->_initSend($param1, $param2, $param3);
        if (!empty($info->method)) $this->method($info->method);
        if (!empty($info->url)) $this->url($info->url);
        if ((!empty($info->params)) && is_array($info->params)) $this->param($info->params);

        $this->_initialize();

        $response_body = curl_exec($this->ch);
        $http_code = curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
        $header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE);

        curl_close($this->ch); 

        $response = $this->response = new Response($http_code, $header_size, $response_body);
        return $response;
    }

    private function _initSend($param1, $param2, $param3)
    {
        $url = $this->_isUrl($param1) ?: $this->_isUrl($param2) ?: $this->_isUrl($param3);
        $method = $this->_isMethod($param1) ?: $this->_isMethod($param2) ?: $this->_isMethod($param3); 
        $params = is_array($param1) ?: is_array($param2) ?: is_array($param3);
        return (object) [
            'url' => $url,
            'method' => $method,
            'params' => $params
        ];
    }
}

所以根据不同的参数顺序和参数类型,您可以选择一种简洁清晰和习惯的方式进行请求发送。send 方法力求代码的灵活性,同时也不会造成使用上的困扰。

助手函数

轻HTTP请求库提供以下助手函数:

post()

发送POST请求。用法:

network\http\post($url, $params, $headers, $options)  
  • $url: 请求URL
  • $params: 携带的参数,可以是数组或false
  • $headers: 自定义请求头,数组格式
  • $options: 配置信息,数组格式
    返回response对象。
    示例:
$response = network\http\post('http://www.bri6.cn', ['name' => '易航']);

get()

发送GET请求。用法:

network\http\get($url, $params, $headers, $options)

参数与post()方法相同。

示例:

$response = network\http\get('http://www.bri6.cn', ['category' => 'technology']);

delete()

发送DELETE请求。用法:

network\http\delete($url, $params, $headers, $options)

参数与post()方法相同。 示例:

$response = network\http\delete('http://www.bri6.cn'); 

put()

发送PUT请求。用法:

network\http\put($url, $params, $headers, $options)

参数与post()方法相同。
示例:

$response = network\http\put('http://www.bri6.cn', ['title' => 'Easy']);

patch()

发送PATCH请求。用法:

network\http\patch($url, $params, $headers, $options)

参数与post()方法相同。
示例:

$response = network\http\patch('http://www.bri6.cn', ['views' => 999]);  

获取响应信息

使用响应对象获取响应信息:

$response = $client->get('http://bri6.cn');

可以从响应对象中获取以下信息:

  • $response->code() :获取响应状态码

示例:

$code = $response->code();  // 200
  • $response->header('name') : 获取指定响应头

示例:

$content_type = $response->header('Content-Type');  // application/json
  • $response->headers(): 以数组形式获取所有响应头

示例:

$headers = $response->headers();
/* 
[
    'Content-Type' => 'application/json',
    'X-Powered-By' => 'PHP/7.2.10' 
]
*/
  • $response->body(): 获取原始响应体字符串

示例:

$body = $response->body();
// '{"name": "易航"}'
  • $response->toObject(): 如果响应是JSON,转换为对象

示例:

$data = $response->toObject(); 
// stdClass Object 
// ( 
//     [name] => 易航 
// )
  • $response->toArray(): 如果响应是JSON,转换为数组 示例:
$data = $response->toArray();  
// ['name' => '易航']

显示响应体

可以直接输出响应体:

echo $response; 

或者:

echo $response->body();

这将直接输出响应的原始字符串内容。

示例:

$response = $client->get('http://www.bri6.cn');

echo $response;
// {"id": 25, "title": "Easy PHP", "content": "Some content here", "views": 999}

echo $response->body();  
// {"id": 25, "title": "Easy PHP", "content": "Some content here", "views": 999}

当您直接输出 $response 对象时,PHP会自动调用 __toString() 魔术方法,并返回响应体字符串。 如果响应的内容类型是JSON,调用 toObject() 或 toArray() 方法转换后再输出也是很好的选择:

$data = $response->toArray();
print_r($data);

/* 
[
    "id" => 25, 
    "title" => "Easy PHP", 
    "content" => "Some content here", 
    "views" => 999
]
*/ 

错误与异常

请求过程中发生的curl错误或解析响应时发生的错误将抛出异常,使用try/catch进行捕获。

示例:

try {
    $response = $client->get('http://www.bri6.cn');
} catch (Exception $e) {
    echo $e->getMessage();
    // CURLOPT_URL: Failure (2) 'The requested URL returned error: 404 NOT FOUND'
}

轻HTTP请求库使用了GuzzleHttp作为底层HTTP客户端,所以会抛出GuzzleHttp相关的异常,常见的有:

  • ConnectionException: 连接异常
  • RequestException: 请求异常
  • ClientException: 客户端错误(4xx响应)
  • BadResponseException: 服务器错误(5xx响应)
  • TooManyRedirectsException: 重定向过多异常

所有的异常都继承自Exception,可以使用try/catch捕获。 当解析响应JSON数据时发生错误,也会抛出异常:

try {
    $data = $response->toObject();
} catch (InvalidJsonException $e) {
    echo $e->getMessage();
    // Syntax error, malformed JSON
}

InvalidJsonException异常是由轻HTTP请求库自己抛出的,用于表明响应JSON数据格式错误。

错误和异常处理是开发一个健全的应用很重要的一环,希望这个错误与异常页面能帮助您更好地处理轻HTTP请求库可能产生的各种异常情况。如果您有任何疑问,请告知我。

其他

另外,如果需要对请求库进行定制开发,可以继承Client类并重写send()方法:

namespace network\http;

class CustomClient extends Client
{
    public function send($url, $params, $headers)
    {
        // 定制发送请求的逻辑
        // 调用parent::send($url, $params, $headers)发送请求
    }
}

然后通过 new CustomClient() 使用定制的客户端。

希望这个HTTP客户端库和使用文档能为您提供帮助!如果有任何问题请提Issue或Pull Request。

我会持续更新文档,完整记录轻HTTP请求库的所有功能和用法。如果文档的任何部分不够详尽,请提Issue告知我。

希望这个简洁实用的轻HTTP请求库和配套文档能为广大PHP开发者提供更多便捷!

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容