ivan770/laravel-httpclient

Symfony HttpClient <3 Laravel

4.0.0 2020-12-08 12:09 UTC

This package is auto-updated.

Last update: 2024-09-08 20:35:15 UTC


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;
});