jwh0968 / simple-concurrent-request-client
一个基于guzzlehttp实现的并发请求客户端,通过此客户端可以完成并发请求多个接口并统一获取返回结果
1.1.2
2021-03-15 09:16 UTC
Requires
- guzzlehttp/guzzle: ^6.5.2
This package is auto-updated.
Last update: 2024-09-15 17:25:31 UTC
README
SimpleConcurrentRequestClient是对guzzle的简单封装,可以方便地实现多个接口调用的并发执行并方便获取每个调用的结果。
安装
composer require jwh0968/simple-concurrent-request-client
版本记录
版本v1.1.1临时修复了一个bug,为当前最新版本,建议更新到此版本。此版本修复了在RequestClient
中配置的header
、user-agent
等参数不能在并发请求中生效的问题,修复后,可以通过RequestClient
统一配置header
中的参数,并增加了一个setPromise
方法,可以直接传入一个Promise
,若使用了此方法,则setRequest方法提供的请求将无效。
版本v1.1增加了针对https是否校验的方法,以及自定义client配置的方法。
以下应用场景比较适合
- 许多HTTP接口需要调用,并且每个接口的调用对其他接口调用结果没有依赖性。
- 多种第三方接口调用,每种接口有不同的处理逻辑。
一个简单的应用场景
use SimpleConcurrent\SimpleRequest; use SimpleConcurrent\RequestClient; use GuzzleHttp\Psr7\Request; /* 创建一个请求并使用自动的json格式转化 */ $req1 = new SimpleRequest(); $req1->setRequest(new Request('GET', 'http://developerhome.net/json/test.json'))->responseIsJson(); /* 初始化客户端 */ $client = new RequestClient(); /* 传入请求 */ $client->addRequest($req1); /* 执行传入的所有请求,当前只有一个 */ $client->promiseAll(); /* 打印结果, 将返回是一个数组 */ var_dump($req1->getResponse()->getResult());
多个请求同时调用
use SimpleConcurrent\SimpleRequest; use SimpleConcurrent\RequestClient; use GuzzleHttp\Psr7\Request; /* 创建几个请求 */ /* 创建一个请求并使用自动的json格式转化 */ $req1 = new SimpleRequest(); $req1->setRequest(new Request('GET', 'http://developerhome.net/json/test.json'))->responseIsJson(); /* 创建一个请求但不使用自动的json格式转化 */ $req2 = new SimpleRequest(); $req2->setRequest(new Request('GET', 'http://developerhome.net/json/test1.json')); /* 创建一个不存在的URL请求 */ $reqError = new SimpleRequest(); $reqError->setRequest(new Request('GET', 'http://developerhome.net/json/no_exists_file')); /* 初始化客户端 */ $client = new RequestClient(); /* 传入请求 */ $client->addRequest($req1)->addRequest($req2)->addRequest($reqError); /* 并发调用 */ $client->promiseAll(); /* 打印结果, 请求1,将返回是一个数组 */ var_dump($req1->getResponse()->getResult()); /* 打印结果,请求2,将返回是字符串 */ var_dump($req2->getResponse()->getResult()); /* 打印结果,请求3为失败,结果为null */ var_dump($reqError->getResponse()->isFail(), $reqError->getResponse()->getResult()); /* 获取失败原因 */ $failedReason = $reqError->getResponse()->getFail(); /* 查看失败的结果类型 */ /* 客户端默认不会处理错误,将会把抛出的异常赋值给响应的错误结果 */ if (is_object($failedReason)) { var_dump(get_class($failedReason)); /* 如果是连接错误,将可以通过getCode获取到http code */ if ($failedReason instanceof ClientException) { var_dump($failedReason->getCode()); } } else { var_dump($failedReason); }