【问题标题】:Attach header to all response()->json()->send() laravel;将标头附加到所有 response()->json()->send() laravel;
【发布时间】:2020-10-26 03:54:59
【问题描述】:

由于某些原因,我使用以下代码从帮助器/库而不是控制器发送 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;

但我已经收到了这么多回复,我不想尝试WET我的代码。

【问题讨论】:

  • 你为什么不创建一个中间件并在那里应用?
  • 中间件不工作,看我上面的截图

标签: json laravel http-headers


【解决方案1】:

在做一些挖掘之后,你还可以创建一个响应宏

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

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

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

    添加一个函数并随心所欲地调用它

    EG

    public function MyCustomResponse()
    {
      ... 
    }
    

    然后让它接受你想要的参数,在你的情况下它是一个数组和一个 int,(数据和状态)

    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);
    }
    

    并应用于您的路线

    【讨论】:

    • 谢谢,这是个好主意,但我会先尝试等待其他想法。
    【解决方案3】:

    创建中间件SetHeader.php

    然后

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class setHeader
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $request->headers->set('X-Header-One', 'Header Value');
            return $next($request);
        }
    }
    

    您可以添加尽可能多的标头并应用于您要发送的路由

    【讨论】:

    • 中间件无法处理该响应,这就是为什么询问它是否像在控制器中那样工作问题已解决
    • 它应该像我使用的一样工作,对我来说它正在工作
    • 不,也许你使用return response() 不像我没有返回但在 response()->json()->send();exit; 之后放置 exit/die;,
    • 在你的模型或助手或库中尝试我的代码,你就会明白我的意思
    • 我认为我的代码将标头设置为request,而您的代码将标头设置为response,因为您的检查标头是从服务器返回的,而我的代码正在发送请求时。到服务器我们修改标头然后它转到带有新标头的控制器
    【解决方案4】:

    好吧,这个问题的答案已经给出了,但是我建议使用中间件概念的力量。中间件不仅适用于请求,还适用于响应。

    通过使用响应宏,我们必须更改引用以使用自定义函数而不是 json。

    这是中间件代码。

    SetResponseHeaders.php

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    
    class SetResponseHeaders
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $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
        \App\Http\Middleware\SetResponseHeaders::class,
    ]
    

    特别说明:- 如果您使用的是 CORS 概念,那么您在 config 文件夹下有 cors.php 文件。就我而言,我使用的是fruitcake/laravel-cors 包。所以你必须公开标题,否则你将无法获得价值。

    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'],
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 2022-11-22
      • 2016-04-24
      • 2017-08-20
      相关资源
      最近更新 更多