shetabit / extractor
一个用于在Laravel应用中在`micro services`之间通信的`micro client`生成器
Requires
- php: >=7.2
- guzzlehttp/guzzle: 6.2.*|7.*
- illuminate/broadcasting: 5.8.*|6.*|7.*|8.*|9.*|10.*
- illuminate/support: 5.8.*|6.*|7.*|8.*|9.*|10.*
Requires (Dev)
- orchestra/testbench: >=4.3 <5.0
- phpunit/phpunit: ^8.4
- squizlabs/php_codesniffer: ^3.5
README
Laravel Extractor
以简单的方式与远程服务器或微服务通信。
所有请求和响应都可以在运行时使用中间件进行缓存和操作。
赞助我 如果你喜欢这个包 😎
内容列表
安装
通过Composer
$ composer require shetabit/extractor
如果你使用的是 Laravel 5.5
或更高版本,则不需要添加提供者和别名。
在你的 config/app.php
文件中添加以下行。
# In your providers array. 'providers' => [ ... Shetabit\Extractor\Providers\ExtractorServiceProvider::class, ]
如何使用
发送请求
你可以使用 Request
类向远程API发送请求,以下是一个示例
// at the top use Shetabit\Extractor\Classes\Request; //... // create new request $request = new Request(); // set api's url and method $request->setUri($url)->setMethod('get'); // run the request and get data $response = $request->fetch(); var_dump($response); // show given response
正如你所见,你可以轻松地与远程API一起工作。
Request
有更多方法来添加 fields
、headers
等。
use Shetabit\Extractor\Classes\Request; //... $request = new Request(); # Example 1: $request ->setUri('http://your-site.com') ->setMethod('post') // add some headers ->addHeader('Authorization', "Bearer dfaerfaeaeva1351adsfaecva") ->addHeader('Accept', 'application/json') // add form parameters ->addFormParam('email', $email) ->addFormParam('password', $password); $response = $request->fetch(); // run request # Example 2: $request ->setUri('http://your-site.com') ->setMethod('get') // add query string ->addQuery('page', $page) ->addQuery('s', $search); $response = $request->fetch(); // run request
发送并发请求
你可以像下面这样发送并发请求
use Shetabit\Extractor\Classes\Request; use Shetabit\Extractor\Contracts\RequestInterface; // ... $request = new Request; $responses = $request ->createBag() ->addRequest(function(RequestInterface $request) { $request->setUri('http://google.com/'); }) ->addRequest(function(RequestInterface $request) { $request->setUri('http://bing.com/'); }) ->fetch();
事件监听器
你可以为每个请求单独设置 success
和 error
监听器。下面是一个使用 onSuccess
和 onError
监听器的示例。
use Shetabit\Extractor\Classes\Request; use Shetabit\Extractor\Contracts\RequestInterface; // ... $request = new Request; # Example 1: using on success $response = $request ->setUri('http://google.com/') ->onSuccess(function (ResponseInterface $response, RequestInterface $request) { echo $response->getBody(); }) ->fetch(); # Example 2: using on error $response = $request ->setUri('http://yahoo.com/') ->onSuccess(function (ResponseInterface $response, RequestInterface $request) { echo 'success'; }) ->onError(function (ResponseInterface $response, RequestInterface $request) { echo 'fail'; }); # Example 3: using request's bag $response = $request ->createBag() ->addRequest(function (RequestInterface $request) { $request ->setUri('http://google.com/') ->onSuccess(function (ResponseInterface $response, RequestInterface $request) { echo $response->getBody(); }); }) ->addRequest(function (RequestInterface $request) { $request ->setUri('http://yahoo.com/') ->onSuccess(function (ResponseInterface $response, RequestInterface $request) { echo 'success'; }) ->onError(function (ResponseInterface $response, RequestInterface $request) { echo 'fail'; }); }) ->fetch();
中间件
如何创建
可以通过运行以下命令创建中间件
php artisan make:extractor-middleware test
前面的命令将在 app\Http\RemoteRequests\Middlewares
路径中创建一个名为 test
的中间件。
你可以像下面这样将中间件添加到请求中
$request ->setUri('http://your-site.com') ->setMethod('get') ->middleware(new AuthMiddleware) ->fetch();
可以通过多次调用 middleware
方法来使用多个中间件
$request ->setUri('http://your-site.com') ->setMethod('get') ->middleware(new Test1) ->middleware(new Test2) ->fetch();
每个中间件都有一个 handle
方法,可以用来处理请求和响应。
以下中间件将在请求被应用程序处理之前执行一些任务
public function handle($request, Closure $next) { if($user->name == 'john') { $request->addQuery('name', 'john'); } return $next($request); }
然而,这个中间件将在请求被应用程序处理后执行其任务
public function handle($request, Closure $next) { $response = $next($request); // Perform action return $response; }
全局中间件
你可以使用 Request::withGlobalMiddlewares
添加全局中间件。全局中间件将绑定到所有请求。
// in your AppServiceProvider protected boot() { Request::withGlobalMiddlewares([ // list of middlewares ]); }
在每个请求中,你可以解绑全局中间件,如果你需要它们,只需使用 withoutMiddleware
如下所示
// at the top use Shetabit\Extractor\Classes\Request; $url = 'http://google.com/'; $response = (new Request) ->setUri($url) ->withoutMiddleware(new TestMiddleware) ->fetch();
缓存
你可以根据请求缓存响应。
// at the top use Shetabit\Extractor\Classes\Request; $url = 'http://google.com/'; $ttl = 5; // 5 seconds $response = (new Request)->setUri($url)->cache($ttl)->fetch();
注意: TTL
(生存时间)与 Laravel
缓存相同。
// at the top use Shetabit\Extractor\Classes\Request; $url = 'http://google.com/'; $ttl = now()->addMinutes(10); // 10 minutes $response = (new Request)->setUri($url)->cache($ttl)->fetch();
条件配置
有时当某个条件发生时需要添加一些配置,在这种情况下,你可以使用 when
方法添加条件配置。
# Example 1: simple $request ->when('condition1', function($request) { $request ->setUri('http://your-site.com') ->setMethod('get') ->middleware(new AuthMiddleware); }); // Example 2: nested $request ->when('condition1', function($request) { $request ->setUri('http://your-site.com') ->setMethod('get') ->middleware(new AuthMiddleware); }) ->when('condition2', function($request) { $request ->setUri('http://shop-site.com') ->setMethod('get'); }) ->whenNot('condition3', function($request) { $request ->setUri('http://shop-site.com') ->setMethod('patch') ->when('condition4', function($request) { $request->setMethod('delete'); // sets method to delete }); }) ->fetch();
客户端
你可以在一个 Client
中封装任何存在于 当前微服务 和 远程微服务 之间的请求。
创建客户端
可以使用简单的命令创建客户端
php artisan make:extractor-client clientName
默认情况下,客户端将保存在 app/Http/RemoteRequests/Clients
。
让我们创建一个示例,假设你有一个远程API(或微服务)并且需要登录到它。
那么,你的登录微客户端可能类似于以下代码
namespace App\Http\RemoteRequests\Clients\Auth; use Shetabit\Extractor\Abstracts\MicroClientAbstract; use Shetabit\Extractor\Contracts\ResponseInterface; class Login extends MicroClientAbstract { protected $mobile; protected $password; public function __construct($username, $password = null) { $this->username = $username; $this->password = $password; parent::__construct(); } /** * Get requests' endpoint * * @return string */ protected function getEndPoint() { return 'http://yoursite.com/api/v1/auth'; } /** * Run client * * @return ResponseInterface * @throws \Exception */ public function run() : ResponseInterface { $response = $this ->request ->setUri($this->getEndPoint()) ->setMethod('post') ->addFormParam('username', $this->username) ->addFormParam('password', $this->password) ->fetch(); return $response; } }
运行客户端
你可以像下面这样运行 Login
微客户端(我们在上面的示例中有一个登录客户端示例)
// dump data $username = 'test'; $password = 'something'; $client = new Login($username, $password); // run client and login into remote service (remote api) $response = $client->run(); // dump show response's body var_dump($response->getBody());
正如你所见,客户端开始工作,当你调用 run
方法时,获取并返回一个响应。
进度功能
- 内部错误异常
- 资源和API资源客户端
- 代理请求到另一台服务器(中间件)
变更日志
有关最近更改的详细信息,请参阅变更日志。
贡献
安全性
如果您发现任何安全相关的问题,请通过khanzadimahdi@gmail.com发送电子邮件,而不是使用问题跟踪器。
致谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。