Возвратите каждый запрос как обычный json Laravel, используя Middleware - PullRequest
2 голосов
/ 14 января 2020

У меня есть маршрут в моей сети. php, который возвращает представление:

Route::get('/', function () {
    return view('welcome');
});

welcome - значение по умолчанию Laravel view welcome.blade. php.

У меня есть Middleware под названием AlwaysReturn Json, и он содержит:

<?php

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        $request->headers->set('Accept', 'application/json');
        return $next($request);
    }
}

Я установил это промежуточное ПО в ядре. php как глобальное промежуточное ПО:

 protected $middleware = [
        \App\Http\Middleware\AlwaysReturnJson::class
    ];

Я ожидаю получить простой текст / json файла приветствия в моем браузере при переходе по заданному маршруту, но я всегда получаю его как html, и он правильно отображает страницу. Я проверил, он применяет промежуточное программное обеспечение для каждого запроса, так что это не проблема. Почему это происходит и не должно ли оно преобразовать это представление в простой текст? Я что-то не так делаю?

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Если вы хотите установить заголовок для своего ответа, вы можете сделать это:

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        $response->headers->set('Content-Type', 'application/json');

        return $response;
    }
}

Если вы хотите принудительно вернуть верный json контент, используйте вместо этого это промежуточное ПО:

namespace App\Http\Middleware;

use Closure;

class AlwaysReturnJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        return response()->json($response->getContent());
    }
}

См. Laravel документы о после промежуточного программного обеспечения для получения дополнительной информации.

Вы также можете вернуть json ответ на свой контроллер без какого-либо промежуточного программного обеспечения:

Route::get('/', function () {
    return response()->json(
        view('welcome')->render()
    );
});
1 голос
/ 14 января 2020

Возможно, вы захотите использовать laravel После промежуточного программного обеспечения (промежуточное программное обеспечение выполнит свою задачу после обработки запроса приложением), а затем установить тип содержимого ответа.

<?php

namespace App\Http\Middleware;

use Closure;

class AfterAlwaysReturnJson
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        return $response->header('Content-Type', 'application/json');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...