ivan770 / laravel-httpclient
Symfony HttpClient <3 Laravel
4.0.0
2020-12-08 12:09 UTC
Requires
- illuminate/support: ^8.0
- symfony/browser-kit: ^5.2
- symfony/http-client: ^5.2
Requires (Dev)
- illuminate/cache: ^8.0
- illuminate/container: ^8.0
- illuminate/pipeline: ^8.0
Suggests
- illuminate/cache: Required to use response caching
- illuminate/console: Required to create requests with artisan
- illuminate/container: Required to use pipelines
- illuminate/pipeline: Allows to send response data through pipelines
README
安装
composer require ivan770/laravel-httpclient
使用
// Obtaining instance via Facade alias use HttpClient; // You can use Facade class to access HttpClient use Ivan770\HttpClient\Facades\HttpClient; // Or, you can obtain HttpClient instance directly use Ivan770\HttpClient\HttpClient; public function method(HttpClient $client)
发送请求
您还可以使用Symfony HttpClient 文档
$response = $client->get("https://example.com"); $response = $client->get("https://example.com", ["query" => ["key" => "value"]]); $response->getContent(); // Get response body, or collection, if response is JSON $response->toCollection(); // Transform JSON response to collection $response->getStatusCode(); // Get response status code $response->getHeaders(); // Get response headers // You can use HTTP request methods as client methods $client->head("https://example.com"); $client->post("https://example.com", ["body" => ["key" => "value"]]); $client->post("https://example.com", ["json" => ["key" => "value"]]); $client->put("https://example.com"); $client->delete("https://example.com");
使用 Request 类
HttpClient 提供创建 "请求类" 的能力。
php artisan make:http HttpBinGet
<?php use Ivan770\HttpClient\HttpClient; use Ivan770\HttpClient\Request\Request; use Ivan770\HttpClient\Response\MockResponse; class HttpBinGet extends Request { // Request URL protected $resource = "https://httpbin.org/get"; // Request method protected $method = "GET"; // This method is called on request init. // Here, you are able to use builder to modify your request protected function defaultAttach(HttpClient $client) { $client->authBearer("test"); } protected function tests() { return [ "success" => MockResponse::make("Hello World!"), ]; } } // Execute request app(HttpBinGet::class)->execute(); // Execute request and receive result app(HttpBinGet::class)->get(); // Modify request using "attach" method. app(HttpBinGet::class)->attach(function (HttpClient $client) { $client->headers(["test" => true]); })->execute(); // Request also forwards calls to HttpClient app(HttpBinGet::class)->headers(["test" => true])->execute(); // Mock responses $response = app(HttpBinGet::class)->mock("success"); $response->getContent(); // "Hello World!" $response->getStatus(); // 200 $response->getHeaders(); // []
BrowserKit 使用
<?php use Ivan770\HttpClient\Request\Request; use Ivan770\HttpClient\Contracts\PassToBrowserKit; // Just implement PassToBrowserKit contract to start using BrowserKit class HttpBinGet extends Request implements PassToBrowserKit { // Request URL protected $resource = "https://httpbin.org/get"; // Request method protected $method = "GET"; }
请求构建器
您可以直接将请求参数发送到客户端方法,也可以使用流畅的请求构建器。
// Add data to request $client->query(["key" => "value"])->get("https://example.com") $client->body(["key" => "value"])->post("https://example.com") $client->json(["key" => "value"])->post("https://example.com") // Add custom headers to request $client->headers(["key" => "value"])->get("https://example.com"); // Ignore redirects $client->withoutRedirects()->get("https://example.com"); // Proxy $client->proxy("https://hostname:8080")->get("https://example.com"); // Authentication $client->auth("auth_basic", ["username", "password"])->get("https://example.com"); $client->authBasic(["username", "password"])->get("https://example.com"); $client->authBearer("tokenhere")->get("https://example.com");
Arrayable 解析
您可以使用任何 Arrayable 类(Eloquent 模型、集合等)作为请求的数据源。
$model = User::find(1); $client->parse($model)->post("https://example.com");
数据管道
如果已安装 illuminate/pipeline
,您可以通过管道发送数据。如果没有安装,您仍然可以将数据传递到闭包。
$response = $client->get("https://example.com"); // Pass data to Closure $response->then(function ($data) { return $data; }); // Use Laravel pipelines $pipes = [ ExamplePipe::class ]; $response->pipeline()->through($pipes)->then(function ($data) { return $data; });