如何自定义(或覆盖)CodeIgniter的show_error函数以将错误返回为json?
好吧,如果您希望返回像数组这样的复杂错误对象,这个解决方案并不完全有用(尽管您可以,但是您必须在客户端上解析json)但是我们继续:
只需使用HTTP
为什么?好吧,你可以传递第二个参数,它恰好是HTTP响应代码,这恰好很酷,因为它允许你使你的应用程序具有HTTP感知能力,并且对于客户端ajax请求非常好。
你想要做的是首先定义后端会发生什么样的错误,有一个HTTP错误代码列表here。
HTTP错误代码
您很可能会使用200,400和500范围内的错误代码。实际上当你在网络浏览器上点击服务器时,它通常会收到200个http响应代码,这意味着一切都很顺利。
你看过那些“内部服务器错误”消息吗?那么他们是500个http响应代码。这意味着,这是服务器的错误。哪一个?这取决于你如何对它们进行分类,500范围内有一组错误,但如果你不想麻烦,只需使用500通用错误代码响应。
另一个范围是400.这些通常是来自用户的错误,例如,如果你去服务器内部的URL并且它不存在你会得到着名的404未找到,400是一般错误代码意味着客户端(在这种情况下,浏览器)请求了一些东西,但请求是无效的,特别是在404的情况下,找不到您请求的资源,这是一个客户端错误,因为您应该知道服务器上有哪些资源可用。
如何在codeigniter中做到这一点
实际上它非常简单。如果您在文档中看到show_error()引用,则表明该方法接收第一个参数作为错误消息,第二个参数接收错误代码。哪个错误代码?我们之前谈过的HTTP代码,所以:
show_error('Howdy, this is my debug message', 500);
会向客户端发送500 HTTP响应代码,包括您的消息。
如何捕获AJAX
考虑到你使用的是jQuery,这就是你通常会做的事情:
$.ajax({
type: 'POST',
url : example.com/resource,
data: $("#some-form").serialize(),
dataType: 'json',
success : function(data, textStatus, req) {
//do something with data which is a json object returned from PHP
},
error: function(req, textStatus, errorThrown) {
//this is going to happen when you send something different from a 200 OK HTTP
alert('Ooops, something happened: ' + textStatus + ' ' +errorThrown);
}
});
如果您正在使用任何其他工具包甚至直接使用DOM对象,您仍然可以捕获它们,因为它们只是XMLHttpRequest objects,并且您的工具包可能会对HTTP错误响应或成功响应进行回调。
我为什么要关心?
因为它遵循标准,它更容易调试,你将该工作委托给show_error()帮助器,这是有原因的,最重要的是因为所有的cool kids are using it。
很酷,但是等等,我没有看到我的自定义错误消息!
这是正确的,因为当您在jquery的错误回调中捕获请求时,您得到的是通用错误描述和类似“内部服务器错误”和500的代码,但是,您仍然可以使用自定义调试获得漂亮的HTML响应消息,看它只是使用某种开发人员工具的Firefox或Chrome。例如,如果您使用Google Chrome,则可以打开开发人员工具:
转到网络选项卡,您将看到HTTP请求,单击其名称
您将看到使用常用CI模板的详细信息和自定义错误消息,这是在请求中返回的带有消息的html
最后,如果你想进一步挖掘并完全调试从php / web服务器发送到客户端的内容,请转到headers选项
免责声明:屏幕截图不是从生产服务器获取的:)
在"Oliver Smith" blog找到答案google了一点...
我通过扩展CI_Exceptions将此函数添加到CI核心函数中:
function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
header('Cache-Control: no-cache, must-revalidate');
header('Content-type: application/json');
header("HTTP/1.1 500 Internal Server Error");
echo json_encode(
array(
'status' => FALSE,
'error' => 'Internal Server Error',
'message' => $message
)
);
exit;
}
所有学分归“奥利弗史密斯”。