国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用 Laravel 的 Http Facade(門(mén)面) 簡(jiǎn)化 API 集成

構(gòu)建可重用的 API 請(qǐng)求和客戶端類(lèi)

最近一直致力于集成第三方 API。有多種不同的方法可以實(shí)現(xiàn)此目的,例如使用第三方提供的 SDK。然而,我覺(jué)得堅(jiān)持 Laravel 的Http外觀通常是更好的選擇。通過(guò)使用Http外觀,所有第三方集成都可以具有類(lèi)似的結(jié)構(gòu),并且測(cè)試和模擬變得更加容易。此外,您的應(yīng)用程序?qū)⒕哂懈俚囊蕾?lài)項(xiàng)。您不必?fù)?dān)心如何使 SDK 保持最新?tīng)顟B(tài),也不必?fù)?dān)心 SDK 不再受支持時(shí)該怎么辦。

使用 集成  Google Books API 作為示例,創(chuàng)建一個(gè)可重用的客戶端和請(qǐng)求類(lèi),以使 API 的使用變得非常簡(jiǎn)單

讓我們開(kāi)始吧!

Laravel 的 Http Facade(門(mén)面) 簡(jiǎn)化 API 集成

將 Google Books 配置添加到 Laravel

現(xiàn)在我們有了 API 密鑰,我們可以將其.env與 API URL 一起添加到中。

GOOGLE_BOOKS_API_URL=https://www.googleapis.com/books/v1
GOOGLE_BOOKS_API_KEY=[API KEY FROM GOOGLE]

在此示例中,我存儲(chǔ)了從 Google Cloud 控制臺(tái)獲取的 API 密鑰,但我們將訪問(wèn)的 API 部分不需要該密鑰。對(duì)于更高級(jí)的 API 使用,您需要與 Google 的 OAuth 2.0 服務(wù)器集成,并創(chuàng)建也可以存儲(chǔ)在文件中的客戶端 ID 和密鑰.env。這超出了本文的范圍。

環(huán)境變量就位后,打開(kāi) config/services.php 文件并添加 Google Books 的部分。

'google_books' => [
    // 從 .env 檢索的 Google Books API 的基本 URL
    'base_url' => env('GOOGLE_BOOKS_API_URL'),
    // Google Books API 的 API 密鑰,從 .env 檢索
    'api_key' => env('GOOGLE_BOOKS_API_KEY'),
],

創(chuàng)建 ApiRequest 類(lèi)

當(dāng)向 API 發(fā)出請(qǐng)求時(shí),我發(fā)現(xiàn)使用一個(gè)簡(jiǎn)單的類(lèi)來(lái)設(shè)置我需要的任何請(qǐng)求屬性是最簡(jiǎn)單的。

下面是一個(gè)ApiRequest類(lèi)的示例,我用它來(lái)傳遞 URL 信息以及正文、標(biāo)頭和任何查詢(xún)參數(shù)??梢暂p松修改或擴(kuò)展此類(lèi)以添加附加功能。

<?php

namespace App\Support;

/**
  * ApiRequest 類(lèi)是一個(gè)用于構(gòu)建對(duì) API 的 HTTP 請(qǐng)求的實(shí)用程序。
  * 提供設(shè)置HTTP方法、URI、標(biāo)頭、查詢(xún)的方法
  * 請(qǐng)求的參數(shù)和正文。
  * 它還提供了獲取這些屬性的方法,以及
  * 清除標(biāo)頭、查詢(xún)參數(shù)和正文。
  * 此外,它還提供了創(chuàng)建ApiRequest實(shí)例的靜態(tài)方法
  * 對(duì)于特定的 HTTP 方法。
  */
class ApiRequest
{
    // 存儲(chǔ)將與 API 請(qǐng)求一起發(fā)送的標(biāo)頭。
    protected array $headers = [];

    //存儲(chǔ)任何查詢(xún)字符串參數(shù)。
    protected array $query = [];

    // 存儲(chǔ)請(qǐng)求的正文。
    protected array $body = [];

    /**
     * 為給定的 HTTP 方法和 URI 創(chuàng)建 API 請(qǐng)求。
     */
    public function __construct(protected HttpMethod $method = HttpMethod::GET, protected string $uri = '')
    {
    }

    /**
      * 設(shè)置請(qǐng)求的標(biāo)頭。
      * 這接受鍵和值,或鍵/值對(duì)數(shù)組。
      */
    public function setHeaders(array|string $key, string $value = null): static
    {
        if (is_array($key)) {
            $this->headers = $key;
        } else {
            $this->headers[$key] = $value;
        }

        return $this;
    }

    /**
      * 清除請(qǐng)求的標(biāo)頭。
      * 該方法可以清除請(qǐng)求中的特定標(biāo)頭或所有標(biāo)頭,如果
      * 不提供鑰匙。
      */
    public function clearHeaders(string $key = null): static
    {
        if ($key) {
            unset($this->headers[$key]);
        } else {
            $this->headers = [];
        }

        return $this;
    }

    /**
      * 設(shè)置請(qǐng)求的查詢(xún)參數(shù)。
      * 這接受鍵和值,或鍵/值對(duì)數(shù)組。
      */
    public function setQuery(array|string $key, string $value = null): static
    {
        if (is_array($key)) {
            $this->query = $key;
        } else {
            $this->query[$key] = $value;
        }

        return $this;
    }

    /**
     * 清除請(qǐng)求的查詢(xún)參數(shù)。
     * 該方法可以清除某個(gè)參數(shù)或者某個(gè)按鍵的所有參數(shù)
     * 不提供。
     */
    public function clearQuery(string $key = null): static
    {
        if ($key) {
            unset($this->query[$key]);
        } else {
            $this->query = [];
        }

        return $this;
    }

    /**
     * 設(shè)置請(qǐng)求的正文數(shù)據(jù)。
     * 這接受鍵和值,或鍵/值對(duì)數(shù)組。
     */
    public function setBody(array|string $key, string $value = null): static
    {
        if (is_array($key)) {
            $this->body = $key;
        } else {
            $this->body[$key] = $value;
        }

        return $this;
    }

    /**
     * 清除請(qǐng)求的正文數(shù)據(jù)。
     * 該方法可以清除特定鍵的數(shù)據(jù)或全部數(shù)據(jù)。
     */
    public function clearBody(string $key = null): static
    {
        if ($key) {
            unset($this->body[$key]);
        } else {
            $this->body = [];
        }

        return $this;
    }

    /**
     * 此方法返回 API 請(qǐng)求的標(biāo)頭。
     */
    public function getHeaders(): array
    {
        return $this->headers;
    }

    /**
     * 此方法返回 API 請(qǐng)求的查詢(xún)。
     */
    public function getQuery(): array
    {
        return $this->query;
    }

    /**
     * 此方法返回 API 請(qǐng)求的正文。
     */
    public function getBody(): array
    {
        return $this->body;
    }

    /**
      * 該方法返回API請(qǐng)求的URI。
      * 如果查詢(xún)?yōu)榭?,或者我們有一個(gè)GET請(qǐng)求,可以返回URI
      * 按原樣。
      * 否則,我們需要將查詢(xún)字符串附加到 URI 中。
      */
    public function getUri(): string
    {
        if (empty($this->query) || $this->method === HttpMethod::GET) {
            return $this->uri;
        }

        return $this->uri.'?'.http_build_query($this->query);
    }

    /**
     * This method returns the HTTP method for the API request.
     */
    public function getMethod(): HttpMethod
    {
        return $this->method;
    }

    // 以下方法用于創(chuàng)建特定 HTTP 的 API 請(qǐng)求
    // 方法。

    public static function get(string $uri = ''): static
    {
        return new static(HttpMethod::GET, $uri);
    }

    public static function post(string $uri = ''): static
    {
        return new static(HttpMethod::POST, $uri);
    }

    public static function put(string $uri = ''): static
    {
        return new static(HttpMethod::PUT, $uri);
    }

    public static function delete(string $uri = ''): static
    {
        return new static(HttpMethod::DELETE, $uri);
    }
}

類(lèi)構(gòu)造函數(shù)采用一個(gè)HttpMethod,它只是一個(gè)包含各種 HTTP 方法的簡(jiǎn)單枚舉和一個(gè) URI。

enum HttpMethod: string
{
    case GET = 'get';
    case POST = 'post';
    case PUT = 'put';
    case DELETE = 'delete';
}

有一些輔助方法可以使用 HTTP 方法名稱(chēng)并傳遞 URI 創(chuàng)建請(qǐng)求。最后,還有添加和清除標(biāo)頭、查詢(xún)參數(shù)和正文數(shù)據(jù)的方法。


創(chuàng)建 API 客戶端

現(xiàn)在我們有了請(qǐng)求,我們需要一個(gè) API 客戶端來(lái)發(fā)送它。這是我們可以使用Http門(mén)面的地方。

抽象ApiClient

首先,我們將創(chuàng)建一個(gè)抽象ApiClient類(lèi),該類(lèi)將通過(guò)我們的各種 API 進(jìn)行擴(kuò)展。

<?php

namespace App\Support;

use Illuminate\Http\Client\PendingRequest;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;

/**
 * ApiClient 類(lèi)是一個(gè)用于向 API 發(fā)送 HTTP 請(qǐng)求的抽象基類(lèi)。
 * 它提供了一個(gè)發(fā)送 ApiRequest 的方法,并提供了獲取和授權(quán)基本請(qǐng)求的方法。
 * 子類(lèi)必須實(shí)現(xiàn) baseUrl 方法來(lái)指定 API 的基本 URL。
 */
abstract class ApiClient
{
    /**
     * 發(fā)送 ApiRequest 到 API 并返回響應(yīng)。
     */
    public function send(ApiRequest $request): Response
    {
        return $this->getBaseRequest()
            ->withHeaders($request->getHeaders())
            ->{$request->getMethod()->value}(
                $request->getUri(),
                $request->getMethod() === HttpMethod::GET
                    ? $request->getQuery()
                    : $request->getBody()
            );
    }

    /**
     * 獲取 API 的基本請(qǐng)求。
     * 這個(gè)方法對(duì)于 API 請(qǐng)求有一些有用的默認(rèn)值。
     * 基本請(qǐng)求是一個(gè)具有 JSON 接受、內(nèi)容類(lèi)型為 'application/json' 和 API 的基本 URL 的 PendingRequest。
     * 它還會(huì)針對(duì)非成功的響應(yīng)拋出異常。
     */
    protected function getBaseRequest(): PendingRequest
    {
        $request = Http::acceptJson()
            ->contentType('application/json')
            ->throw()
            ->baseUrl($this->baseUrl());

        return $this->authorize($request);
    }

    /**
     * 授權(quán) API 請(qǐng)求。
     * 這個(gè)方法用于被子類(lèi)重寫(xiě),以提供特定于 API 的授權(quán)。
     * 默認(rèn)情況下,它只是返回給定的請(qǐng)求。
     */
    protected function authorize(PendingRequest $request): PendingRequest
    {
        return $request;
    }

    /**
     * 獲取 API 的基本 URL。
     * 子類(lèi)必須實(shí)現(xiàn)這個(gè)方法來(lái)提供 API 的基本 URL。
     */
    abstract protected function baseUrl(): string;
}

此類(lèi)有一個(gè) getBaseRequest 方法,可以使用外觀創(chuàng)建一些合理的默認(rèn)值 Http 來(lái)創(chuàng)建 PendingRequest. 它調(diào)用authorize我們可以在 Google Books 實(shí)現(xiàn)中重寫(xiě)的方法來(lái)設(shè)置 API 密鑰。

該 baseUrl 方法只是一個(gè)簡(jiǎn)單的抽象方法,我們的 Google Books 類(lèi)將設(shè)置它以使用我們之前設(shè)置的 Google Books API URL。

最后,send 方法是將請(qǐng)求發(fā)送到 API 的方法。它需要一個(gè)ApiRequest參數(shù)來(lái)構(gòu)建請(qǐng)求,然后返回響應(yīng)。

GoogleBooksApi客戶端

創(chuàng)建抽象客戶端后,我們現(xiàn)在可以創(chuàng)建一個(gè)GoogleBooksApiClient來(lái)擴(kuò)展它。

<?php

namespace App\Support;

use Illuminate\Http\Client\PendingRequest;

/**
 * GoogleBooksApiClient 類(lèi)是一個(gè)對(duì) Google Books API 的 ApiClient 基類(lèi)的具體實(shí)現(xiàn)。
 * 它提供了獲取基本 URL 和授權(quán)請(qǐng)求的方法,用于操作 Google Books API。
 */
class GoogleBooksApiClient extends ApiClient
{
    /**
     * 獲取 Google Books API 的基本 URL。
     * 基本 URL 是從 'services.google_books.base_url' 配置值中獲取的。
     */
    protected function baseUrl(): string
    {
        return config('services.google_books.base_url');
    }

    /**
     * 授權(quán) Google Books API 的請(qǐng)求。
     * Google Books API 將 API 密鑰作為名為 'key' 的查詢(xún)參數(shù)接受。
     * API 密鑰是從 'services.google_books.api_key' 配置值中獲取的。
     */
    protected function authorize(PendingRequest $request): PendingRequest
    {
        return $request->withQueryParameters([
            'key' => config('services.google_books.api_key'),
        ]);
    }
}

在這個(gè)類(lèi)中,我們只需要設(shè)置基本URL并配置授權(quán)。對(duì)于 Google Books API,這意味著將 API 密鑰作為 URL 參數(shù)傳遞并設(shè)置空 Authorization 標(biāo)頭。

如果我們有一個(gè)使用不記名授權(quán)的 API,我們可以有authorize如下方法:

protected function authorize(PendingRequest $request): PendingRequest
{
    return $request->withToken(config(services.someApi.token));
}

使用此方法的好處 authorize 是它可以靈活地支持各種 API 授權(quán)方法。


按書(shū)名查詢(xún)書(shū)籍

現(xiàn)在我們有了ApiRequest類(lèi) 和GoogleBooksApiClient,我們可以創(chuàng)建一個(gè)操作來(lái)按標(biāo)題查詢(xún)書(shū)籍。它看起來(lái)像這樣:

<?php

namespace App\Actions;

use App\Support\ApiRequest;
use App\Support\GoogleBooksApiClient;
use Illuminate\Http\Client\Response;

/**
 * QueryBooksByTitle 類(lèi)是一個(gè)從 Google Books API 查詢(xún)書(shū)籍標(biāo)題的操作類(lèi)。
 * 它提供了一個(gè) __invoke 方法,接受一個(gè)標(biāo)題,并返回 API 的響應(yīng)。
 */
class QueryBooksByTitle
{
    /**
     * 從 Google Books API 查詢(xún)書(shū)籍標(biāo)題并返回響應(yīng)。
     * 此方法創(chuàng)建了一個(gè) GoogleBooksApiClient 和一個(gè)針對(duì) 'volumes' 終點(diǎn)的 ApiRequest,
     * 使用給定的標(biāo)題作為 'q' 查詢(xún)參數(shù),并將 'books' 設(shè)置為 'printType' 查詢(xún)參數(shù)。
     * 然后使用客戶端發(fā)送請(qǐng)求并返回響應(yīng)。
     */
    public function __invoke(string $title): Response
    {
        $client = app(GoogleBooksApiClient::class);

        $request = ApiRequest::get('volumes')
            ->setQuery('q', 'intitle:'.$title)
            ->setQuery('printType', 'books');

        return $client->send($request);
    }
}

然后,為了調(diào)用該操作,如果我想查找有關(guān)我剛剛閱讀并強(qiáng)烈推薦的《The Ferryman》一書(shū)的信息,請(qǐng)使用以下代碼片段:

use App\Actions\QueryBooksByTitle;
$response = app(QueryBooksByTitle::class)("The Ferryman");
$response->json();

獎(jiǎng)勵(lì):測(cè)試

下面,我添加了一些用于測(cè)試請(qǐng)求和客戶端類(lèi)的示例。對(duì)于測(cè)試,我使用 Pest PHP,它在 PHPUnit 之上提供了干凈的語(yǔ)法和附加功能。

API請(qǐng)求

<?php

use App\Support\ApiRequest;
use App\Support\HttpMethod;

it('sets request data properly', function () {
    $request = (new ApiRequest(HttpMethod::GET, '/'))
        ->setHeaders(['foo' => 'bar'])
        ->setQuery(['baz' => 'qux'])
        ->setBody(['quux' => 'quuz']);

    expect($request)
        ->getHeaders()->toBe(['foo' => 'bar'])
        ->getQuery()->toBe(['baz' => 'qux'])
        ->getBody()->toBe(['quux' => 'quuz'])
        ->getMethod()->toBe(HttpMethod::GET)
        ->getUri()->toBe('/');
});

it('sets request data properly with a key->value', function () {
    $request = (new ApiRequest(HttpMethod::GET, '/'))
        ->setHeaders('foo', 'bar')
        ->setQuery('baz', 'qux')
        ->setBody('quux', 'quuz');

    expect($request)
        ->getHeaders()->toBe(['foo' => 'bar'])
        ->getQuery()->toBe(['baz' => 'qux'])
        ->getBody()->toBe(['quux' => 'quuz'])
        ->getMethod()->toBe(HttpMethod::GET)
        ->getUri()->toBe('/');
});

it('clears request data properly', function () {
    $request = (new ApiRequest(HttpMethod::GET, '/'))
        ->setHeaders(['foo' => 'bar'])
        ->setQuery(['baz' => 'qux'])
        ->setBody(['quux' => 'quuz']);

    $request->clearHeaders()
        ->clearQuery()
        ->clearBody();

    expect($request)
        ->getHeaders()->toBe([])
        ->getQuery()->toBe([])
        ->getBody()->toBe([])
        ->getUri()->toBe('/');
});

it('clears request data properly with a key', function () {
    $request = (new ApiRequest(HttpMethod::GET, '/'))
        ->setHeaders('foo', 'bar')
        ->setQuery('baz', 'qux')
        ->setBody('quux', 'quuz');

    $request->clearHeaders('foo')
        ->clearQuery('baz')
        ->clearBody('quux');

    expect($request)
        ->getHeaders()->toBe([])
        ->getQuery()->toBe([])
        ->getBody()->toBe([])
        ->getUri()->toBe('/');
});

it('creates instance with correct method', function (HttpMethod $method) {
    $request = ApiRequest::{$method->value}('/');

    expect($request->getMethod())->toBe($method);
})->with([
    [HttpMethod::GET],
    [HttpMethod::POST],
    [HttpMethod::PUT],
    [HttpMethod::DELETE],
]);

測(cè)試ApiRequest檢查是否設(shè)置了正確的請(qǐng)求數(shù)據(jù)以及是否使用了正確的方法。


API客戶端

測(cè)試ApiClient會(huì)稍微復(fù)雜一些。由于它是一個(gè)抽象類(lèi),我們將在函數(shù)中使用匿名類(lèi)beforeEach來(lái)創(chuàng)建一個(gè)客戶端來(lái)使用該擴(kuò)展ApiClient。

請(qǐng)注意,我們也使用該Http::fake()方法。這會(huì)在Http外觀上創(chuàng)建模擬,我們可以對(duì)其進(jìn)行斷言并防止在測(cè)試中發(fā)出 API 請(qǐng)求。

<?php

use App\Support\ApiClient;
use App\Support\ApiRequest;
use App\Support\HttpMethod;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;

beforeEach(function () {
    Http::fake();

    $this->client = new class extends ApiClient
    {
        protected function baseUrl(): string
        {
            return 'https://example.com';
        }
    };
});

it('sends a get request', function () {
    $request = ApiRequest::get('foo')
        ->setHeaders(['X-Foo' => 'Bar'])
        ->setQuery(['baz' => 'qux']);

    $this->client->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)
            ->url()->toBe('https://example.com/foo?baz=qux')
            ->method()->toBe(HttpMethod::GET->name)
            ->header('X-Foo')->toBe(['Bar']);

        return true;
    });
});

it('sends a post request', function () {
    $request = ApiRequest::post('foo')
        ->setBody(['foo' => 'bar'])
        ->setHeaders(['X-Foo' => 'Bar'])
        ->setQuery(['baz' => 'qux']);

    $this->client->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)
            ->url()->toBe('https://example.com/foo?baz=qux')
            ->method()->toBe(HttpMethod::POST->name)
            ->data()->toBe(['foo' => 'bar'])
            ->header('X-Foo')->toBe(['Bar']);

        return true;
    });
});

it('sends a put request', function () {
    $request = ApiRequest::put('foo')
        ->setBody(['foo' => 'bar'])
        ->setHeaders(['X-Foo' => 'Bar'])
        ->setQuery(['baz' => 'qux']);

    $this->client->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)
            ->url()->toBe('https://example.com/foo?baz=qux')
            ->method()->toBe(HttpMethod::PUT->name)
            ->data()->toBe(['foo' => 'bar'])
            ->header('X-Foo')->toBe(['Bar']);

        return true;
    });
});

it('sends a delete request', function () {
    $request = ApiRequest::delete('foo')
        ->setBody(['foo' => 'bar'])
        ->setHeaders(['X-Foo' => 'Bar'])
        ->setQuery(['baz' => 'qux']);

    $this->client->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)
            ->url()->toBe('https://example.com/foo?baz=qux')
            ->method()->toBe(HttpMethod::DELETE->name)
            ->data()->toBe(['foo' => 'bar'])
            ->header('X-Foo')->toBe(['Bar']);

        return true;
    });
});

it('handles authorization', function () {
    $client = new class extends ApiClient
    {
        protected function baseUrl(): string
        {
            return 'https://example.com';
        }

        protected function authorize(PendingRequest $request): PendingRequest
        {
            return $request->withHeaders(['Authorization' => 'Bearer foo']);
        }
    };

    $request = ApiRequest::get('foo');

    $client->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)->header('Authorization')->toBe(['Bearer foo']);

        return true;
    });
});

對(duì)于測(cè)試,我們確認(rèn)在各種請(qǐng)求方法上正確設(shè)置了請(qǐng)求屬性。我們還確認(rèn)baseUrl和authorize方法被正確調(diào)用。為了做出這些斷言,我們使用的Http::assertSent方法需要一個(gè)帶有 a 的回調(diào)$request,我們可以對(duì)其進(jìn)行測(cè)試。請(qǐng)注意,我正在使用 PestPHP 期望,然后返回true. 我們可以只使用正常的比較并返回它,但是通過(guò)使用期望,當(dāng)測(cè)試失敗時(shí)我們會(huì)得到更清晰的錯(cuò)誤消息。閱讀這篇優(yōu)秀的文章以獲取更多信息。

GoogleBooksApiClient測(cè)試

測(cè)試與我們只想確保正確處理自定義實(shí)現(xiàn)細(xì)節(jié)的測(cè)試GoogleBooksApiClient類(lèi)似,例如設(shè)置基本 URL 并使用 API 密鑰添加查詢(xún)參數(shù)。ApiClient

另外,不是方法config中的助手beforeEach。通過(guò)使用幫助程序,我們可以為將在每個(gè)測(cè)試中使用的 Google 圖書(shū)服務(wù)配置設(shè)置測(cè)試值。

<?php

use App\Support\ApiRequest;
use App\Support\GoogleBooksApiClient;
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\Request;

beforeEach(function () {
    Http::fake();
    config([
        'services.google_books.base_url' => 'https://example.com',
        'services.google_books.api_key' => 'foo',
    ]);
});

it('sets the base url', function () {
    $request = ApiRequest::get('foo');

    app(GoogleBooksApiClient::class)->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)->url()->toStartWith('https://example.com/foo');

        return true;
    });
});

it('sets the api key as a query parameter', function () {
    $request = ApiRequest::get('foo');

    app(GoogleBooksApiClient::class)->send($request);

    Http::assertSent(static function (Request $request) {
        expect($request)->url()->toContain('key=foo');

        return true;
    });
});

總結(jié)

在本文中,我們介紹了在 Laravel 中集成第三方 API 的一些有用步驟。通過(guò)使用這些簡(jiǎn)單的自定義類(lèi)以及外觀Http,我們可以確保所有集成功能相似,更易于測(cè)試,并且不需要任何項(xiàng)目依賴(lài)項(xiàng)。在后面的文章中,我將通過(guò)介紹 DTO、使用模擬響應(yīng)進(jìn)行測(cè)試以及使用 API 資源來(lái)擴(kuò)展這些集成技巧。文章來(lái)源地址http://www.zghlxwxcb.cn/article/692.html

到此這篇關(guān)于使用 Laravel 的 Http Facade(門(mén)面) 簡(jiǎn)化 API 集成的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/692.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • HTTP簡(jiǎn)化版 API使用

    HTTP簡(jiǎn)化版 API使用

    1.1、獲取當(dāng)前IP(限制 1200次 /小時(shí)) 用瀏覽器訪問(wèn)?http://ip.hahado.cn/simple/current-ip?username=usernamepassword=password?URL上面加上用戶名和密碼 \\\"ip\\\": 字段是當(dāng)前的外網(wǎng)IP (\\\"ip\\\":\\\"null\\\" 正在切換中,暫時(shí)沒(méi)有IP) \\\"ttl\\\": 字段是ip可以使用的剩余時(shí)間(秒) 1.2、手動(dòng)切換IP(限制 180次 /小時(shí),間隔

    2023年04月09日
    瀏覽(25)
  • 如何使用Laravel的HTTP客戶端與外部API交互

    如何使用Laravel的HTTP客戶端與外部API交互

    Laravel使API交互對(duì)新的和有經(jīng)驗(yàn)的Web開(kāi)發(fā)人員來(lái)說(shuō)都是輕而易舉的。Larvel的HTTP客戶端是建立在PHP的Guzzle HTTP客戶端之上,讓開(kāi)發(fā)者在進(jìn)行HTTP請(qǐng)求時(shí)有更順暢的體驗(yàn)。它的主要功能包括認(rèn)證, 路由, 和有效的對(duì)象關(guān)系映射(ORM). 本文將探討如何使用Laravel的HTTP客戶端來(lái)進(jìn)行請(qǐng)求, 調(diào)

    2024年01月21日
    瀏覽(45)
  • 《golang設(shè)計(jì)模式》第二部分·結(jié)構(gòu)型模式-05-門(mén)面模式Facade)

    《golang設(shè)計(jì)模式》第二部分·結(jié)構(gòu)型模式-05-門(mén)面模式Facade)

    門(mén)面(Facade)向客戶端提供使用子系統(tǒng)的統(tǒng)一接口,用于簡(jiǎn)化客戶端使用子系統(tǒng)的操作。 門(mén)面角色(Facade) 客戶端可以調(diào)用的接口或方法 此角色知曉系統(tǒng)的所有功能和責(zé)任 一般情況下,該角色沒(méi)有實(shí)際業(yè)務(wù)邏輯,只是一個(gè)委托類(lèi)。 子系統(tǒng)角色(Subsystem) 同時(shí)有一個(gè)或多個(gè)

    2024年02月07日
    瀏覽(29)
  • WPF項(xiàng)目創(chuàng)建HTTP WEB服務(wù),不使用IIS業(yè)務(wù) WPF桌面程序WebApi WPF 集成WebApi C# 創(chuàng)建HTTP Web API服務(wù)

    WPF項(xiàng)目創(chuàng)建HTTP WEB服務(wù),不使用IIS業(yè)務(wù) WPF桌面程序WebApi WPF 集成WebApi C# 創(chuàng)建HTTP Web API服務(wù)

    在C# WPF應(yīng)用程序中直接創(chuàng)建HTTP服務(wù)或WebAPI服務(wù)有以下優(yōu)點(diǎn): 自托管服務(wù): 簡(jiǎn)化部署:無(wú)需依賴(lài)外部服務(wù)器或IIS(Internet Information Services),可以直接在應(yīng)用程序內(nèi)部啟動(dòng)和運(yùn)行Web服務(wù)。 集成緊密:與WPF應(yīng)用程序的其他組件和邏輯可以更緊密地集成,因?yàn)樗鼈兌荚谕粋€(gè)進(jìn)程

    2024年02月02日
    瀏覽(87)
  • 【設(shè)計(jì)模式-05】Facade門(mén)面Mediator調(diào)停者 | Decorator裝飾器 | Chain Of Responsibility責(zé)任鏈

    【設(shè)計(jì)模式-05】Facade門(mén)面Mediator調(diào)停者 | Decorator裝飾器 | Chain Of Responsibility責(zé)任鏈

    一般是系統(tǒng)內(nèi)部相互交錯(cuò),比如 消息中間件(MQ) 就是這種設(shè)計(jì)模式,對(duì)各個(gè)功能或系統(tǒng)之間進(jìn)行解耦。 業(yè)務(wù)場(chǎng)景:論壇或者博客發(fā)表帖子或者評(píng)論,對(duì)敏感詞過(guò)濾處理。使用責(zé)任鏈的模式進(jìn)行過(guò)濾處理。 把變化的進(jìn)行封裝處理 核心代碼實(shí)現(xiàn) GitHub - jxaufang168/Design-Patterns: 設(shè)計(jì)

    2024年01月19日
    瀏覽(63)
  • C#桌面程序 winform 集成內(nèi)置WebApi C# 創(chuàng)建HTTP Web API服務(wù),winform項(xiàng)目創(chuàng)建HTTP WEB服務(wù),不使用IIS業(yè)務(wù) C#桌面程序WebApi C#winform集

    C#桌面程序 winform 集成內(nèi)置WebApi C# 創(chuàng)建HTTP Web API服務(wù),winform項(xiàng)目創(chuàng)建HTTP WEB服務(wù),不使用IIS業(yè)務(wù) C#桌面程序WebApi C#winform集

    ?在維護(hù)舊的項(xiàng)目時(shí),有時(shí)需要提供APP連接的需求,就要提供HTTP服務(wù),winform項(xiàng)目就要提供HTTP服務(wù),就不用再去寫(xiě)個(gè)c# web的IIS相關(guān)的業(yè)務(wù)了,簡(jiǎn)化項(xiàng)目的復(fù)雜度。只需要簡(jiǎn)單化實(shí)例就可以實(shí)現(xiàn)提供HTTP服務(wù)

    2024年02月08日
    瀏覽(36)
  • larvel 中的api.php_Laravel 開(kāi)發(fā) API

    Laravel10中提示了Target *classController does not exist,為什么呢? 原因是:laravel8開(kāi)始寫(xiě)法變了。換成了新的寫(xiě)法了 解決方法一: 在路由數(shù)組加入 AppHttpControllers 即可。 再次訪問(wèn)URL,搞定。 解決方法二: 打開(kāi) appProvidersRouteServiceProvider.php 修改,添加一個(gè)namespace變量

    2024年02月06日
    瀏覽(34)
  • 使用Azure Data Factory REST API和HDInsight Spark進(jìn)行簡(jiǎn)化數(shù)據(jù)處理

    在這篇文章中,我們將探討如何利用Azure Data Factory和HDInsight Spark創(chuàng)建一個(gè)強(qiáng)大的數(shù)據(jù)處理管道。 在當(dāng)今數(shù)據(jù)驅(qū)動(dòng)的世界中,組織經(jīng)常面臨著高效可靠地處理和分析大量數(shù)據(jù)的挑戰(zhàn)。Azure Data Factory是一種基于云的數(shù)據(jù)集成服務(wù),結(jié)合HDInsight Spark,一種快速可擴(kuò)展的大數(shù)據(jù)處理框

    2024年02月10日
    瀏覽(36)
  • Forest-聲明式HTTP客戶端框架-集成到SpringBoot實(shí)現(xiàn)調(diào)用第三方restful api并實(shí)現(xiàn)接口數(shù)據(jù)轉(zhuǎn)換

    Forest-聲明式HTTP客戶端框架-集成到SpringBoot實(shí)現(xiàn)調(diào)用第三方restful api并實(shí)現(xiàn)接口數(shù)據(jù)轉(zhuǎn)換

    聲明式HTTP客戶端API框架,讓Java發(fā)送HTTP/HTTPS請(qǐng)求不再難。它比OkHttp和HttpClient更高層, 是封裝調(diào)用第三方restful api client接口的好幫手,是retrofit和feign之外另一個(gè)選擇。 通過(guò)在接口上聲明注解的方式配置HTTP請(qǐng)求接口。 官網(wǎng): Forest ? 代碼地址: forest: 聲明式HTTP客戶端API框架,讓

    2024年02月04日
    瀏覽(24)
  • 使用 Python 集成 ChatGPT API

    使用 Python 集成 ChatGPT API

    目錄 一、安裝 ChatGPT API 二、創(chuàng)建 Python 程序 三、調(diào)用 ChatGPT API 四、使用上下文進(jìn)行對(duì)話 五、自定義模型 六、總結(jié) 隨著人工智能技術(shù)的不斷發(fā)展,自然語(yǔ)言處理技術(shù)也越來(lái)越成熟。ChatGPT 是一種基于深度學(xué)習(xí)的自然語(yǔ)言生成技術(shù),可以用于構(gòu)建智能對(duì)話系統(tǒng)。ChatGPT API 是

    2024年02月04日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包