【问题标题】:How to handle response with undefined body?如何处理未定义主体的响应?
【发布时间】:2014-10-01 15:04:24
【问题描述】:

我知道我的问题是 jQuery 试图将响应的主体解析为 json,但主体未定义,因此会引发错误。

我无法更改响应。这是来自 Jenkins 服务器的默认响应。它在标头中发送 201、404 或 500,我想处理它。

我的 ajax:

 $(document).ready(function () {
    $('#reviewForm').bootstrapValidator({
      ...stuff...
      ...validation...
  }) 

 .on('success.form.bv', function (e) {
// Prevent form submission
e.preventDefault();

// Get the form instance
var $form = $(e.target);

// Use Ajax to submit form data
$.ajax({
    type: 'POST',
    url: url+$form.serialize(),
    dataType: 'text',
    complete: function() {
        alert("Success.");
    },
    error: function(xhr, status, text) {
        alert("failure");
    }
});

尽管帖子成功(创建了201),但由于未定义的正文导致语法错误,它仍然会发生错误。

我很乐意处理 error: part of ajax 中的错误,但我一生都无法弄清楚如何从响应的标头中获取状态代码。

就像我说的,如果可以的话,我会改变响应,但这正是 Jenkins 的工作方式。

谢谢。

编辑:响应标头

Status Code: 201 Created
Connection: Keep-Alive
Content-Type: text/plain; charset=UTF-8
Date: Wed, 01 Oct 2014 14:51:12 GMT
Keep-Alive: timeout=15, max=100
Location: https://jenkins....
Server: Jetty(8.y.z-SNAPSHOT)
Transfer-Encoding: chunked

这是 xhr(xml http 响应)

{
"readyState": 0,
"status": 0,
"statusText": "error"
}

【问题讨论】:

  • 是什么让您认为 jQuery 试图将响应解析为 JSON?根据您的代码,您期待text - 所以undefined 响应正文不会有所作为。
  • dataType: 'text' 意味着它根本不会解析响应。它会将其保留为简单的字符串。无论您的错误是什么,都来自其他方面。
  • 我知道 jquery 将其作为错误处理,因为我的失败警报每次都会弹出。我在那里有一个成功的改动,但它永远不会弹出。如果不是解析错误,那就是别的,生病继续调查
  • 在您帖子的代码中,您应该同时看到“失败”和“成功”警报,因为 complete 回调将在 error 之后运行。
  • @JamesThorpe 是的,我收到了这些警报。

标签: javascript jquery html ajax post


【解决方案1】:

您可以对状态代码进行特定的回调,例如:

$.ajax({
    ...
   statusCode: {
     201: function() { /* I received a 201 */ },
     404: function() { /* I received a 404 */ },
     500: function() { /* I received a 500 */ }
   }
});

这列在the documentation

【讨论】:

  • statusCode 从正文中提取,我的是未定义的。我试过这个,它从来没有击中这些。
  • 对我来说响应状态码 = 0,不会根据 201 或 404 改变
【解决方案2】:

状态码决定了 jQuery 将触发哪些函数(即 completeerrorsuccess )。

所以,试试这个:

$.ajax({
    type: 'POST',
    url: url,
    dataType: 'text',
    complete: function(response) {
        console.log(response); 
    }); 

将来,这将使您能够更好地调试。 (通过您的检查元素控制台)

但是,在本例中,状态码将在

response.status

error 函数将触发任何不是 200 的东西 --- 所以你最好只使用完整的函数,然后把你的错误放在default switch-case 语句的块...

[...]
complete: function(response){
    switch(response.status){
        case 201: 
           alert("success"
        break;
        default:
            alert("Something unexpected occurred"); 
        break;
}

【讨论】:

  • 当我这样做时,我的响应对象如下所示: { "readyState": 0, "status": 0, "statusText": "error" } 无论响应头如何,这都是相同的状态码。
  • 所以我完全按照您的建议添加...尽管在网络控制台中看到 201 完成,它仍然会提醒默认语句。 response.status = 0
【解决方案3】:

只需使用 complete 处理程序 - 它将在 successerror 被调用后运行。无论哪种方式,对于completeerror,第一个参数都是jqXHR 对象,它有一个status 属性,可以为您提供响应的状态。

$.ajax({
    type: 'POST',
    url: url,
    dataType: 'text',
    complete: function(xhr) {
        //this handler runs regardless of success or error
        //query xhr.status for the response code
    }
});

【讨论】:

  • 我试过这个。问题是 xhr 对象对我没有帮助。 { "readyState": 0, "status": 0, "statusText": "error" }
【解决方案4】:

您可以使用statusCode

$.ajax({
   type: 'POST',
   url: url,
   statusCode: {
      200: function (response) {
         alert('200');
      },
      201: function (response) {
         alert('201');
      },
      404: function (response) {
         alert('400');
      }
   }, success: function () {
      alert('Success');
   },
});

【讨论】:

  • 我试过这个,它从来没有达到这些状态代码。这些将 statusCode 从响应的主体中提取出来,我的未定义。
  • 我认为您可能混淆了术语,状态代码在响应的标题中(您显示的标题给出了 201),响应正文中没有状态代码。跨度>
  • 你可能是对的,但无论哪种方式,它都不会提醒我。我可以在控制台中看到创建 201 的响应,但它从不提醒我 201。
  • 我已经从之前的代码中删除了data:。如果警报即将到来,请尝试。
  • @kums 也没有运气。我的问题是我的所有回复的 response.status = 0。然而,当我查看网络控制台时,我可以看到状态代码实际上应该是 201 和 404。
【解决方案5】:

如果我的意思是这样,你想检查来自服务器的响应(201、200、500): 也许使用.awlways()

$.ajax({
   type: 'POST',
   url: url,
   dataType: 'text',
   always: function(status){
      alert(status);
   }
});

或者你可以在 xhr 对象上使用getAllResponseHeaders()

【讨论】:

  • 由于某种原因它永远不会进入。我是否需要删除完整和失败才能让它进入那里?
  • 现在你可以检查你的反应,并确定返回码状态你可以做一些事情......如果完成/错误不起作用试试这个
  • 你试过getAllResponseHeaders()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2021-08-08
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
相关资源
最近更新 更多