【问题标题】:Appending data to JSON将数据附加到 JSON
【发布时间】:2017-09-22 01:49:26
【问题描述】:

我在控制器中返回一些 json 数据作为响应,我想向其中添加一些信息

在我的DriversController 扩展的ApicontrollerDriversController 我正在返回一些关于api 调用的数据,我想将状态代码信息附加到下面的响应中

if ($request->wantsJson()) {    
    return Response::json([
        'data' => [
            'user_details' => $agent_percentage,
            'dropdown_data' => [
                'employment_types' => $employment_types->all(),
                'roles' => $roles->all(),
                'vehicle_brands' => $vehicle_brands->all(),
                'vehicle_types' => $vehicle_types->all()
            ]
        ]
    ]);
}


   //to the above response
    return Response::json([
        $this->respondSuccess(), // i am append this information
        'data' => [
            'user_details' => $agent_percentage,
            'dropdown_data' => [
                'employment_types' => $employment_types->all(),
                'roles' => $roles->all(),
                'vehicle_brands' => $vehicle_brands->all(),
                'vehicle_types' => $vehicle_types->all()
            ]
        ]
    ]);

ApiControllre 我正在设置所有的状态码和消息

class ApiController extends Controller 
{

    protected $statusCode = 200;

    //getter status code
    public function getStatusCode() 
    {
        return $this->statusCode;
    }

    //setter status code
    public function setStatusCode($statusCode) 
    {
        $this->statusCode = $statusCode;
        return $this;
    }

    //failure messages
    public function respondFailure($message='Account is not active contact admin', $status='failure')
    {
        return $this->setStatusCode(400)->respondWithMessage($message, $status);
    }

    //success messages
    public function respondSuccess($message='Agent is active', $status='success')
    {
        return $this->setStatusCode(200)->respondWithMessage($message, $status);
    }


    //a layer of abstraction to avoide repetation
    public function respond($data, $headers = []) 
    {
        return Response::json($data, $this->getStatusCode(), $headers);
    }

    //get ststus code and message parse it for errors
    public function respondWithMessage($message, $status) 
    {
        return $this->respond([
            'status_code' => $this->getStatusCode(),
            'status' => $status,
            'message' => $message
        ]);
    }

} 

但我得到的响应与预期的不同

 //expected result
 {
     "status_code": "200",
     "status": "success",
     "message": "User details with dropdown data",
     "data": {
       "user_details": {
          "id": 2017001,
          "name": "User Name",
          "email": "user@email.com",
        },
        "dropdown_data": {

        }
      }
    }

    //getting response
    {
      "0": {
        "headers": {},
        "original": {
          "status_code": 200,
          "status": "success",
          "message": "Agent is active"
        },
        "exception": null
      },
      "data": {
        "user_details": {
          "id": 2017001,
          "name": "User Name",
          "email": "user@email.com",
        },
        "dropdown_data": {

        }
      }
    }

中间件

<?php

namespace App\Http\Middleware;

use Closure;
use Response;
use App\Http\Controllers\ApiController;

class UserStatus extends ApiController
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if($request->user() === null)
        {
            return $this->respondFailure();
        }

        if($request->user()->isActive($request->user()))
        {
            return $next($request);
        }

       return $this->respondFailure();
    }
}

【问题讨论】:

标签: json laravel api object laravel-5.4


【解决方案1】:

您只是附加来自respondSuccess() 的响应,而不是合并响应。

$this->setStatusCode(200)->respondWithMessage($message, $status);

关于此回复:

return Response::json([
        $this->respondSuccess(), // i am append this information
        'data' => [
            'user_details' => $agent_percentage,
            'dropdown_data' => [
                'employment_types' => $employment_types->all(),
                'roles' => $roles->all(),
                'vehicle_brands' => $vehicle_brands->all(),
                'vehicle_types' => $vehicle_types->all()
            ]
        ]
    ]);

它给出的响应不是您预期的响应。

要获得预期的响应,您需要执行以下操作:

public function respondWithMessage($message, $status) 
{
    return [
        'status_code' => $this->getStatusCode(),
        'status' => $status,
        'message' => $message
    ];
}

我只使用了数组而不是$this-&gt;respond(),因为你只有这个消息:

 "status_code": "200",
 "status": "success",
 "message": "User details with dropdown data",

对于响应类型,您可能需要将两个数组合并为一个。 关注array_merge()了解更多。

$responseMessage= $this->respondSuccess();
$data = ['data' => [
        'user_details' => $agent_percentage,
        'dropdown_data' => [
            'employment_types' => $employment_types->all(),
            'roles' => $roles->all(),
            'vehicle_brands' => $vehicle_brands->all(),
            'vehicle_types' => $vehicle_types->all()
        ]
    ]
];

$responseArray = array_merge(responseMessage, data);
return Response::json($responseArray);

我尚未测试代码,但这可能会让您了解如何获得所需的预期数组响应。

如果我错了,任何人都可以提出修改建议。

【讨论】:

  • 您的解决方案在以预期格式返回数据时有效,但我的“ApiController”有问题我已使用respond() 函数更新了代码,当仅返回$this-&gt;respondSuccess(); 时我会收到错误@ 987654331@
  • 那么,你觉得这样好吗?如果它对你有帮助那就太好了:)
  • 请检查我上面的评论,如果我将respondWithMessage() 响应一个数组我的respond() 给我错误
  • 您使用的是哪个Response::json()?应该是Illuminate\Support\Facades\Response
  • 我在谈论我的ApiController 中的respond() 函数,即public function respond($data, $headers = []) { return Response::json($data, $this-&gt;getStatusCode(), $headers); } 我的代码中有更新,请检查ApiController
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
相关资源
最近更新 更多