我正在练习按照Google(https://google.github.io/styleguide/jsoncstyleguide.xml)的指南制作一个优秀的RESTful API服务,以获取json格式的响应。
有没有办法为每个响应设置默认的JSON格式,因为在指南中说
为了在API,JSON对象之间保持一致的接口 应遵循下面列出的结构。
object {
string apiVersion?;
string context?;
string id?;
string method?;
object {
string id?
}* params?;
object {
string kind?;
string fields?;
string etag?;
string id?;
string lang?;
string updated?; # date formatted RFC 3339
boolean deleted?;
integer currentItemCount?;
integer itemsPerPage?;
integer startIndex?;
integer totalItems?;
integer pageIndex?;
integer totalPages?;
string pageLinkTemplate /^https?:/ ?;
object {}* next?;
string nextLink?;
object {}* previous?;
string previousLink?;
object {}* self?;
string selfLink?;
object {}* edit?;
string editLink?;
array [
object {}*;
] items?;
}* data?;
object {
integer code?;
string message?;
array [
object {
string domain?;
string reason?;
string message?;
string location?;
string locationType?;
string extendedHelp?;
string sendReport?;
}*;
] errors?;
}* error?;
}*;
我和Laravel 5.4一起练习。我应该制作一个特性并使用自己的JSON响应格式吗?因为,每次返回JSON响应时都必须编写这种响应,这非常麻烦。
答案 0 :(得分:3)
您可以使用Middleware
拦截响应对象并根据需要对其进行格式化,例如我通常使用此方法在响应中附加标题:
<?php
# app/Http/Middleware/ResponseAPI.php
namespace App\Http\Middleware;
use Closure;
class ResponseAPI {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
$response = $next($request);
if (in_array($response->status(), [200, 201, 404, 401, 422])) {
$response->header('Content-Type', 'application/json');
}
return $response;
}
}
-
<?php
# app/Http/Kernel.php
.
.
.
protected $routeMiddleware = [
# others middlewares
'api.response' => \App\Http\Middleware\ResponseAPI::class
];
-
<?php
# app/Http/routes.php
$app->group(['prefix' => 'api/v1', 'middleware' => ['api.response']], function($app) {
# all routes
});
答案 1 :(得分:0)
您可以使用toJson()
方法。
https://laravel.com/docs/5.4/collections#method-tojson https://laravel.com/docs/5.4/pagination#converting-results-to-json
答案 2 :(得分:0)
您可以通过在传入请求上设置“ accepts”标头来添加中间件以强制JSON响应。在HttpKernel
的{{1}}中包括该中间件,以涵盖所有api路由。这是Laravel ^ 7.0解决方案。
$middlewareGroups['api']
-
<?php
# app/Http/Middleware/JsonResponse.php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class JsonResponse {
/**
* Set 'Accept' header to force a JSON response for API routes.
*
* @param Request $request
* @param Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$request->header->set('accept', 'application/json');
return $response;
}
}
感谢Alfredo EM将我引向这个解决方案。