Рубрики
Uncategorized

Принудительный ответ JSON на всех маршрутах API в Laravel

Laravel часто возвращает HTML-ответ или перенаправляет ответ на маршруты API, в основном, если ответ есть… Помечен как laravel, php, веб-разработчик.

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”