简介
轻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实现,性能优秀。
觉得本项目不错的话可以帮忙点一下星星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开发者提供更多便捷!
暂无评论内容