这是我的代码:
$.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);
});
Run Code Online (Sandbox Code Playgroud)
请求:
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":...
Run Code Online (Sandbox Code Playgroud)
请求体实际上是一个有效的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": [
{...
Run Code Online (Sandbox Code Playgroud)
同样,响应是一个完全有效的json,为简洁而截断.
正如所料,error使用该err对象调用处理程序.但是,我怎样才能抓住解析过的json?当然,我可以检查响应的内容类型是json然后解析err.responseText自己,但不是jQuery ajax应该为我做什么?我的意思是,$.get当我从服务器获取对象时,它会对我的查询执行此操作.
我错过了什么?
编辑
这是对/sf/answers/861752601/的更正:
执行请求:
var ajax = $.ajax(...
Run Code Online (Sandbox Code Playgroud)
处理错误响应:
var res, ct = ajax.getResponseHeader("content-type") || '';
if (ct.indexOf('json') > -1) {
res = $.parseJSON(err.responseText);
// process the response here
}
Run Code Online (Sandbox Code Playgroud)
mar*_*n87 41
我遇到了同样的问题,发现与@ Barmar的答案略有不同.
藏汉作为responseText,也有responseJSON属性,所以你可以做到以下几点:
var json_response = err.responseJSON.msg;
Run Code Online (Sandbox Code Playgroud)
如果您console.log(err);在那里有一些属性,您可能希望在页面上的错误消息中使用它们.
Joe*_*rra 25
对于具有非200 1 HTTP状态代码的错误消息,jQuery不会解析内容.如果您真的不想自己将返回的结果解析为JSON,则必须返回HTTP状态200并使用success(done)回调.
这是一个好的迹象,表明您正在使用(来自您的示例)HTTP代码409,我认为您应该继续这样做 - 只需咬住子弹并在错误处理程序中手动解析JSON.如果解析失败,则会出现其他问题(例如临时网络故障),但这将允许您构建一个很好的API,您(可能还有其他人)可以使用它而无需在成功函数中构建太多错误检查.
保持success愉快的结果,以及error不愉快的结果.
1从技术上讲,任何2xx状态都应被视为成功; 在jQuery中(status >= 200 && status < 300 || status === 304)算作成功的东西.
Bar*_*mar 10
呼叫$.parseJSON你的错误回调明确:
(...)
.error(function (err) {
var msg = $.parseJSON(err).msg;
alert(msg);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35645 次 |
| 最近记录: |