Laravel часто возвращает HTML-ответ или перенаправляет ответ на маршруты API, в основном, если ответ является ошибочным. Однако в этих случаях довольно легко заставить Laravel возвращать ответ JSON.
🇨 🇿 На английском языке статью можно прочитать по адресу//kutac.cz
Вы можете имитировать описанное поведение, добавив приведенный ниже код в routes/api.php файл и выполнение запросов в почтальоне или браузере. На изображении вы можете увидеть некоторые HTML-ответы в таких случаях.
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::get('health-check', function () {
return response()->json([ 'status' => 'OK', 'timestamp' => Carbon::now() ]);
});
Route::post('settings', function (Request $request) {
$request->validate([ 'entry' => 'required|string|min:5' ]);
return 'OK';
});
Laravel проверяет заголовок Accept в запросе. Затем решите в соответствии с этим заголовком, какой ответ он должен отправить обратно. Но браузер или почтальон часто отправляет Принять: */* . Таким образом, достаточно переписать этот заголовок, а остальное будет обработано Laravel.
Настраиваемое промежуточное программное обеспечение и запасной вариант маршрута
Промежуточное программное обеспечение – лучший друг для достижения этой цели. Сначала создайте файл app/Http/Middleware/ForceJsonResponse.php или используйте php artisan make:промежуточное программное обеспечение Для принудительного ответа Json . Во-вторых, зарегистрируйте созданное промежуточное программное обеспечение в app/Http/Kernel.php . Последний шаг, добавление резервного маршрута в routes/api.php является необязательным, но рекомендуется.
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ForceJsonResponse
{
public function handle(Request $request, Closure $next)
{
$request->headers->set('Accept', 'application/json');
return $next($request);
}
}
namespace App\Http;
class Kernel extends \Illuminate\Foundation\Http\Kernel
{
...
protected $middlewareGroups = [
...
'api' => [
\App\Http\Middleware\ForceJsonResponse::class,
...
],
];
}
// routes/api.php
Route::fallback(function (){
abort(404, 'API resource not found');
});
Последний шаг, добавление резервного маршрута в || routes/api.php || является необязательным, но рекомендуется. Там все еще может быть HTML-ответ
Последний шаг, добавление резервного маршрута в routes/api.php является необязательным, но рекомендуется. Все еще может быть HTML-ответ, код будет разрешать ответы JSON в случаях ошибок. Последний шаг, добавление резервного маршрута в routes/api.php является необязательным, но рекомендуется. Все еще может быть HTML-ответ, код будет разрешать ответы JSON в случаях ошибок. Но Laravel возвращает HTML, если контроллер возвращает строку. Последний шаг, добавление резервного маршрута в
Route::post('settings', function (Request $request) {
$request->validate([ 'entry' => 'required|string|min:5' ]);
// return 'OK';
return response()->json('OK');
});
Оригинал: “https://dev.to/arxeiss/force-json-response-on-all-api-routes-in-laravel-29h”