نسخه:

سرویس گیرنده HTTP

معرفی

لاراول یک API گویا و حداقلی را در اطراف کلاینت Guzzle HTTP ارائه می‌کند که به شما امکان می‌دهد به سرعت درخواست‌های HTTP خروجی را برای برقراری ارتباط با سایر برنامه‌های کاربردی وب ارسال کنید. بسته بندی لاراول در اطراف Guzzle بر رایج ترین موارد استفاده آن و یک تجربه توسعه دهنده فوق العاده متمرکز شده است.

قبل از شروع، باید مطمئن شوید که بسته Guzzle را به عنوان وابستگی برنامه خود نصب کرده اید. به طور پیش فرض، لاراول به طور خودکار این وابستگی را شامل می شود:

composer require guzzlehttp/guzzle

درخواست ها

برای درخواست، می توانید از روش های get , post , put , patch و استفاده کنید delete . ابتدا بیایید نحوه ایجاد یک GET درخواست اساسی را بررسی کنیم:

use Illuminate\Support\Facades\Http;
 
$response = Http::get('http://test.com');

این get متد نمونه ای از را برمی گرداند Illuminate\Http\Client\Response که روش های مختلفی را ارائه می دهد که ممکن است برای بررسی پاسخ استفاده شود:

$response->body() : string;
$response->json() : array|mixed;
$response->status() : int;
$response->ok() : bool;
$response->successful() : bool;
$response->failed() : bool;
$response->serverError() : bool;
$response->clientError() : bool;
$response->header($header) : string;
$response->headers() : array;

شی Illuminate\Http\Client\Response همچنین رابط PHP را پیاده سازی می کند ArrayAccess و به شما امکان می دهد به داده های پاسخ JSON مستقیماً روی پاسخ دسترسی داشته باشید:

return Http::get('http://test.com/users/1')['name'];

درخواست داده

البته، هنگام استفاده از POST ، PUT و PATCH ارسال داده های اضافی همراه با درخواست شما رایج است. بنابراین، این روش ها آرایه ای از داده ها را به عنوان آرگومان دوم خود می پذیرند. به طور پیش فرض، داده ها با استفاده از نوع محتوا ارسال می شوند application/json :

$response = Http::post('http://test.com/users', [
'name' => 'Steve',
'role' => 'Network Administrator',
]);

دریافت پارامترهای درخواست درخواست

هنگام GET درخواست، می توانید یک رشته پرس و جو را مستقیماً به URL اضافه کنید یا آرایه ای از جفت های کلید / مقدار را به عنوان آرگومان دوم به متد ارسال کنید get :

$response = Http::get('http://test.com/users', [
'name' => 'Taylor',
'page' => 1,
]);

ارسال درخواست های کدگذاری شده URL فرم

اگر می‌خواهید داده‌ها را با استفاده از application/x-www-form-urlencoded نوع محتوا ارسال کنید، باید asForm قبل از درخواست خود با روش تماس بگیرید:

$response = Http::asForm()->post('http://test.com/users', [
'name' => 'Sara',
'role' => 'Privacy Consultant',
]);

ارسال درخواست خام

withBody اگر می‌خواهید هنگام درخواست، بدنه درخواستی خام ارائه دهید، می‌توانید از روش استفاده کنید :

$response = Http::withBody(
base64_encode($photo), 'image/jpeg'
)->post('http://test.com/photo');

درخواست های چند قسمتی

اگر می‌خواهید فایل‌ها را به‌عنوان درخواست‌های چند قسمتی ارسال کنید، باید attach قبل از درخواست خود با روش تماس بگیرید. این روش نام فایل و محتویات آن را می پذیرد. به صورت اختیاری، می‌توانید آرگومان سومی ارائه دهید که به عنوان نام فایل فایل در نظر گرفته می‌شود:

$response = Http::attach(
'attachment', file_get_contents('photo.jpg'), 'photo.jpg'
)->post('http://test.com/attachments');

به جای ارسال محتوای خام یک فایل، می‌توانید یک منبع جریانی را نیز ارسال کنید:

$photo = fopen('photo.jpg', 'r');
 
$response = Http::attach(
'attachment', $photo, 'photo.jpg'
)->post('http://test.com/attachments');

سرصفحه ها

هدرها ممکن است با استفاده از روش به درخواست ها اضافه شوند withHeaders . این withHeaders روش آرایه ای از جفت کلید/مقدار را می پذیرد:

$response = Http::withHeaders([
'X-First' => 'foo',
'X-Second' => 'bar'
])->post('http://test.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 روش ممکن است برای تعیین حداکثر تعداد ثانیه برای انتظار برای پاسخ استفاده شود:

$response = Http::timeout(3)->get(...);

اگر از بازه زمانی داده شده بیشتر شود، یک نمونه از Illuminate\Http\Client\ConnectionException پرتاب می شود.

دوباره تلاش می کند

اگر می خواهید در صورت بروز خطای سرویس گیرنده یا سرور، سرویس گیرنده HTTP به طور خودکار درخواست را دوباره امتحان کند، می توانید از این retry روش استفاده کنید. این retry روش دو آرگومان را می پذیرد: تعداد دفعاتی که درخواست باید انجام شود و تعداد میلی ثانیه هایی که لاراول باید در بین تلاش ها منتظر بماند:

$response = Http::retry(3, 100)->post(...);

اگر همه درخواست ها با شکست مواجه شوند، یک نمونه از Illuminate\Http\Client\RequestException پرتاب می شود.

رسیدگی به خطا

400 برخلاف رفتار پیش‌فرض Guzzle، بسته‌بندی کلاینت HTTP لاراول استثنایی را روی خطاهای کلاینت یا سرور ( و 500 پاسخ‌های سطح از سرورها) ایجاد نمی‌کند . می‌توانید تعیین کنید که آیا یکی از این خطاها با استفاده از روش‌های، یا برگردانده successful شده clientError است serverError :

// Determine if the status code was >= 200 and < 300...
$response->successful();
 
// Determine if the status code was >= 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();

استثناهای پرتاب

اگر یک نمونه پاسخ دارید و می خواهید نمونه ای از Illuminate\Http\Client\RequestException خطای مشتری یا سرور را ارسال کنید، می توانید از throw روش زیر استفاده کنید:

$response = Http::post(...);
 
// Throw an exception if a client or server error occurred...
$response->throw();
 
return $response['user']['id'];

نمونه Illuminate\Http\Client\RequestException دارای یک ویژگی عمومی است $response که به شما امکان می دهد پاسخ برگشتی را بررسی کنید.

اگر خطایی رخ ندهد، این throw روش نمونه پاسخ را برمی‌گرداند و به شما امکان می‌دهد عملیات‌های دیگر را به متد زنجیره‌ای کنید throw :

return Http::post(...)->throw()->json();

گزینه های Guzzle

می‌توانید با استفاده از روش، گزینه‌های درخواست Guzzle withOptions اضافی را مشخص کنید . این withOptions روش آرایه ای از جفت کلید/مقدار را می پذیرد:

$response = Http::withOptions([
'debug' => true,
])->get('http://test.com/users');

آزمایش کردن

بسیاری از سرویس‌های لاراول عملکردی را ارائه می‌کنند که به شما کمک می‌کند تست‌ها را آسان و واضح بنویسید، و پوشش HTTP لاراول نیز از این قاعده مستثنی نیست. روش Http نما fake به شما این امکان را می‌دهد که به مشتری HTTP دستور دهید هنگام درخواست، پاسخ‌های stubbed/dummy را بازگرداند.

جعل پاسخ ها

به عنوان مثال، برای دستور دادن به سرویس گیرنده HTTP برای بازگرداندن 200 پاسخ های کد وضعیت خالی برای هر درخواست، می توانید fake متد را بدون آرگومان فراخوانی کنید:

use Illuminate\Support\Facades\Http;
 
Http::fake();
 
$response = Http::post(...);

جعل کردن URL های خاص

از طرف دیگر، می توانید یک آرایه را به fake متد ارسال کنید. کلیدهای آرایه باید الگوهای URL را که می‌خواهید جعل کنید و پاسخ‌های مرتبط با آنها را نشان دهند. این * کاراکتر ممکن است به عنوان یک کاراکتر عام استفاده شود. هر درخواستی که به URL هایی که جعلی نشده اند انجام شود در واقع اجرا خواهد شد. می توانید از این 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 و باید یک نمونه پاسخ را برگرداند:

Http::fake(function ($request) {
return Http::response('Hello World', 200);
});

بازرسی درخواست ها

هنگام جعل پاسخ‌ها، ممکن است گاهی بخواهید درخواست‌هایی را که مشتری دریافت می‌کند بررسی کنید تا مطمئن شوید که برنامه شما داده‌ها یا هدرهای صحیح را ارسال می‌کند. می توانید این کار را با فراخوانی Http::assertSent متد بعد از فراخوانی انجام دهید Http::fake .

این assertSent متد یک callback را می‌پذیرد که به آن یک نمونه داده می‌شود Illuminate\Http\Client\Request و باید یک مقدار بولی را برگرداند که نشان می‌دهد آیا درخواست با انتظارات شما مطابقت دارد یا خیر. برای گذراندن آزمون، حداقل باید یک درخواست مطابق با انتظارات داده شده صادر شده باشد:

Http::fake();
 
Http::withHeaders([
'X-First' => 'foo',
])->post('http://test.com/users', [
'name' => 'Taylor',
'role' => 'Developer',
]);
 
Http::assertSent(function ($request) {
return $request->hasHeader('X-First', 'foo') &&
$request->url() == 'http://test.com/users' &&
$request['name'] == 'Taylor' &&
$request['role'] == 'Developer';
});

در صورت نیاز، می توانید ادعا کنید که درخواست خاصی با استفاده از assertNotSent روش ارسال نشده است:

Http::fake();
 
Http::post('http://test.com/users', [
'name' => 'Taylor',
'role' => 'Developer',
]);
 
Http::assertNotSent(function (Request $request) {
return $request->url() === 'http://test.com/posts';
});

یا اگر می خواهید ادعا کنید که هیچ درخواستی ارسال نشده است، می توانید از assertNothingSent روش زیر استفاده کنید:

Http::fake();
 
Http::assertNothingSent();