该工具仅仅只是将php自带的curl功能,进行了一层封装。使得一些日常使用http请求时,不需要去重复的配置curl信息,减少开发工作量。
导入使用
下载链接:https://download.csdn.net/download/d745282469/85030673
如果是用的TP框架,则可在public/index.php
中按照以下方式进行导入:
namespace think;
require __DIR__ . '/../vendor/autoload.php';
// HTTP请求工具,具体的路径以实际为准
require __DIR__. '/../extend/HttpTool/AutoLoad.php';
// 执行HTTP应用并响应
$http = (new App())->http;
$response = $http->run();
$response->send();
$http->end($response);
非TP框架的话,在需要使用到的php文件中,在顶部加入以下代码即可:
require __DIR__. '/../extend/HttpTool/AutoLoad.php';
具体的路径,以实际为准。
使用前须知
确定当前的php已经开启了curl扩展!!!
每个请求,主要涉及到以下两个类:
DHttpClient:请求客户端,主要用于配置代理、https验证、ssl证书、http版本等,具体可查看该类提供的方法。
DRequestBuilder:请求体构造器,主要用于配置请求相关的参数,如:请求地址、请求方式、请求头、请求cookie等。
DRequest:由DRequestBuilder构造得出,没啥用,只是给DHttpClient去使用的,和Builder基本一样。
发送请求
get请求
// 请求地址
$url = 'htts://www.baidu.com';
// 请求参数,如果为get请求,会自动把参数拼接到请求地址中
$param['wd'] = 'PHP官方文档';
// 请求构造器
$requestBuilder = new DRequestBuilder($url);
// 可以采用链式写法。paramData()是用于设置请求参数的,接收的是数组类型。
// get()表示该请求使用get方式,同理还有post()。如果不指定请求方式,默认为get
$requestBuilder->paramData($param)->get();
// 实例化请求客户端
$client = new DHttpClient();
// 执行请求并获取结果
$response = $client->execute($requestBuilder->build());
post请求
// 请求地址
$url = 'htts://www.xxx.com';
// 请求参数,如果为get请求,会自动把参数拼接到请求地址中
$param['wd'] = 'PHP官方文档';
// 请求构造器
$requestBuilder = new DRequestBuilder($url);
// 可以采用链式写法。paramData()是用于设置请求参数的,接收的是数组类型。
// 注意这里写的是post(),如果漏写则会默认用get()
$requestBuilder->paramData($param)->post();
// 实例化请求客户端
$client = new DHttpClient();
// 执行请求并获取结果
$response = $client->execute($requestBuilder->build());
添加请求头
设置请求头时,主要是对构造器,即DRequestBuilder,使用addHeader()方法。该方法接收一个DHeader对象。
以下举例,访问一个需要带token的接口时的一个例子。
$url = '请求地址';
$param = ['请求参数'];
$requestBuilder = new DRequestBuilder($url);
// DHeader对象,构造函数接收两个参数,一个是Header的key,一个是Header对应的value
$requestBuilder->addHeader(new DHeader('token','实际的token值'))->post();
$client = new DHttpClient();
$response = $client->execute($requestBuilder->build());
重复设置相同key的请求头,工具不会自动进行覆盖!!!具体发出去的请求是什么样的,没有测试过。
添加cookie
设置cookie,主要使用到的是DRequestBuilder下面的addCookie()方法。该方法接收一个DCookie对象参数。
$url = '请求地址';
$param = ['请求参数'];
$requestBuilder = new DRequestBuilder($url);
// DCookie对象,构造函数接收两个参数,一个是Cookie的key,一个是Cookie对应的value
$requestBuilder->addCookie(new DCookie('cookie的key','对应的cookie的value'))->post();
$client = new DHttpClient();
$response = $client->execute($requestBuilder->build());
某些接口需要申明ContentType的特殊情况
工具内置了两个常见的ContentType,一个是application/x-www-form-urlencoded,一个是application/json。
对应的使用方法参考下面的例子:
$requestBuilder = new DRequestBuilder('请求地址');
// 此时工具会自动处理,加上请求头:Content-Type:application/json,并对请求参数进行处理
$requestBuilder->jsonData(数组类型的请求参数);
// 此时工具会自动处理,加上请求头:Content-Type:application/x-www-form-urlencoded,并对请求参数进行处理
$requestBuilder->urlEncodeData(数组类型的请求参数);
如果没有使用以上两种方式设置ContentType,并且同时没有调用addHeader去设置的话,那么默认的请求头中是没有ContentType的。这种情况,对于有些接口,可能会导致接口提示缺少参数或参数错误之类的错误信息。
出现这种情况,是因为没设置ContentType时,工具会将请求参数转换成字符串的形式。然后对于有些接口的服务端那边,由于识别不到ContentType,所以无法确定传过去的字符串需要用什么方式去解析,导致解析不出来参数,因此报错。
获取响应结果
当调用DHttpClient的execute()方法后,会返回一个DResponse对象。对象中,主要有以下几个属性:
statusCode:HTTP响应状态码
responseStr:响应内容的字符串形式
cookieList:包含接口返回的DCookie对象的一个数组,默认为空
header:包含响应头DHeader对象的一个数组,默认为空
获取特定的响应头
使用DResponse->getHeader()方法。该方法接收一个key,用于判断需要获取哪一个响应头。
以下举例获取HTTP状态码为304重定向时,需要获取重定向后的地址,那么就需要用到该方法。
$newUrl = $response->getHeader('Location');