Прикрепить заголовок ко всем ответам () -> json ()-> отправить () laravel;

#json #laravel #http-headers

#json #laravel #http-заголовки

Вопрос:

По некоторым причинам я отправляю ответ JSON из моего помощника / библиотеки вместо контроллера, используя приведенный ниже код:

 response()->json(
    [
        "status"  => false,
        "message" => "This product is out of stock",
    ],
    200
)->send();
exit;
  

моя проблема в отсутствии заголовка промежуточного программного обеспечения, если этот ответ отправлен. Как прикрепить заголовок ко всем response()->json()->send();exit; функциям?

Ниже приведен заголовок моего ответа контроллера по умолчанию): введите описание изображения здесь

Приведенный выше ответ содержит все заголовки из всего промежуточного программного обеспечения, а ниже — мой заголовок ответа от response()->json()->send();exit; :

введите описание изображения здесь

выше не показаны заголовки из промежуточного программного обеспечения.

Я знаю, что могу отправить заголовок вручную, добавив ->header('X-Header-One', 'Header Value') подобный код ниже:

 response()->json(
                [
                    'status'  => false,
                    'message' => 'This voucher is not for selected products',
                ]
            )->header('X-Header-One', 'Header Value')->send();
            exit;
  

Но у меня уже так много таких ответов, и я не хочу пытаться намочить свой код.

Комментарии:

1. почему бы вам не создать промежуточное программное обеспечение и не применить его там?

2. Промежуточное программное обеспечение не работает над этим, см. Мой скриншот выше

Ответ №1:

После некоторого изучения вы также можете создать макрос ответа

https://laravel.com/docs/8.x/responses#response-macros

 <?php

namespace AppProviders;

use IlluminateSupportFacadesResponse;
use IlluminateSupportServiceProvider;

class ResponseMacroServiceProvider extends ServiceProvider
{
    /**
     * Register the application's response macros.
     *
     * @return void
     */
    public function boot()
    {
        Response::macro('custom', function ($value) {
            return Response::json($value)->headers();
        });
    }
}
  

Затем в вашем коде просто используйте

 return response()->custom($data);
  

Ответ №2:

В вашем Controller.php

Добавьте функцию и называйте ее как хотите

НАПРИМЕР

 public function MyCustomResponse()
{
  ... 
}
  

Затем разрешите ему принимать нужные параметры, в вашем случае это массив и целое число (данные и статус)

 public function MyCustomResponse(array $data, int $status)
{
  ... 
}
  

Затем обработайте логику там

 public function MyCustomResponse(array $data, int $status)
{
  response()->json($data, $status)->header('X-Header-One', 'Header Value')->send();
}
  

Теперь, когда вы захотите его использовать, убедитесь, что вы расширяете контроллер, на котором вы разместили этот код, и просто выполните

 return $this->myCustomResponse($data, 200);
  

Лучшим вариантом в зависимости от ваших потребностей является использование промежуточного программного обеспечения

 public function handle($request, Closure $next)
{
    $request->headers->set( ... );
    return $next($request);
}
  

И применить к вашему маршруту

Комментарии:

1. спасибо, это хорошая идея, но сначала я постараюсь дождаться другой идеи.

Ответ №3:

Создайте промежуточное программное обеспечение SetHeader.php

затем

 <?php

namespace AppHttpMiddleware;

use Closure;

class setHeader
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->headers->set('X-Header-One', 'Header Value');
        return $next($request);
    }
}
  

таким образом, вы можете добавлять как можно больше заголовков и применять к тем маршрутам, которые вы хотите отправить

Комментарии:

1. Промежуточное программное обеспечение не работает с этим ответом, поэтому спросил, работает ли оно как в контроллере, проблема решена

2. это должно работать так, как я использую то же самое, и для меня это работает

3. Нет, может быть, вы используете return response() not like me без возврата, но ставите exit / die после этого response()-> json()-> send(); exit;,

4. попробуйте мой код в своей модели, помощнике или библиотеке, и вы понимаете, что я имею в виду

5. я думаю, что в моем коде установлен заголовок request , а в вашем коде установлены заголовки response , потому что ваши проверяющие заголовки возвращаются с сервера, а мой код — при отправке запроса. на сервере мы изменяем заголовки, затем они передаются контроллеру с новыми заголовками

Ответ №4:

Что ж, ответ на этот вопрос уже дан, но я предлагаю использовать концепцию промежуточного программного обеспечения. Промежуточное программное обеспечение работает не только для запросов, но и для ответа.

Используя макрос ответа, мы должны изменить ссылку, чтобы использовать пользовательскую функцию вместо json.

Вот код промежуточного программного обеспечения.

SetResponseHeaders.php

 <?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateHttpRequest;

class SetResponseHeaders
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $response->header('X-Header-One', 'XValue');
        return $response;
    }
}
  

и не забудьте зарегистрировать промежуточное программное обеспечение.

Http/Kernel.php

 protected $middleware = [
    // other middlewares
    AppHttpMiddlewareSetResponseHeaders::class,
]
  

Особые указания: — Если вы используете концепцию CORS, то у вас есть cors.php файл в папке config. В моем случае я использую fruitcake/laravel-cors package . поэтому вам нужно предоставить заголовок, иначе вы не получите значение.

cors.php

 <?php

return [

    /*
    |--------------------------------------------------------------------------
    | Cross-Origin Resource Sharing (CORS) Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure your settings for cross-origin resource sharing
    | or "CORS". This determines what cross-origin operations may execute
    | in web browsers. You are free to adjust these settings as needed.
    |
    | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
    |
    */

    // other config

    'exposed_headers' => ['X-Header-One'],
]