这是我的代码:
$.ajax({ url: "/api/invoice/" + newInvoice._id,type: 'PUT',data: JSON.stringify(newInvoice),dataType: 'json',contentType: "application/json; charset=utf-8" }) .success(function () { $('#statusLine').text('Successfully submitted invoice {0}. Click here to dismiss.'.format(newInvoice._id)); }) .error(function (err) { alert(err); });
请求:
PUT http://localhost:8000/api/invoice/16211 HTTP/1.1 Host: localhost:8000 Connection: keep-alive Content-Length: 770 Origin: http://localhost:8000 X-Requested-With: XMLHttpRequest User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML,like Gecko) Chrome/20.0.1132.57 Safari/536.11 Content-Type: application/json; charset=UTF-8 Accept: application/json,text/javascript,*/*; q=0.01 Referer: http://localhost:8000/invoice.html?id=16211 Accept-Encoding: gzip,deflate,sdch Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 {"items":[{"id":...
请求体实际上是一个有效的json,为简洁起见,我刚刚截断它.
响应:
HTTP/1.1 409 Conflict X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 1386 ETag: 250542419 Connection: keep-alive { "msg": "Cannot update the invoice #16211,because it has already been updated by someone else.","invoice": { "items": [ {...
再次,响应是一个完全有效的json,为了简洁而被截短.
如预期的那样,错误处理程序用err对象调用.但是,我怎么能忍住被解析的json?当然,我可以检查一下响应的内容类型是json,然后自己解析err.responseText,但是jQuery ajax是不是应该为我做的?我的意思是,当我从服务器获取对象时,它对我的$.get查询是这样做的.
我失踪了什么
编辑
这是https://stackoverflow.com/a/12310751/80002的修正:
做请求:
var ajax = $.ajax(...
处理错误响应:
var res,ct = ajax.getResponseHeader("content-type") || ''; if (ct.indexOf('json') > -1) { res = $.parseJSON(err.responseText); // process the response here }
解决方法
对于非2001
HTTP status code的错误消息,内容将不会被jQuery解析.如果您真的不希望自己将返回的结果解析为JSON,则必须返回HTTP状态200并使用success(done)回调.
这是一个很好的迹象,你正在使用(从你的例子)HTTP代码409,我想你应该继续这样做 – 只需咬一下子弹,并在你的错误处理程序中手动解析JSON.如果解析失败,还有其他一些问题(例如临时网络故障),但是这将允许您构建一个可用于您(可能还有其他人)可以消耗的API,而无需在成功函数中构建太多的错误检查.
保持成功获得快乐的结果,并为不愉快的结果提供错误.
1技术上任何2xx状态都应该被认为是成功的; in jQuery (status >= 200 && status < 300 || status === 304)
counts as something successful.