Junior: питання на співбесіді з теми «HTTP-клієнт»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
2 питання
Через фасад Http - обгортку над Guzzle з простішим API.
use Illuminate\Support\Facades\Http;
$response = Http::withToken(config('services.github.token'))
->acceptJson()
->timeout(5)
->get('https://api.github.com/repos/laravel/framework', ['per_page' => 10]);
$stars = $response->json('stargazers_count');
Http::post('https://api.example.com/orders', ['sku' => 'A-1', 'qty' => 2]); // тіло в JSON
Що повертає: об'єкт Response з методами:
json('key.nested'),collect(),object(),body()- дані;status(),successful(),failed(),clientError(),serverError()- статус;header('X-RateLimit-Remaining')- заголовки.
Корисне з першого дня:
- дані POST за замовчуванням ідуть як JSON; для форми -
asForm(), для файлів -attach(); timeout()- не чекати 30 секунд за замовчуванням;- ключі API - у
config/services.phpі.env, а не в коді.
Головна відмінність від «голого» Guzzle: на відповіді 4xx і 5xx клієнт не кидає винятків - статус перевіряють самі або викликають throw().
Бо помилкова відповідь - теж відповідь: її можна прочитати, залогувати, обробити по-різному залежно від коду. Тому клієнт повертає Response і лишає рішення вам.
$response = Http::get($url);
if ($response->notFound()) {
return null; // немає - нормальна ситуація
}
if ($response->serverError()) {
Log::warning('API недоступне', ['status' => $response->status()]);
throw new ServiceUnavailable;
}
Коли потрібен виняток - throw():
$data = Http::get($url)->throw()->json(); // RequestException на 4xx/5xx
Http::get($url)->throwIf(fn ($r) => $r->status() >= 500);
Http::get($url)->throwUnlessStatus(200);
Типова помилка новачка:
$user = Http::get($url)->json(); // на 500 тут буде тіло помилки, а не користувач
$user['name']; // і далі - дивна помилка в іншому місці
Окремий випадок - немає відповіді зовсім (таймаут, відмова з'єднання): тоді кидається ConnectionException завжди, бо читати нічого.
Правило: на кожен зовнішній виклик - або явна перевірка статусу, або throw().