mysal数据库里很多字段都是有下划线的,在写api时经常会用到直接用字段名当作key直接返回json的情况
大部分情况下是没有问题的。但在一些情形下,比如,iOS的json 转成NSDictionary 时,会出现有下划线的key,都会被加上双引号,这会导致续的解析问题。要解决这个情部况,就需要把下划线去掉。我们可以统一在返回json时,就把key里的下划线转成驼峰格式
以Laravel API为例:
我们可以写一个自定义的中间件来完成这个工作
通过php artisan make:middleware ResponseTransFormMiddleware命令,会在 app/Http/Middleware下自动生成ResponseTransFormMiddleware文件
修改ResponseTransFormMiddleware文件,实现下划线转驼峰功能
//下划线转驼峰 public function handle($request, Closure $next) { $response = $next($request); //return response()->json($response->original); return response()->json($this->changeHump($response->original)); } //转换驼峰(只转key) public function changeHump($params) { if (is_array($params)) { foreach ($params as $key=>$value){ unset($params[$key]); $params[$this->convertUnderline($key)] = is_array($value)?$this->changeHump($value):$value; } } return $params; } public function convertUnderline($str) { return preg_replace_callback('/([-_]+([a-z]{1}))/i', function ($matches) {return strtoupper($matches[2]);}, $str); }
3. Kernel.php中添加路由中间件
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'responseTransForm' => \App\Http\Middleware\ResponseTransFormMiddleware::class, //下划线转驼峰 ];
4.最后一步,定义路由
Route::group(['middleware' => ['responseTransForm']], function() { Route::post('register', 'Auth\RegisterController@apiregister'); Route::post('login', 'Auth\LoginController@apilogin'); });