wendelladriel/laravel-caller

轻松创建外部服务的 HTTP 客户端

v1.0.0 2022-11-16 13:06 UTC

This package is auto-updated.

Last update: 2024-09-18 20:12:39 UTC


README

轻松创建外部服务的 HTTP 客户端

安装

composer require wendelladriel/laravel-caller

使用以下命令发布配置文件

php artisan vendor:publish --provider="WendellAdriel\LaravelCaller\LaravelCallerServiceProvider" --tag=config

用法

此包为 Laravel 的 HTTP 客户端提供包装器,以便以简单的方式创建外部服务的客户端。

首先,您需要在 config/caller.php 文件中配置一个或多个服务,默认文件中有一个 default 服务的示例,您可以根据该示例进行配置或创建新的服务

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | SERVICES
    |--------------------------------------------------------------------------
    |
    | Here you can configure multiple services that you want to create an HTTP Client for.
    | The auth types supported are: basic, digest and token.
    | For more information on these settings check: https://laravel.net.cn/docs/http-client
    |
    */
    'services' => [
        'default' => [
            'url'            => env('CALLER_DEFAULT_URL', 'https://example.com'),
            'timeout'        => env('CALLER_DEFAULT_TIMEOUT', 30),
            'retries'        => env('CALLER_DEFAULT_RETRIES', 0),
            'retry_after'    => env('CALLER_DEFAULT_RETRY_AFTER', 100),
            'cookies_domain' => env('CALLER_DEFAULT_COOKIES_DOMAIN', 'https://example.com'),

            'auth' => [
                'type'       => env('CALLER_DEFAULT_AUTH_TYPE', 'basic'),
                'user'       => env('CALLER_DEFAULT_AUTH_USER', 'me@example.com'),
                'password'   => env('CALLER_DEFAULT_AUTH_PASSWORD', 's3Cr3T'),
                'token'      => env('CALLER_DEFAULT_AUTH_TOKEN'),
                'token_type' => env('CALLER_DEFAULT_AUTH_TOKEN_TYPE', 'Bearer'),
            ],

            'headers' => [
                // ADD HEADERS HERE
                // 'X-First' => 'FOO',
            ],

            'cookies' => [
                // ADD COOKIES HERE
                // 'FOO' => 'BAR',
            ],
        ],
    ],
];

配置完您的服务后,只需在 config 文件中创建一个具有服务 name/keyCaller 类。例如,要创建一个连接到 Twitter 服务的客户端,您可以使用

<?php

namespace App;

use WendellAdriel\LaravelCaller\Caller;

// YOUR CODE HERE

$twitterClient = new Caller('twitter');
// OR YOU CAN USE THE STATIC METHOD
$twitterClient = Caller::make('twitter');

如果您想为 default 服务创建一个 Caller 类,您不需要传递任何参数

<?php

namespace App;

use WendellAdriel\LaravelCaller\Caller;

// YOUR CODE HERE

$twitterClient = new Caller();
// OR YOU CAN USE THE STATIC METHOD
$twitterClient = Caller::make();

发送请求

使用 Caller 类,您可以访问 Laravel HTTP 客户端相同的所有方法:headgetpostputpatchdelete。它们都具有相同的签名。以下是一个获取方法的签名示例

<?php

/**
 * @param string $url      - The URL for the request that will be joined with the base URL configured in the service
 * @param array  $params   - The params to be sent to the request
 * @param bool   $asForm   - If the request should be sent as "application/x-www-form-urlencoded"
 * @param bool   $isPublic - If is set to true the auth won't be configured for the request
 * @param array  $headers  - Specific headers for the request that will be merged with the headers configured in the service
 * @param array  $cookies  - Specific cookies for the request that will be merged with the cookies configured in the service
 * @param bool   $debug    - Dumps the outgoing request before it is sent and terminate the script's execution
 * @return Response
 */
public function get(
    string $url,
    array $params,
    bool $asForm = false,
    bool $isPublic = false,
    array $headers = [],
    array $cookies = [],
    bool $debug = false
): Response

更新服务

如果您想在发送新请求之前使用相同的 Caller 对象与不同的服务,可以调用 setService 方法,并传入您想要的服务 name/key

<?php

namespace App;

use WendellAdriel\LaravelCaller\Caller;

// YOUR CODE HERE

$client = new Caller(); // USES THE DEFAULT SERVICE
$client->setService('twitter'); // CHANGES TO THE TWITTER SERVICE

使用不同的认证凭证

默认情况下,Caller 对象将使用在 config 文件中设置的 auth typecredentials。如果您需要根据登录用户使用不同的认证凭证(例如),可以使用 setAuthUsersetAuthPasswordsetAuthToken 方法来覆盖这些凭证

发送附件

如果您需要在请求中发送一个 attachment,在调用请求之前使用 setAttachment 方法。这将只添加附件到您的下一个请求。该方法接收一个 CallerAttachment 对象

<?php

namespace App;

use WendellAdriel\LaravelCaller\Caller;
use WendellAdriel\LaravelCaller\CallerAttachment;

// YOUR CODE HERE

$client = new Caller();
$client->setAttachment(new CallerAttachment('file', file_get_contents('photo.jpg'), 'photo.jpg'));

// THE ATTACHMENT CAN ALSO USE A STREAM RESOURCE AND CAN BE CREATED IN A STATIC WAY
$file = fopen('photo.jpg', 'r');
$client->setAttachment(CallerAttachment::make('file', $file, 'photo.jpg'));

待办事项

  • 创建测试

致谢

贡献

欢迎所有 PR。

对于重大更改,请首先打开一个问题,描述您想要添加/更改的内容。