Ale*_*iro 1 php debugging ajax json codeigniter
如何自定义(或覆盖)CodeIgniter的show_error函数以将错误返回为json?
Gus*_*bio 22
好吧,如果您希望返回像数组这样的复杂错误对象,这个解决方案并不完全有用(尽管您可以,但是您必须在客户端上解析json)但是我们继续:
只需使用HTTP
为什么?好吧,你可以传递第二个参数,这恰好是HTTP响应代码,这恰好很酷,因为它允许你使你的应用程序具有HTTP感知能力,并且对于客户端ajax请求非常好.
你想要做的是首先定义可以在后台发生什么样的错误,有一个HTTP错误代码列表在这里.
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);
Run Code Online (Sandbox Code Playgroud)
会向客户端发送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);
}
});
Run Code Online (Sandbox Code Playgroud)
如果您直接使用任何其他工具包甚至DOM对象,您仍然可以捕获它们,因为它们只是XMLHttpRequest对象,并且您的工具包可能会对HTTP错误响应或成功响应进行回调.
我为什么要关心?
因为它遵循标准,它更容易调试,你将该工作委托给show_error()帮助器,这是有原因的,最重要的是因为所有酷孩子都在使用它.
很酷,但是等等,我没有看到我的自定义错误消息!
这是正确的,因为当您在jquery的错误回调中捕获请求时,您得到的是通用错误描述和类似"内部服务器错误"和500的代码,但是,您仍然可以使用自定义调试获得漂亮的HTML响应消息,看它只是使用某种开发人员工具的Firefox或Chrome.例如,如果您使用Google Chrome,则可以打开开发人员工具:
转到网络选项卡,您将看到HTTP请求,单击其名称
您将看到使用常用CI模板的详细信息和自定义错误消息,这是在请求中返回的带有消息的html

最后,如果你想进一步挖掘并完全调试从php/web服务器发送到客户端的内容,请转到headers选项

免责声明: 屏幕截图不是从生产服务器获取的:)
在“奥利弗·史密斯”博客上进一步谷歌搜索找到了答案。
我通过扩展 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;
}
Run Code Online (Sandbox Code Playgroud)
所有功劳均归功于“奥利弗·史密斯”。
| 归档时间: |
|
| 查看次数: |
12429 次 |
| 最近记录: |