سرویس گیرنده HTTP
معرفی
لاراول یک API گویا و حداقلی را در اطراف کلاینت Guzzle HTTP ارائه میکند که به شما امکان میدهد به سرعت درخواستهای HTTP خروجی را برای برقراری ارتباط با سایر برنامههای کاربردی وب ارسال کنید. بسته بندی لاراول در اطراف Guzzle بر رایج ترین موارد استفاده آن و یک تجربه توسعه دهنده فوق العاده متمرکز شده است.
درخواست ها
برای درخواست، می توانید از روش های
head
,
get
,
post
,
put
,
patch
و
delete
ارائه شده توسط
Http
نما استفاده کنید. ابتدا، بیایید نحوه ایجاد یک
GET
درخواست اساسی به URL دیگر را بررسی کنیم:
use Illuminate\Support\Facades\Http; $response = Http::get('http://example.com');
این
get
متد نمونه ای از را برمی گرداند
Illuminate\Http\Client\Response
که روش های مختلفی را ارائه می دهد که ممکن است برای بررسی پاسخ استفاده شود:
$response->body() : string;$response->json($key = null, $default = null) : array|mixed;$response->object() : object;$response->collect($key = null) : Illuminate\Support\Collection;$response->status() : int;$response->successful() : bool;$response->redirect(): bool;$response->failed() : bool;$response->clientError() : bool;$response->header($header) : string;$response->headers() : array;
شی
Illuminate\Http\Client\Response
همچنین رابط PHP را پیاده سازی می کند
ArrayAccess
و به شما امکان می دهد به داده های پاسخ JSON مستقیماً روی پاسخ دسترسی داشته باشید:
return Http::get('http://example.com/users/1')['name'];
علاوه بر روش های پاسخ ذکر شده در بالا، روش های زیر ممکن است برای تعیین اینکه آیا پاسخ دارای کد وضعیت معین است یا خیر استفاده شود:
$response->ok() : bool; // 200 OK$response->created() : bool; // 201 Created$response->accepted() : bool; // 202 Accepted$response->noContent() : bool; // 204 No Content$response->movedPermanently() : bool; // 301 Moved Permanently$response->found() : bool; // 302 Found$response->badRequest() : bool; // 400 Bad Request$response->unauthorized() : bool; // 401 Unauthorized$response->paymentRequired() : bool; // 402 Payment Required$response->forbidden() : bool; // 403 Forbidden$response->notFound() : bool; // 404 Not Found$response->requestTimeout() : bool; // 408 Request Timeout$response->conflict() : bool; // 409 Conflict$response->unprocessableEntity() : bool; // 422 Unprocessable Entity$response->tooManyRequests() : bool; // 429 Too Many Requests$response->serverError() : bool; // 500 Internal Server Error
قالب های URI
سرویس گیرنده HTTP همچنین به شما امکان می دهد URL های درخواستی را با استفاده از مشخصات قالب URI
بسازید
. برای تعریف پارامترهای URL که می تواند توسط الگوی URI شما گسترش یابد، می توانید از
withUrlParameters
روش استفاده کنید:
Http::withUrlParameters([ 'endpoint' => 'https://laravel.com', 'page' => 'docs', 'version' => '11.x', 'topic' => 'validation',])->get('{+endpoint}/{page}/{version}/{topic}');
درخواست های دامپینگ
اگر میخواهید نمونه درخواست خروجی را قبل از ارسال حذف کنید و اجرای اسکریپت را خاتمه دهید، میتوانید این
dd
روش را به ابتدای تعریف درخواست خود اضافه کنید:
return Http::dd()->get('http://example.com');
درخواست داده
البته، معمولا هنگام درخواست
POST
،
PUT
و
PATCH
ارسال داده های اضافی همراه با درخواست شما رایج است، بنابراین این روش ها آرایه ای از داده ها را به عنوان آرگومان دوم خود می پذیرند. به طور پیش فرض، داده ها با استفاده از نوع محتوا ارسال می شوند
application/json
:
use Illuminate\Support\Facades\Http; $response = Http::post('http://example.com/users', [ 'name' => 'Steve', 'role' => 'Network Administrator',]);
دریافت پارامترهای درخواست درخواست
هنگام
GET
درخواست، می توانید یک رشته پرس و جو را مستقیماً به URL اضافه کنید یا آرایه ای از جفت های کلید / مقدار را به عنوان آرگومان دوم به متد ارسال کنید
get
:
$response = Http::get('http://example.com/users', [ 'name' => 'Taylor', 'page' => 1,]);
روش دیگر
withQueryParameters
ممکن است استفاده شود:
Http::retry(3, 100)->withQueryParameters([ 'name' => 'Taylor', 'page' => 1,])->get('http://example.com/users')
ارسال درخواست های کدگذاری شده URL فرم
اگر میخواهید دادهها را با استفاده از
application/x-www-form-urlencoded
نوع محتوا ارسال کنید، باید
asForm
قبل از درخواست خود با روش تماس بگیرید:
$response = Http::asForm()->post('http://example.com/users', [ 'name' => 'Sara', 'role' => 'Privacy Consultant',]);
ارسال درخواست خام
withBody
اگر میخواهید هنگام درخواست، بدنه درخواستی خام ارائه دهید،
میتوانید از این روش استفاده کنید .
نوع محتوا ممکن است از طریق آرگومان دوم متد ارائه شود:
$response = Http::withBody( base64_encode($photo), 'image/jpeg')->post('http://example.com/photo');
درخواست های چند قسمتی
اگر میخواهید فایلها را بهعنوان درخواستهای چند قسمتی ارسال کنید، باید
attach
قبل از درخواست خود با روش تماس بگیرید. این روش نام فایل و محتویات آن را می پذیرد. در صورت نیاز، میتوانید آرگومان سومی ارائه دهید که به عنوان نام فایل فایل در نظر گرفته میشود، در حالی که آرگومان چهارم ممکن است برای ارائه هدرهای مرتبط با فایل استفاده شود:
$response = Http::attach( 'attachment', file_get_contents('photo.jpg'), 'photo.jpg', ['Content-Type' => 'image/jpeg'])->post('http://example.com/attachments');
به جای ارسال محتوای خام یک فایل، می توانید یک منبع جریانی را ارسال کنید:
$photo = fopen('photo.jpg', 'r'); $response = Http::attach( 'attachment', $photo, 'photo.jpg')->post('http://example.com/attachments');
سرصفحه ها
هدرها ممکن است با استفاده از روش به درخواست ها اضافه شوند
withHeaders
. این
withHeaders
روش آرایه ای از جفت کلید/مقدار را می پذیرد:
$response = Http::withHeaders([ 'X-First' => 'foo', 'X-Second' => 'bar'])->post('http://example.com/users', [ 'name' => 'Taylor',]);
می توانید از
accept
روشی برای تعیین نوع محتوایی که برنامه شما در پاسخ به درخواست شما انتظار دارد استفاده کنید:
$response = Http::accept('application/json')->get('http://example.com/users');
برای راحتی، می توانید از این
acceptJson
روش برای تعیین سریع اینکه برنامه شما
application/json
در پاسخ به درخواست شما انتظار نوع محتوا را دارد استفاده کنید:
$response = Http::acceptJson()->get('http://example.com/users');
این
withHeaders
روش هدرهای جدید را در هدرهای موجود درخواست ادغام می کند. در صورت نیاز، می توانید تمام هدرها را با استفاده از
replaceHeaders
روش زیر جایگزین کنید:
$response = Http::withHeaders([ 'X-Original' => 'foo',])->replaceHeaders([ 'X-Replacement' => 'bar',])->post('http://example.com/users', [ 'name' => 'Taylor',]);
احراز هویت
میتوانید اعتبارنامههای احراز هویت اولیه و خلاصه را با استفاده از روشها
withBasicAuth
و
withDigestAuth
به ترتیب مشخص کنید:
// Basic authentication...$response = Http::withBasicAuth('taylor@laravel.com', 'secret')->post(/* ... */); // Digest authentication...$response = Http::withDigestAuth('taylor@laravel.com', 'secret')->post(/* ... */);
توکن های حامل
اگر می خواهید به سرعت یک توکن حامل به
Authorization
هدر درخواست اضافه کنید، می توانید از
withToken
روش زیر استفاده کنید:
$response = Http::withToken('token')->post(/* ... */);
تایم اوت
این
timeout
روش ممکن است برای تعیین حداکثر تعداد ثانیه برای انتظار برای پاسخ استفاده شود. به طور پیش فرض، سرویس گیرنده HTTP پس از 30 ثانیه به پایان می رسد:
$response = Http::timeout(3)->get(/* ... */);
اگر از بازه زمانی داده شده بیشتر شود، یک نمونه از
Illuminate\Http\Client\ConnectionException
پرتاب می شود.
میتوانید حداکثر تعداد ثانیهای که باید در حین تلاش برای اتصال به سرور با استفاده از
connectTimeout
روش زیر منتظر بمانید را مشخص کنید:
$response = Http::connectTimeout(3)->get(/* ... */);
دوباره تلاش می کند
اگر می خواهید در صورت بروز خطای سرویس گیرنده یا سرور، سرویس گیرنده HTTP به طور خودکار درخواست را دوباره امتحان کند، می توانید از این
retry
روش استفاده کنید. این
retry
روش حداکثر تعداد دفعاتی که درخواست باید انجام شود و تعداد میلی ثانیه هایی که لاراول باید در بین تلاش ها منتظر بماند را می پذیرد:
$response = Http::retry(3, 100)->post(/* ... */);
اگر میخواهید به صورت دستی تعداد میلیثانیههای خواب بین تلاشها را محاسبه کنید، میتوانید یک بسته را به عنوان آرگومان دوم به
retry
روش ارسال کنید:
use Exception; $response = Http::retry(3, function (int $attempt, Exception $exception) { return $attempt * 100;})->post(/* ... */);
برای راحتی، ممکن است یک آرایه به عنوان اولین آرگومان متد نیز ارائه کنید
retry
. این آرایه برای تعیین چند میلی ثانیه خواب بین تلاش های بعدی استفاده می شود:
$response = Http::retry([100, 200])->post(/* ... */);
در صورت نیاز، می توانید آرگومان سوم را به
retry
متد ارسال کنید. آرگومان سوم باید قابل فراخوانی باشد که تعیین می کند آیا تلاش های مجدد باید واقعاً انجام شوند یا خیر. برای مثال، ممکن است بخواهید فقط در صورتی درخواست را دوباره امتحان کنید که درخواست اولیه با یک
ConnectionException
:
use Exception;use Illuminate\Http\Client\PendingRequest; $response = Http::retry(3, 100, function (Exception $exception, PendingRequest $request) { return $exception instanceof ConnectionException;})->post(/* ... */);
اگر تلاشی برای درخواست ناموفق بود، ممکن است بخواهید قبل از انجام تلاش جدید تغییری در درخواست ایجاد کنید. شما می توانید با تغییر آرگومان درخواست ارائه شده به فراخوانی که به
retry
متد ارائه کرده اید، به این امر دست یابید. برای مثال، اگر اولین تلاش یک خطای احراز هویت را نشان داد، ممکن است بخواهید دوباره درخواست را با یک نشانه مجوز جدید امتحان کنید:
use Exception;use Illuminate\Http\Client\PendingRequest;use Illuminate\Http\Client\RequestException; $response = Http::withToken($this->getToken())->retry(2, 0, function (Exception $exception, PendingRequest $request) { if (! $exception instanceof RequestException || $exception->response->status() !== 401) { return false; } $request->withToken($this->getNewToken()); return true;})->post(/* ... */);
اگر همه درخواست ها با شکست مواجه شوند، یک نمونه از
Illuminate\Http\Client\RequestException
پرتاب می شود. اگر میخواهید این رفتار را غیرفعال کنید، ممکن است یک
throw
آرگومان با مقدار
false
. در صورت غیرفعال شدن، آخرین پاسخ دریافت شده توسط مشتری پس از تلاش مجدد برگردانده می شود:
$response = Http::retry(3, 100, throw: false)->post(/* ... */);
اگر همه درخواست ها به دلیل مشکل اتصال با شکست مواجه شوند،
Illuminate\Http\Client\ConnectionException
حتی زمانی کهthrow
آرگومان رویfalse
.
رسیدگی به خطا
400
برخلاف رفتار پیشفرض Guzzle، بستهبندی کلاینت HTTP لاراول استثنایی را روی خطاهای کلاینت یا سرور ( و
500
پاسخهای سطح از سرورها)
ایجاد نمیکند .
میتوانید تعیین کنید که آیا یکی از این خطاها با استفاده از روشهای، یا برگردانده
successful
شده
clientError
است
serverError
:
// Determine if the status code is >= 200 and < 300...$response->successful(); // Determine if the status code is >= 400...$response->failed(); // Determine if the response has a 400 level status code...$response->clientError(); // Determine if the response has a 500 level status code...$response->serverError(); // Immediately execute the given callback if there was a client or server error...$response->onError(callable $callback);
پرتاب استثناها
اگر یک نمونه پاسخ دارید و می خواهید نمونه ای از
Illuminate\Http\Client\RequestException
اینکه کد وضعیت پاسخ نشان دهنده یک خطای مشتری یا سرور است را ارسال کنید، می توانید از روش های
throw
یا استفاده کنید
throwIf
:
use Illuminate\Http\Client\Response; $response = Http::post(/* ... */); // Throw an exception if a client or server error occurred...$response->throw(); // Throw an exception if an error occurred and the given condition is true...$response->throwIf($condition); // Throw an exception if an error occurred and the given closure resolves to true...$response->throwIf(fn (Response $response) => true); // Throw an exception if an error occurred and the given condition is false...$response->throwUnless($condition); // Throw an exception if an error occurred and the given closure resolves to false...$response->throwUnless(fn (Response $response) => false); // Throw an exception if the response has a specific status code...$response->throwIfStatus(403); // Throw an exception unless the response has a specific status code...$response->throwUnlessStatus(200); return $response['user']['id'];
نمونه
Illuminate\Http\Client\RequestException
دارای یک ویژگی عمومی است
$response
که به شما امکان می دهد پاسخ برگشتی را بررسی کنید.
اگر خطایی رخ ندهد، این
throw
روش نمونه پاسخ را برمیگرداند و به شما امکان میدهد عملیاتهای دیگر را به متد زنجیرهای کنید
throw
:
return Http::post(/* ... */)->throw()->json();
اگر میخواهید قبل از پرتاب کردن استثنا، منطق اضافی را انجام دهید، میتوانید یک بسته را برای متد ارسال کنید
throw
. پس از فراخوانی بسته شدن، استثنا به طور خودکار پرتاب می شود، بنابراین نیازی به پرتاب مجدد استثنا از داخل بسته نیست:
use Illuminate\Http\Client\Response;use Illuminate\Http\Client\RequestException; return Http::post(/* ... */)->throw(function (Response $response, RequestException $e) { // ...})->json();
Guzzle Middleware
از آنجایی که کلاینت HTTP لاراول توسط Guzzle پشتیبانی میشود، میتوانید از
Guzzle Middleware
برای دستکاری درخواست خروجی یا بررسی پاسخ دریافتی استفاده کنید. برای دستکاری درخواست خروجی، یک میان افزار Guzzle را از طریق
withRequestMiddleware
روش زیر ثبت کنید:
use Illuminate\Support\Facades\Http;use Psr\Http\Message\RequestInterface; $response = Http::withRequestMiddleware( function (RequestInterface $request) { return $request->withHeader('X-Example', 'Value'); })->get('http://example.com');
به همین ترتیب، می توانید پاسخ HTTP ورودی را با ثبت یک میان افزار از طریق
withResponseMiddleware
روش زیر بررسی کنید:
use Illuminate\Support\Facades\Http;use Psr\Http\Message\ResponseInterface; $response = Http::withResponseMiddleware( function (ResponseInterface $response) { $header = $response->getHeader('X-Example'); // ... return $response; })->get('http://example.com');
میان افزار جهانی
گاهی اوقات، ممکن است بخواهید میان افزاری را ثبت کنید که برای هر درخواست خروجی و پاسخ دریافتی اعمال می شود. برای انجام این کار، می توانید از روش های
globalRequestMiddleware
و استفاده کنید
globalResponseMiddleware
. به طور معمول، این روش ها باید در
boot
متد برنامه شما
استفاده شوند
AppServiceProvider
:
use Illuminate\Support\Facades\Http; Http::globalRequestMiddleware(fn ($request) => $request->withHeader( 'User-Agent', 'Example Application/1.0')); Http::globalResponseMiddleware(fn ($response) => $response->withHeader( 'X-Finished-At', now()->toDateTimeString()));
گزینه های Guzzle
میتوانید با استفاده از روش،
گزینههای درخواست Guzzle
اضافی را برای درخواست خروجی مشخص کنید
withOptions
. این
withOptions
روش آرایه ای از جفت کلید/مقدار را می پذیرد:
$response = Http::withOptions([ 'debug' => true,])->get('http://example.com/users');
گزینه های جهانی
برای پیکربندی گزینه های پیش فرض برای هر درخواست خروجی، می توانید از
globalOptions
روش استفاده کنید. به طور معمول، این روش باید از
boot
روش برنامه شما
فراخوانی شود
AppServiceProvider
:
use Illuminate\Support\Facades\Http; /** * Bootstrap any application services. */public function boot(): void{ Http::globalOptions([ 'allow_redirects' => false, ]);}
درخواست های همزمان
گاهی اوقات، ممکن است بخواهید چندین درخواست HTTP را همزمان انجام دهید. به عبارت دیگر، شما می خواهید به جای صدور متوالی درخواست ها، چندین درخواست به طور همزمان ارسال شوند. این می تواند منجر به بهبود عملکرد قابل توجهی در هنگام تعامل با API های کند HTTP شود.
خوشبختانه، ممکن است با استفاده از این
pool
روش این کار را انجام دهید. این
pool
روش بسته شدنی را میپذیرد که یک
Illuminate\Http\Client\Pool
نمونه را دریافت میکند و به شما امکان میدهد به راحتی درخواستها را برای ارسال به مخزن درخواست اضافه کنید:
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $responses = Http::pool(fn (Pool $pool) => [ $pool->get('http://localhost/first'), $pool->get('http://localhost/second'), $pool->get('http://localhost/third'),]); return $responses[0]->ok() && $responses[1]->ok() && $responses[2]->ok();
همانطور که می بینید، هر نمونه پاسخ بر اساس ترتیبی که به استخر اضافه شده قابل دسترسی است. در صورت تمایل، میتوانید درخواستها را با استفاده از
as
روشی نامگذاری کنید که به شما امکان میدهد به پاسخهای مربوطه با نام دسترسی داشته باشید:
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $responses = Http::pool(fn (Pool $pool) => [ $pool->as('first')->get('http://localhost/first'), $pool->as('second')->get('http://localhost/second'), $pool->as('third')->get('http://localhost/third'),]); return $responses['first']->ok();
سفارشی سازی درخواست های همزمان
این
pool
روش را نمیتوان با سایر روشهای سرویس گیرنده HTTP مانند متدهای
withHeaders
یا متد زنجیر کرد
middleware
. اگر میخواهید هدرهای سفارشی یا میانافزار را برای درخواستهای ادغامشده اعمال کنید، باید آن گزینهها را روی هر درخواست در استخر پیکربندی کنید:
use Illuminate\Http\Client\Pool;use Illuminate\Support\Facades\Http; $headers = [ 'X-Example' => 'example',]; $responses = Http::pool(fn (Pool $pool) => [ $pool->withHeaders($headers)->get('http://laravel.test/test'), $pool->withHeaders($headers)->get('http://laravel.test/test'), $pool->withHeaders($headers)->get('http://laravel.test/test'),]);
ماکروها
کلاینت HTTP لاراول به شما اجازه می دهد تا «ماکرو» را تعریف کنید، که می تواند به عنوان مکانیزمی روان و گویا برای پیکربندی مسیرهای درخواست و هدرهای رایج در هنگام تعامل با سرویس ها در سراسر برنامه شما عمل کند. برای شروع، می توانید ماکرو را در
boot
متد کلاس برنامه خود تعریف کنید
App\Providers\AppServiceProvider
:
use Illuminate\Support\Facades\Http; /** * Bootstrap any application services. */public function boot(): void{ Http::macro('github', function () { return Http::withHeaders([ 'X-Example' => 'example', ])->baseUrl('https://github.com'); });}
هنگامی که ماکرو شما پیکربندی شد، می توانید آن را از هر جایی در برنامه خود فراخوانی کنید تا یک درخواست در انتظار با پیکربندی مشخص شده ایجاد کنید:
$response = Http::github()->get('/');
آزمایش کردن
بسیاری از سرویسهای لاراول عملکردی را ارائه میکنند که به شما کمک میکند تستها را آسان و واضح بنویسید، و کلاینت HTTP لاراول نیز از این قاعده مستثنی نیست. روش
Http
نما
fake
به شما این امکان را میدهد که به مشتری HTTP دستور دهید هنگام درخواست، پاسخهای stubbed/dummy را بازگرداند.
جعل پاسخ ها
به عنوان مثال، برای دستور دادن به سرویس گیرنده HTTP برای بازگرداندن
200
پاسخ های کد وضعیت خالی برای هر درخواست، می توانید
fake
متد را بدون آرگومان فراخوانی کنید:
use Illuminate\Support\Facades\Http; Http::fake(); $response = Http::post(/* ... */);
جعل کردن URL های خاص
از طرف دیگر، می توانید یک آرایه را به
fake
متد ارسال کنید. کلیدهای آرایه باید الگوهای URL را که میخواهید جعل کنید و پاسخهای مرتبط با آنها را نشان دهند. این
*
کاراکتر ممکن است به عنوان یک کاراکتر عام استفاده شود. هر درخواستی که به URL هایی که جعلی نشده اند انجام شود در واقع اجرا خواهد شد. میتوانید از روش
Http
نما
response
برای ایجاد پاسخهای خرد/جعلی برای این نقاط پایانی استفاده کنید:
Http::fake([ // Stub a JSON response for GitHub endpoints... 'github.com/*' => Http::response(['foo' => 'bar'], 200, $headers), // Stub a string response for Google endpoints... 'google.com/*' => Http::response('Hello World', 200, $headers),]);
اگر میخواهید یک الگوی URL بازگشتی مشخص کنید که همه URLهای بیهمتا را حذف کند، میتوانید از یک
*
کاراکتر استفاده کنید:
Http::fake([ // Stub a JSON response for GitHub endpoints... 'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']), // Stub a string response for all other endpoints... '*' => Http::response('Hello World', 200, ['Headers']),]);
جعل توالی پاسخ
گاهی اوقات ممکن است لازم باشد مشخص کنید که یک URL واحد باید مجموعه ای از پاسخ های جعلی را با یک ترتیب خاص بازگرداند. می توانید این کار را با استفاده از
Http::sequence
روش ساخت پاسخ ها انجام دهید:
Http::fake([ // Stub a series of responses for GitHub endpoints... 'github.com/*' => Http::sequence() ->push('Hello World', 200) ->push(['foo' => 'bar'], 200) ->pushStatus(404),]);
وقتی تمام پاسخهای یک دنباله پاسخ مصرف شد، هر درخواست دیگری باعث میشود که دنباله پاسخ استثنایی ایجاد کند. اگر می خواهید یک پاسخ پیش فرض را مشخص کنید که باید در صورت خالی بودن یک دنباله بازگردانده شود، می توانید از
whenEmpty
روش زیر استفاده کنید:
Http::fake([ // Stub a series of responses for GitHub endpoints... 'github.com/*' => Http::sequence() ->push('Hello World', 200) ->push(['foo' => 'bar'], 200) ->whenEmpty(Http::response()),]);
اگر میخواهید دنبالهای از پاسخها را جعل کنید، اما نیازی به تعیین الگوی URL خاصی که باید جعلی باشد، ندارید، میتوانید از
Http::fakeSequence
روش زیر استفاده کنید:
Http::fakeSequence() ->push('Hello World', 200) ->whenEmpty(Http::response());
پاسخ به تماس جعلی
اگر به منطق پیچیدهتری برای تعیین پاسخهایی که باید برای نقاط پایانی خاص بازگردانید نیاز دارید، ممکن است روش بسته شود
fake
. این بسته شدن یک نمونه از
Illuminate\Http\Client\Request
و باید یک نمونه پاسخ را دریافت کند. در بسته شدن خود، ممکن است هر منطقی را که برای تعیین نوع پاسخی که باید برگردانید انجام دهید:
use Illuminate\Http\Client\Request; Http::fake(function (Request $request) { return Http::response('Hello World', 200);});
جلوگیری از درخواست های سرگردان
اگر میخواهید اطمینان حاصل کنید که تمام درخواستهای ارسال شده از طریق سرویس گیرنده HTTP در طول آزمایش فردی یا مجموعه آزمایشی کامل شما جعلی هستند، میتوانید با روش تماس بگیرید
preventStrayRequests
. پس از فراخوانی این روش، هر درخواستی که پاسخ جعلی مربوطه ندارد، به جای درخواست HTTP واقعی، یک استثنا ایجاد می کند:
use Illuminate\Support\Facades\Http; Http::preventStrayRequests(); Http::fake([ 'github.com/*' => Http::response('ok'),]); // An "ok" response is returned...Http::get('https://github.com/laravel/framework'); // An exception is thrown...Http::get('https://laravel.com');
بازرسی درخواست ها
هنگام جعل پاسخها، ممکن است گاهی بخواهید درخواستهایی را که مشتری دریافت میکند بررسی کنید تا مطمئن شوید که برنامه شما دادهها یا هدرهای صحیح را ارسال میکند. می توانید این کار را با فراخوانی
Http::assertSent
متد بعد از فراخوانی انجام دهید
Http::fake
.
این
assertSent
روش بسته شدنی را میپذیرد که یک
Illuminate\Http\Client\Request
نمونه دریافت میکند و باید یک مقدار بولی برگرداند که نشان میدهد آیا درخواست مطابق با انتظارات شما است یا خیر. برای گذراندن آزمون، حداقل باید یک درخواست مطابق با انتظارات داده شده صادر شده باشد:
use Illuminate\Http\Client\Request;use Illuminate\Support\Facades\Http; Http::fake(); Http::withHeaders([ 'X-First' => 'foo',])->post('http://example.com/users', [ 'name' => 'Taylor', 'role' => 'Developer',]); Http::assertSent(function (Request $request) { return $request->hasHeader('X-First', 'foo') && $request->url() == 'http://example.com/users' && $request['name'] == 'Taylor' && $request['role'] == 'Developer';});
در صورت نیاز، می توانید ادعا کنید که درخواست خاصی با استفاده از
assertNotSent
روش ارسال نشده است:
use Illuminate\Http\Client\Request;use Illuminate\Support\Facades\Http; Http::fake(); Http::post('http://example.com/users', [ 'name' => 'Taylor', 'role' => 'Developer',]); Http::assertNotSent(function (Request $request) { return $request->url() === 'http://example.com/posts';});
میتوانید از این
assertSentCount
روش برای تأیید تعداد درخواستهایی که در طول آزمایش «ارسال شدهاند» استفاده کنید:
Http::fake(); Http::assertSentCount(5);
یا، میتوانید از این
assertNothingSent
روش برای تأیید اینکه هیچ درخواستی در طول آزمایش ارسال نشده است استفاده کنید:
Http::fake(); Http::assertNothingSent();
ثبت درخواست ها / پاسخ ها
می توانید از این
recorded
روش برای جمع آوری تمام درخواست ها و پاسخ های مربوط به آنها استفاده کنید. متد
recorded
مجموعه ای از آرایه ها را برمی گرداند که حاوی نمونه هایی از
Illuminate\Http\Client\Request
و
Illuminate\Http\Client\Response
:
Http::fake([ 'https://laravel.com' => Http::response(status: 500), 'https://nova.laravel.com/' => Http::response(),]); Http::get('https://laravel.com');Http::get('https://nova.laravel.com/'); $recorded = Http::recorded(); [$request, $response] = $recorded[0];
علاوه بر این، این
recorded
روش بسته شدنی را میپذیرد که نمونهای از آن را دریافت میکند
Illuminate\Http\Client\Request
و
Illuminate\Http\Client\Response
ممکن است برای فیلتر کردن جفتهای درخواست/پاسخ بر اساس انتظارات شما استفاده شود:
use Illuminate\Http\Client\Request;use Illuminate\Http\Client\Response; Http::fake([ 'https://laravel.com' => Http::response(status: 500), 'https://nova.laravel.com/' => Http::response(),]); Http::get('https://laravel.com');Http::get('https://nova.laravel.com/'); $recorded = Http::recorded(function (Request $request, Response $response) { return $request->url() !== 'https://laravel.com' && $response->successful();});
مناسبت ها
لاراول سه رویداد را در طول فرآیند ارسال درخواست های HTTP اجرا می کند. رویداد
RequestSending
قبل از ارسال یک درخواست فعال می شود، در حالی که
ResponseReceived
رویداد پس از دریافت پاسخ برای یک درخواست معین فعال می شود.
ConnectionFailed
در صورت عدم دریافت پاسخ برای یک درخواست معین، رویداد فعال می شود
.
و
رویدادها هر دو حاوی یک
ویژگی عمومی هستند که میتوانید از آن برای بررسی نمونه استفاده
RequestSending
کنید
. به همین ترتیب،
رویداد حاوی یک
ویژگی و همچنین
ویژگی است که ممکن است برای بازرسی
نمونه مورد استفاده قرار گیرد. می توانید
شنوندگان رویداد را
برای این رویدادها در برنامه خود ایجاد کنید:
ConnectionFailed
$request
Illuminate\Http\Client\Request
ResponseReceived
$request
$response
Illuminate\Http\Client\Response
use Illuminate\Http\Client\Events\RequestSending; class LogRequest{ /** * Handle the given event. */ public function handle(RequestSending $event): void { // $event->request ... }}