Laravel-自定义API返回的JSON格式

按照我司规范,服务器处理http请求后返回的JSON,应该是这样的格式:

{
    code:
    data:
    msg:
}

这就需要对Laravel框架默认的返回值(太随意了,缺少一个统一的结构来包装返回值)做一些处理,具体包括以下几个部分:

使用LaravelResponse Macro机制来自Controller的直接返回

需要进行以下几步操作:

1、创建一个ServiceProvider

php artisan make:provider ResponseMacroServiceProvider
<?php
namespace App\Providers;

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

class ResponseMacroServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Response::macro(‘horesp‘, function ($code=2000, $data=null, $msg=null) {
            $content =  array(
                        ‘code‘    =>  $code,
                        ‘data‘    =>  $data,
                        ‘msg‘     =>  $msg
                    );
            return response()->json($content);
        });
    }

    public function register()
    {
        //
    }
}

2、在config/app.php文件中的‘providers’列表中,增加下面的一行

App\Providers\ResponseMacroServiceProvider::class,

3、创建一个HOBaseController,以后所有的Controller都继承这个类

php artisan make:controller HOBaseController
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;

class HOBaseController extends Controller
{  //这个方法只应该在接口顺利完成了对请求业务的处理之后调用
    public function response($data=null, $msg=null)
    {
        return response()->horesp(2000, $data, $msg);
    }

}

4、以后在controller类里面直接返回结果时,使用这个方式

return $this->response($user->name);

对主动返回的错误值做处理

原理是通过主动抛出异常,来处理所有需要返回错误代码和错误信息的情况,由框架的异常处理机制来构造最终的返回值。

1、创建一个HOException类

php artisan make:exception HOException

2、在App\Exception文件夹中,创建一个HOError.php文件,对每一个错误,都定义一个方法,供外部调用。

<?php
namespace App\Exceptions;
use \App\Exceptions\HOException as HOException;

class HOError
{
    public function generalErr()
    {
        throw new HOException(‘General Error Occurred‘, 2001);
    }

}

3、在HOBaseController里面,增加如下代码

protected $error;
public function error()
{
    $this->error = new HOError();
    return $this->error;
}

4、在App/Exeption/Handler.php文件中,重写render方法

use Illuminate\Support\Facades\Log;
use \App\Exceptions\HOException as HOException;
use Illuminate\Http\Exceptions\HttpResponseException;

public function render($request, Exception $exception)
{
    //对详细的错误信息,进行记录,但是不返回给前端
    Log::debug( parent::render($request, $exception) );
    if ( $exception instanceof HOException ) {
        $msg = $exception->getMessage();
    }else{
        $msg = ‘Server Bad‘;
    }

    return response()->horesp( $exception->getCode(), null, $msg);
}

5、在Controller的方法里,可以这样来返回错误码和错误信息

return $this->error()->generalErr();

对Validate不通过的情况做处理

创建一个HOFormRequest类,继承FormRequest类,以后创建FormRequest,都从HOFormRequest类去集成. 解决方案来自:https://www.jianshu.com/p/658f979abfb7

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use App\Exceptions\HOException as HOException;
use Illuminate\Contracts\Validation\Validator as Validator;

class HOFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }

    protected function failedValidation(Validator $validator)
    {
        $message = $validator->errors()->all();
        throw new HOException(implode($message), 3000);
    }
}

原文地址:https://www.cnblogs.com/zhaoxizhe/p/11308139.html

时间: 2024-11-06 07:21:20

Laravel-自定义API返回的JSON格式的相关文章

web Api自定义部分Action的JSON格式输出

昨天项目中要部分Api的JSON格式需要特殊处理.最开始直接重写controller的JSON方法.经测试,当action直接返回数据的时候,不会调用Json方法. 然后找了各种方法,都不行.在群里问了.直到看到群友发的一个直接移除所有API的JSON格式方法的时候.图片如下: 然后就想到了Api的ActionFilterAttribute.就解决了自己的需求. 上代码.懒得写说明. 1 public class AppFilterAttribte : ActionFilterAttribute

在C#中通过使用Newtonsoft.Json库来解析百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据

百度地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示: http://api.map.baidu.com/geocoding/v3/?address=**省**市**区**路**号院**社区&output=json&ak=您的AK密钥 返回结果实例: { "status":0, "result": { "location":{"lng":116.79, "lat":

python解析url返回的json格式数据

1.python代码# --*-- coding=utf-8 --*--import urllib2import urllibimport json weatherHtml = urllib.urlopen('http://songsearch.kugou.com/song_search_v2?keyword=周杰伦&pagesize=1')#通过urllib模块中的urlopen的方法打开urlweatherHtml1 = weatherHtml.read()#通过read方法获取返回数据pr

WebLoad 解析服务器返回的JSON格式内容

服务器返回Json格式的响应内容经常是以 String (txt) 形式返回给客户端.客户端需要把 文本形式的内容还原为Json格式以进一步做处理(如,取得返回内容的一个值作为下个请求的一个输入).这就要用到 一个函数 evel(). 具体做法如下: Parsing the JSON Response 1. In the InitAgenda() function in the Agenda, define the global variable values of the SaveSource

spring-boot-framework 如何自动将对象返回成json格式

使用srping-rest-mvc 的时候只要在工程的classpath中包含jackson的2.x版本,就可以不用自己做json格式的转换了. 如在你的pom文件中加入以下的依赖: <dependency> <groupId>com.fasterxml.jackson.jaxrs</groupId> <artifactId>jackson-jaxrs-json-provider</artifactId> <version>2.5.4

1.3WEB API 默认以json格式返回数据,同时定义时间格式,返回格式

首先我们知道,web api 是可以返回任意类型的,然后在输出的过程中转为(默认的)xml. 但是xml是比较费流量的,而且大多前端都是用json对接,所以我们也只能随大流,把它输出改成json. 不废话了,直接上代码,反正就这么点. public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.R

ajax读取返回的json格式的数据

** //alert(msg);//{"serverHost":"23","mail":"32","mailPassword":"23"} //json = eval(json); //alert("===json:id=" + json.id + ",uname=" + json.uname + ",email=" + jso

JSONObject.fromObject()方法使返回的json格式数据的顺序与list集合中的数据顺序保持一致

原因在于json版本问题 json2.1以前源码中new JsonOjbect()中的构建函数是 public JSONObject() { this.properties = new HashMap(); } 而在2.3版本后源码为: public JSONObject() { this.properties = new ListOrderedMap(); } ListOrderedMap位于commons-collections的jar包里,与普通的map相比,ListOrderedMap的

JS 对java返回的json格式的数据处理

var dataObj=eval("("+res+")"); alert(dataObj.billBuy) //res是如下的数据 {"billBuy":"1001BRNO1102160002","stkid":"","timeBk":"","timeBuy":"","typeBuy":&