Laravel 统一API设计

最近要写一套系统接口,发现公司里写Java的同事写的接口提供的都是统一个请求地址,因为以前没有写过接口,感觉挺有意思的.所以我自己写的这套系统也通过Laravel实现了这一方法.

以下是实现的代码, 在routes.php里面定义这样的路由:

Route::post('/api.api', function(){
    $post = Request::instance()->getContent();   //获取数据流,laravel方法
    try{
        $post = json_decode($post, true);   //将JSON字符串解码为数组
        //判断$post['data']是否存在
        $post['data'] = empty($post['data']) ? [] : $post['data'];
        //将请求数据分发到控制器操作
        return App::make('App\Http\Controllers\Api\\'.$post['action'].'Controller')->$post['method']($post['data']);
    }catch (Exception $e){
        return ['code' => 1, 'description' => $e->getMessage()];
    }
});

这样,请求接口的时候就可以通过传递不同的参数,调用不同的控制器和方法.
比如我们在app\Http\Controllers\Api 有一个TestController.php, 其中有一个test方法:

class TestController extends Controller
{
    public function test($data){
        return ['code' => 0, 'msg' => 'success'];
    }
}

这样,我们可以通过请求localhost/api.api,传入一下参数(json字符串)调用这个接口:

{
    "action": "test",
    "method":"test",
    "data":{
  
    }
}

得到返回数据:

{
  "code": 0,
  "msg": "success"
}

这样的设计,可以通过传入不同的参数实现调用不同的接口,简化了后台接口路由的定义.