Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Client HTTP
Introduzione
Laravel offre un’API espressiva e minimale intorno al Guzzle HTTP client, permettendoti di effettuare rapidamente richieste HTTP in uscita per comunicare con altre applicazioni web. Il wrapper di Laravel per Guzzle è focalizzato sui casi d’uso più comuni e fornisce un’eccellente esperienza per gli sviluppatori.
Effettuare Richieste
Per fare richieste, puoi usare i metodi head
, get
, post
, put
, patch
e delete
forniti dal facade Http
. Innanzitutto, vediamo come effettuare una richiesta GET
di base a un altro URL:
use Illuminate\Support\Facades\Http;
$response = Http::get('http://example.com');
Il metodo get
restituisce un’istanza di Illuminate\Http\Client\Response
, che offre vari metodi per esaminare la risposta:
$response->body() : string;
$response->json($key = null, $default = null) : mixed;
$response->object() : object;
$response->collect($key = null) : Illuminate\Support\Collection;
$response->resource() : resource;
$response->status() : int;
$response->successful() : bool;
$response->redirect(): bool;
$response->failed() : bool;
$response->clientError() : bool;
$response->header($header) : string;
$response->headers() : array;
L’oggetto Illuminate\Http\Client\Response
implementa anche l’interfaccia PHP ArrayAccess
, permettendoti di accedere direttamente ai dati JSON della risposta:
return Http::get('http://example.com/users/1')['name'];
Oltre ai metodi di risposta elencati sopra, puoi utilizzare i seguenti metodi per verificare se la risposta ha un determinato codice di stato:
$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
Modelli URI
Il client HTTP consente anche di costruire URL di richiesta utilizzando la specifica del template URI. Per definire i parametri dell’URL che possono essere espansi dal tuo template URI, puoi usare il metodo withUrlParameters
:
Http::withUrlParameters([
'endpoint' => 'https://laravel.com',
'page' => 'docs',
'version' => '11.x',
'topic' => 'validation',
])->get('{+endpoint}/{page}/{version}/{topic}');
Dumping delle Richieste
Se vuoi fare il dump dell’istanza della richiesta in uscita prima che venga inviata e terminare l’esecuzione dello script, puoi aggiungere il metodo dd
all’inizio della definizione della tua richiesta:
return Http::dd()->get('http://example.com');
Dati della Richiesta
Certo, è comune quando si effettuano richieste POST
, PUT
e PATCH
inviare dati aggiuntivi con la tua richiesta, quindi questi metodi accettano un array di dati come secondo argomento. Per default, i dati verranno inviati utilizzando il tipo di contenuto application/json
:
use Illuminate\Support\Facades\Http;
$response = Http::post('http://example.com/users', [
'name' => 'Steve',
'role' => 'Network Administrator',
]);
Parametri della Query per le Richieste GET
Quando effettui richieste GET
, puoi aggiungere direttamente una stringa di query all’URL oppure passare un array di coppie chiave/valore come secondo argomento al metodo get
:
$response = Http::get('http://example.com/users', [
'name' => 'Taylor',
'page' => 1,
]);
In alternativa, puoi usare il metodo withQueryParameters
:
Http::retry(3, 100)->withQueryParameters([
'name' => 'Taylor',
'page' => 1,
])->get('http://example.com/users')
Inviare richieste form URL encoded
Se vuoi inviare dati usando il tipo di contenuto application/x-www-form-urlencoded
, devi chiamare il metodo asForm
prima di effettuare la tua richiesta:
$response = Http::asForm()->post('http://example.com/users', [
'name' => 'Sara',
'role' => 'Privacy Consultant',
]);
Inviare un Body di Richiesta Grezzo
Puoi usare il metodo withBody
se vuoi fornire un corpo di richiesta grezzo quando effettui una richiesta. Il tipo di contenuto può essere specificato come secondo argomento del metodo:
$response = Http::withBody(
base64_encode($photo), 'image/jpeg'
)->post('http://example.com/photo');
Richieste Multi-Part
Se vuoi inviare file come richieste multi-part, devi chiamare il metodo attach
prima di effettuare la tua richiesta. Questo metodo accetta il nome del file e il suo contenuto. Se necessario, puoi fornire un terzo argomento che sarà considerato come il nome del file, mentre un quarto argomento può essere usato per fornire le intestazioni associate al file:
$response = Http::attach(
'attachment', file_get_contents('photo.jpg'), 'photo.jpg', ['Content-Type' => 'image/jpeg']
)->post('http://example.com/attachments');
Invece di passare il contenuto grezzo di un file, puoi passare una risorsa stream:
$photo = fopen('photo.jpg', 'r');
$response = Http::attach(
'attachment', $photo, 'photo.jpg'
)->post('http://example.com/attachments');
Headers
Gli headers possono essere aggiunti alle richieste usando il metodo withHeaders
. Questo metodo withHeaders
accetta un array di coppie chiave/valore:
$response = Http::withHeaders([
'X-First' => 'foo',
'X-Second' => 'bar'
])->post('http://example.com/users', [
'name' => 'Taylor',
]);
Puoi usare il metodo accept
per specificare il tipo di contenuto che la tua applicazione si aspetta in risposta alla tua richiesta:
$response = Http::accept('application/json')->get('http://example.com/users');
Per comodità, puoi usare il metodo acceptJson
per specificare rapidamente che la tua applicazione si aspetta il tipo di contenuto application/json
in risposta alla tua richiesta:
$response = Http::acceptJson()->get('http://example.com/users');
Il metodo withHeaders
unisce i nuovi headers a quelli già presenti nella richiesta. Se necessario, puoi sostituire tutti gli headers utilizzando il metodo replaceHeaders
:
$response = Http::withHeaders([
'X-Original' => 'foo',
])->replaceHeaders([
'X-Replacement' => 'bar',
])->post('http://example.com/users', [
'name' => 'Taylor',
]);
Autenticazione
Puoi specificare le credenziali di autenticazione base e digest utilizzando rispettivamente i metodi withBasicAuth
e withDigestAuth
:
// Autenticazione base...
$response = Http::withBasicAuth('taylor@laravel.com', 'secret')->post(/* ... */);
// Autenticazione digest...
$response = Http::withDigestAuth('taylor@laravel.com', 'secret')->post(/* ... */);
Bearer Tokens
Se vuoi aggiungere rapidamente un bearer token all’header Authorization
della richiesta, puoi usare il metodo withToken
:
$response = Http::withToken('token')->post(/* ... */);
Timeout
Il metodo timeout
può essere utilizzato per specificare il numero massimo di secondi da attendere per una risposta. Di default, il client HTTP scade dopo 30 secondi:
$response = Http::timeout(3)->get(/* ... */);
Se il timeout specificato viene superato, verrà lanciata un’istanza di Illuminate\Http\Client\ConnectionException
.
Puoi specificare il numero massimo di secondi da attendere mentre tenti di connetterti a un server usando il metodo connectTimeout
:
$response = Http::connectTimeout(3)->get(/* ... */);
Riprovare una Richiesta
Se desideri che il client HTTP tenti automaticamente nuovamente la richiesta in caso di errori client o server, puoi usare il metodo retry
. Il metodo retry
accetta il numero massimo di tentativi e il numero di millisecondi che Laravel deve attendere tra i tentativi:
$response = Http::retry(3, 100)->post(/* ... */);
Se preferisci calcolare manualmente il numero di millisecondi di attesa tra i tentativi, puoi passare una closure come secondo argomento al metodo retry
:
use Exception;
$response = Http::retry(3, function (int $attempt, Exception $exception) {
return $attempt * 100;
})->post(/* ... */);
Per comodità, puoi anche fornire un array come primo argomento al metodo retry
. Questo array verrà utilizzato per determinare quanti millisecondi attendere tra i tentativi successivi:
$response = Http::retry([100, 200])->post(/* ... */);
Se necessario, puoi passare un terzo argomento al metodo retry
. Il terzo argomento deve essere una callable che determina se tentare effettivamente i ritenti. Ad esempio, potresti voler ritentare la richiesta solo se la richiesta iniziale incontra una ConnectionException
:
use Exception;
use Illuminate\Http\Client\PendingRequest;
$response = Http::retry(3, 100, function (Exception $exception, PendingRequest $request) {
return $exception instanceof ConnectionException;
})->post(/* ... */);
Se un tentativo di richiesta fallisce, potresti voler modificare la richiesta prima di un nuovo tentativo. Puoi farlo modificando l’argomento della richiesta fornito alla callable passata al metodo retry
. Ad esempio, potresti voler ritentare la richiesta con un nuovo token di autorizzazione se il primo tentativo ha restituito un errore di autenticazione:
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(/* ... */);
Se tutte le richieste falliscono, verrà lanciata un’istanza di Illuminate\Http\Client\RequestException
. Se desideri disabilitare questo comportamento, puoi fornire un argomento throw
con valore false
. Quando disabilitato, l’ultima risposta ricevuta dal client verrà restituita dopo tutti i tentativi:
$response = Http::retry(3, 100, throw: false)->post(/* ... */);
Se tutte le richieste falliscono a causa di un problema di connessione, verrà comunque lanciata una
Illuminate\Http\Client\ConnectionException
anche quando l’argomentothrow
è impostato sufalse
.
Gestione degli Errori
A differenza del comportamento predefinito di Guzzle, il wrapper del client HTTP di Laravel non lancia eccezioni per errori client o server (risposte di livello 400
e 500
dai server). Puoi determinare se è stato restituito uno di questi errori usando i metodi successful
, clientError
o serverError
:
// Determina se il codice di stato è >= 200 e < 300...
$response->successful();
// Determina se il codice di stato è >= 400...
$response->failed();
// Determina se la risposta ha un codice di stato di livello 400...
$response->clientError();
// Determina se la risposta ha un codice di stato di livello 500...
$response->serverError();
// Esegue immediatamente il callback dato se c'è stato un errore client o server...
$response->onError(callable $callback);
Lancio delle Eccezioni
Se hai un’istanza di risposta e desideri lanciare un’istanza di Illuminate\Http\Client\RequestException
se il codice di stato della risposta indica un errore client o server, puoi utilizzare i metodi throw
o throwIf
:
use Illuminate\Http\Client\Response;
$response = Http::post(/* ... */);
// Lancia un'eccezione se si verifica un errore client o server...
$response->throw();
// Lancia un'eccezione se si verifica un errore e la condizione data è vera...
$response->throwIf($condition);
// Lancia un'eccezione se si verifica un errore e la closure data restituisce true...
$response->throwIf(fn (Response $response) => true);
// Lancia un'eccezione se si verifica un errore e la condizione data è falsa...
$response->throwUnless($condition);
// Lancia un'eccezione se la risposta ha un codice di stato specifico...
$response->throwIfStatus(403);
// Lancia un'eccezione a meno che la risposta non abbia un codice di stato specifico...
$response->throwUnlessStatus(200);
return $response['user']['id'];
L’istanza di Illuminate\Http\Client\RequestException
ha una proprietà pubblica $response
che ti permette di ispezionare la risposta restituita.
Il metodo throw
restituisce l’istanza della risposta se non si è verificato nessun errore, permettendoti di concatenare altre operazioni sul metodo throw
:
return Http::post(/* ... */)->throw()->json();
Se desideri eseguire ulteriori logiche prima che l’eccezione venga lanciata, puoi passare una closure al metodo throw
. L’eccezione verrà automaticamente lanciata dopo l’esecuzione della closure, quindi non è necessario rilanciare l’eccezione all’interno della closure:
use Illuminate\Http\Client\Response;
use Illuminate\Http\Client\RequestException;
return Http::post(/* ... */)->throw(function (Response $response, RequestException $e) {
// ...
})->json();
Per impostazione predefinita, i messaggi di RequestException
vengono troncati a 120 caratteri quando vengono registrati o segnalati. Per personalizzare o disabilitare questo comportamento, puoi utilizzare i metodi truncateRequestExceptionsAt
e dontTruncateRequestExceptions
quando configuri il comportamento di gestione delle eccezioni della tua applicazione nel file bootstrap/app.php
:
->withExceptions(function (Exceptions $exceptions) {
// Trunca i messaggi delle eccezioni di richiesta a 240 caratteri...
$exceptions->truncateRequestExceptionsAt(240);
// Disabilita la troncatura dei messaggi delle eccezioni di richiesta...
$exceptions->dontTruncateRequestExceptions();
})
Guzzle Middleware
Poiché il client HTTP di Laravel è basato su Guzzle, puoi sfruttare Guzzle Middleware per manipolare la richiesta in uscita o esaminare la risposta in arrivo. Per modificare la richiesta in uscita, registra un middleware Guzzle tramite il metodo 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');
Allo stesso modo, puoi esaminare la risposta HTTP in arrivo registrando un middleware tramite il metodo 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');
Middleware Globale
A volte potrebbe essere necessario registrare un middleware che si applica a tutte le richieste in uscita e alle risposte in arrivo. Per fare ciò, puoi utilizzare i metodi globalRequestMiddleware
e globalResponseMiddleware
. Solitamente, questi metodi dovrebbero essere invocati nel metodo boot
del AppServiceProvider
della tua applicazione:
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()
));
Opzioni di Guzzle
Puoi specificare opzioni aggiuntive di Guzzle request options per una richiesta in uscita utilizzando il metodo withOptions
. Il metodo withOptions
accetta un array di coppie chiave/valore:
$response = Http::withOptions([
'debug' => true,
])->get('http://example.com/users');
Opzioni Globali
Per impostare le opzioni predefinite per ogni richiesta in uscita, puoi utilizzare il metodo globalOptions
. Di solito, questo metodo viene chiamato nel metodo boot
dell’AppServiceProvider
della tua applicazione:
use Illuminate\Support\Facades\Http;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Http::globalOptions([
'allow_redirects' => false,
]);
}
Richieste Concorrenti
A volte, potresti voler effettuare più richieste HTTP contemporaneamente. In altre parole, desideri inviare diverse richieste allo stesso tempo invece di emetterle in sequenza. Questo può portare a miglioramenti significativi delle prestazioni quando interagisci con API HTTP lente.
Fortunatamente, puoi realizzare questo utilizzando il metodo pool
. Il metodo pool
accetta una closure che riceve un’istanza di Illuminate\Http\Client\Pool
, permettendoti di aggiungere facilmente richieste al pool per l’invio:
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();
Come puoi vedere, ogni istanza di risposta può essere accessa in base all’ordine in cui è stata aggiunta al pool. Se desideri, puoi nominare le richieste usando il metodo as
, che ti consente di accedere alle risposte corrispondenti per nome:
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();
Personalizzazione delle Richieste Concorrenti
Il metodo pool
non può essere concatenato con altri metodi del client HTTP come withHeaders
o middleware
. Se vuoi applicare header personalizzati o middleware alle richieste nel pool, devi configurare queste opzioni su ogni richiesta nel pool:
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'),
]);
Macro
Il client HTTP di Laravel ti permette di definire le "macro", che possono essere un meccanismo fluido ed espressivo per configurare percorsi di richiesta e intestazioni comuni quando interagisci con i servizi all’interno della tua applicazione. Per iniziare, puoi definire la macro nel metodo boot
della classe App\Providers\AppServiceProvider
della tua applicazione:
use Illuminate\Support\Facades\Http;
/**
* Avvia i servizi dell'applicazione.
*/
public function boot(): void
{
Http::macro('github', function () {
return Http::withHeaders([
'X-Example' => 'example',
])->baseUrl('https://github.com');
});
}
Una volta configurata la tua macro, puoi invocarla da qualsiasi parte della tua applicazione per creare una richiesta in sospeso con la configurazione specificata:
$response = Http::github()->get('/');
Testing
Molti servizi di Laravel offrono funzionalità che ti aiutano a scrivere test in modo semplice ed espressivo, e anche il client HTTP di Laravel non fa eccezione. Il metodo fake
del facade Http
permette di far restituire al client HTTP risposte simulate o di prova quando vengono effettuate richieste.
Simulazione delle Risposte
Ad esempio, per istruire il client HTTP a restituire risposte vuote con codice di stato 200
per ogni richiesta, puoi chiamare il metodo fake
senza argomenti:
use Illuminate\Support\Facades\Http;
Http::fake();
$response = Http::post(/* ... */);
Falsare URL Specifici
In alternativa, puoi passare un array al metodo fake
. Le chiavi dell’array dovrebbero rappresentare i pattern degli URL che desideri falsare e le relative risposte. Il carattere *
può essere utilizzato come carattere jolly. Qualsiasi richiesta effettuata a URL non falsificati verrà eseguita effettivamente. Puoi utilizzare il metodo response
della facade Http
per costruire stub / fake responses per questi endpoint:
Http::fake([
// Stub una risposta JSON per gli endpoint di GitHub...
'github.com/*' => Http::response(['foo' => 'bar'], 200, $headers),
// Stub una risposta stringa per gli endpoint di Google...
'google.com/*' => Http::response('Hello World', 200, $headers),
]);
Se desideri specificare un pattern URL di fallback che simulerà tutti gli URL non corrispondenti, puoi usare un singolo carattere *
:
Http::fake([
// Stub una risposta JSON per gli endpoint di GitHub...
'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),
// Stub una risposta stringa per tutti gli altri endpoint...
'*' => Http::response('Hello World', 200, ['Headers']),
]);
Per comodità, risposte semplici di tipo stringa, JSON e vuote possono essere generate fornendo una stringa, un array o un intero come risposta:
Http::fake([
'google.com/*' => 'Hello World',
'github.com/*' => ['foo' => 'bar'],
'chatgpt.com/*' => 200,
]);
Simulare Eccezioni di Connessione
A volte potresti dover testare il comportamento della tua applicazione se il client HTTP incontra un Illuminate\Http\Client\ConnectionException
durante un tentativo di richiesta. Puoi istruire il client HTTP a generare un’eccezione di connessione usando il metodo failedConnection
:
Http::fake([
'github.com/*' => Http::failedConnection(),
]);
Simulare Sequenze di Risposta
A volte potrebbe essere necessario specificare che un singolo URL restituisca una serie di risposte simulate in un ordine specifico. Puoi ottenere questo utilizzando il metodo Http::sequence
per costruire le risposte:
Http::fake([
// Simula una serie di risposte per gli endpoint di GitHub...
'github.com/*' => Http::sequence()
->push('Hello World', 200)
->push(['foo' => 'bar'], 200)
->pushStatus(404),
]);
Quando tutte le risposte in una sequenza di risposta sono state consumate, eventuali ulteriori richieste causeranno un’eccezione nella sequenza di risposta. Se desideri specificare una risposta predefinita che dovrebbe essere restituita quando una sequenza è vuota, puoi usare il metodo whenEmpty
:
Http::fake([
// Simula una serie di risposte per gli endpoint di GitHub...
'github.com/*' => Http::sequence()
->push('Hello World', 200)
->push(['foo' => 'bar'], 200)
->whenEmpty(Http::response()),
]);
Se desideri simulare una sequenza di risposte ma non hai bisogno di specificare un pattern di URL specifico da simulare, puoi usare il metodo Http::fakeSequence
:
Http::fakeSequence()
->push('Hello World', 200)
->whenEmpty(Http::response());
Simulare Logiche Complesse con una Callback
Se hai bisogno di una logica più complessa per determinare quali risposte restituire per determinati endpoint, puoi passare una closure al metodo fake
. Questa closure riceverà un’istanza di Illuminate\Http\Client\Request
e dovrebbe restituire un’istanza di risposta. All’interno della tua closure, puoi eseguire tutta la logica necessaria per decidere che tipo di risposta restituire:
use Illuminate\Http\Client\Request;
Http::fake(function (Request $request) {
return Http::response('Hello World', 200);
});
Prevenire le Richieste Errate
Se desideri assicurarti che tutte le richieste inviate tramite il client HTTP siano state simulate durante il tuo test individuale o l’intera suite di test, puoi chiamare il metodo preventStrayRequests
. Dopo aver chiamato questo metodo, qualsiasi richiesta che non abbia una risposta falsa corrispondente genererà un’eccezione invece di effettuare la richiesta HTTP reale:
use Illuminate\Support\Facades\Http;
Http::preventStrayRequests();
Http::fake([
'github.com/*' => Http::response('ok'),
]);
// Viene restituita una risposta "ok"...
Http::get('https://github.com/laravel/framework');
// Viene generata un'eccezione...
Http::get('https://laravel.com');
Ispezionare le Richieste
Quando si simulano risposte, potrebbe essere necessario ispezionare le richieste che il client riceve per assicurarsi che l’applicazione stia inviando i dati o gli header corretti. Puoi fare questo chiamando il metodo Http::assertSent
dopo aver chiamato Http::fake
.
Il metodo assertSent
accetta una closure che riceverà un’istanza di Illuminate\Http\Client\Request
e dovrebbe restituire un valore booleano indicando se la richiesta corrisponde alle tue aspettative. Affinché il test passi, almeno una richiesta deve essere stata inviata e deve corrispondere alle aspettative date:
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';
});
Se necessario, puoi assicurarti che una specifica richiesta non sia stata inviata usando il metodo 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';
});
Puoi usare il metodo assertSentCount
per verificare quante richieste sono state "inviate" durante il test:
Http::fake();
Http::assertSentCount(5);
Oppure, puoi usare il metodo assertNothingSent
per assicurarti che nessuna richiesta sia stata inviata durante il test:
Http::fake();
Http::assertNothingSent();
Registrazione di Richieste e Risposte
Puoi utilizzare il metodo recorded
per raccogliere tutte le richieste e le loro risposte corrispondenti. Il metodo recorded
restituisce una collezione di array che contiene istanze di Illuminate\Http\Client\Request
e 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];
Inoltre, il metodo recorded
accetta una closure che riceverà un’istanza di Illuminate\Http\Client\Request
e Illuminate\Http\Client\Response
e può essere utilizzata per filtrare le coppie richiesta/risposta in base alle tue aspettative:
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();
});
Eventi
Laravel attiva tre eventi durante il processo di invio delle richieste HTTP. L’evento RequestSending
viene attivato prima che una richiesta venga inviata, mentre l’evento ResponseReceived
viene attivato dopo aver ricevuto una risposta per una determinata richiesta. L’evento ConnectionFailed
viene attivato se non viene ricevuta alcuna risposta per una determinata richiesta.
Gli eventi RequestSending
e ConnectionFailed
contengono entrambi una proprietà pubblica $request
che puoi utilizzare per ispezionare l’istanza Illuminate\Http\Client\Request
. Allo stesso modo, l’evento ResponseReceived
contiene una proprietà $request
e una proprietà $response
che possono essere utilizzate per ispezionare l’istanza Illuminate\Http\Client\Response
. Puoi creare ascoltatori di eventi per questi eventi all’interno della tua applicazione:
use Illuminate\Http\Client\Events\RequestSending;
class LogRequest
{
/**
* Gestisci l'evento dato.
*/
public function handle(RequestSending $event): void
{
// $event->request ...
}
}