Den*_*aga 27 php rest json restful-architecture laravel-4
我正在开发某种RESTful API.发生一些错误时,我抛出一个App::abort($code, $message)错误.
问题是:我希望他抛出一个带有"代码"和"消息"键的json形成的数组,每个数组包含上面提到的数据.
Array
(
[code] => 401
[message] => "Invalid User"
)
Run Code Online (Sandbox Code Playgroud)
有没有人知道它是否可能,如果可能,我该怎么做?
maj*_*rif 44
去你的app/start/global.php.
这将转换所有的错误的401和404一个自定义的JSON错误,而不是哎呦堆栈跟踪.添加这个:
App::error(function(Exception $exception, $code)
{
Log::error($exception);
$message = $exception->getMessage();
// switch statements provided in case you need to add
// additional logic for specific error code.
switch ($code) {
case 401:
return Response::json(array(
'code' => 401,
'message' => $message
), 401);
case 404:
$message = (!$message ? $message = 'the requested resource was not found' : $message);
return Response::json(array(
'code' => 404,
'message' => $message
), 404);
}
});
Run Code Online (Sandbox Code Playgroud)
这是处理此错误的众多选项之一.
制作API最好创建自己的帮助器,就像Responser::error(400, 'damn')扩展Response类一样.
有点像:
public static function error($code = 400, $message = null)
{
// check if $message is object and transforms it into an array
if (is_object($message)) { $message = $message->toArray(); }
switch ($code) {
default:
$code_message = 'error_occured';
break;
}
$data = array(
'code' => $code,
'message' => $code_message,
'data' => $message
);
// return an error
return Response::json($data, $code);
}
Run Code Online (Sandbox Code Playgroud)
Phi*_*lip 32
您可以将数组传递给返回的JSON响应:
$returnData = array(
'status' => 'error',
'message' => 'An error occurred!'
);
return Response::json($returnData, 500);
Run Code Online (Sandbox Code Playgroud)
Ibr*_*wal 16
这是我使用的(Laravel 5.2):
根据:https://laravel.com/docs/5.2/errors,我们可以为错误指定自定义渲染函数app\Exceptions\Handler.php.我所做的就是将渲染功能更改为:
/**
* Render an exception into an HTTP response.
* Updated to return json for a request that wantsJson
* i.e: specifies
* Accept: application/json
* in its header
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($request->ajax() || $request->wantsJson()) {
return response()->json(
$this->getJsonMessage($e),
$this->getExceptionHTTPStatusCode($e)
);
}
return parent::render($request, $e);
}
protected function getJsonMessage($e){
// You may add in the code, but it's duplication
return [
'status' => 'false',
'message' => $e->getMessage()
];
}
protected function getExceptionHTTPStatusCode($e){
// Not all Exceptions have a http status code
// We will give Error 500 if none found
return method_exists($e, 'getStatusCode') ?
$e->getStatusCode() : 500;
}
Run Code Online (Sandbox Code Playgroud)
在此之后,您需要做的就是确保所有API请求都指定Accept: application/json标头.希望这可以帮助 :)
kjd*_*n84 10
下面是我在5.6中使用的内容,以便返回与内置validate方法相同类型的响应:
response()->json(['errors' => ['email' => ['The email is invalid.']]], 422);
Sap*_*aik 10
您必须Accept:application/json在客户端的 API 请求中设置标头,Laravel 将自动返回 JSON 格式错误。
{
"message": "Unauthenticated."
}
Run Code Online (Sandbox Code Playgroud)
根据Ibrahim的回答,并非每个ajax请求都需要JSON,响应"状态代码" 和 "状态"是不必要的,因为它们都意味着相同的事情.更重要的是,没有必要在响应"状态"中提及,因为响应代码"说"了.像这样的东西应该完美地工作:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($request->wantsJson())
return response()->json(
['message' => $e->getMessage()],
method_exists($e, 'getStatusCode') ? $e->getStatusCode() : 500);
return parent::render($request, $e);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
77357 次 |
| 最近记录: |