2011-10-09 113 views
2

我有一个jQuery ajax函数在调用失败时用HTML响应。如果调用成功,它JSON响应:{"result":true}有一个ajax根据其成功返回JSON或HTML是不是很好?

$.ajax({ 
     type: 'POST', 
     dataType: 'html', 
     success: function (response) { 
      if (response.RESULT === true) { 
       window.location.replace(baseUrl); 
      } // else do something else and show errors 
     } 
    }); 

Firefox将不能识别的结果JSON,但是,由于数据类型设置为“HTML”。我试图把它留空,而这没有奏效。有没有解决办法,还是返回两件事情不好?

这是一个注册表格。我返回HTML是因为它更容易显示用户验证(服务器端)错误,而如果注册成功,我将它们重定向。

回答

6

我认为一个AJAX调用应该总是以相同的格式返回数据。只有在呼叫失败的情况下才返回HTML是不好的做法。您可以随时返回与状态参数的JSON响应,可以是成功错误内容参数这是HTML的响应。

4

这是一个不好的做法,虽然不是世界的尽头。我宁愿把它称为“黑客”。请求的状态应基于响应代码(200-确定,40x内容错误,50x服务器错误)。

5

返回两种不同格式的数据是不好的做法。该服务的消费者不会知道会发生什么,这也是不好的做法来改变整个一组相关服务的格式(虽然有些特殊的情况下证明它)

你的情况:

你能而不是做的是返回JSON所有的时间,并在错误的情况下,以这种格式返回JSON:

{ 
    "errorsHtml" : "<div class='errors'>...</div>" 
} 

而且你还可以利用HTTP状态代码头,以表示服务器的状态,例如状态500是服务器内部错误。您可以处理不同的状态代码是这样的:

$.ajax({ 
    statusCode: { 
    404: function() { 
     alert('page not found'); 
    } 
    } 
}); 
2

不要指定数据类型 -
如果没有指定,jQuery将尝试基于MIME类型的响应来推断它

指定多个值是罚款并允许 -
多个以空格分隔的值:从jQuery 1.5开始,jQuery可以将ContentType类型头中的数据类型转换为您所需的数据类型。例如,如果您希望将文本响应视为XML,请将“text xml”用于dataType。

$.ajax({ 
    type: 'POST' 
    dataType: 'html json', 
    success: function (response) { 
     if (response.RESULT === true) { 
      window.location.replace(baseUrl); 
     } // else do something else and show errors 
    } 
}); 

http://api.jquery.com/jQuery.ajax/ - 检查数据类型说明。

+0

这并不意味着服务器会返回为所欲为 - 在你的情况下,返回的数据将被转换成JSON即使它在HTML中,当服务器实际返回一次HTML中的HTML和另一种情况下的json – Zasz

+0

肯定不会表示服务器可以返回任何内容,但它仍然没有问题。 – Jayendra

+0

您编辑了您的答案,并告诉jquery将json转换为html,换句话说,即使内容类型为text/html,jquery也会将其视为json数据。好,现在当服务器返回json和客户端也需要json时,会发生什么情况?不过感谢分享,我不知道jQuery中存在这样的功能 – Zasz

2

好的做法是返回请求的数据类型。就这么简单。发送数据不一致可能适用于短期,但如果您忘记了为什么您决定在一种情况下返回JSON而另一种情况下是HTML,那么最终会出现长期可维护性问题。

请求数据的方式很多,我个人最喜欢的是一个RESTful请求实现。实现RESTful系统有很多方法。

如果你要做出www.example.com/cars你可能会得到汽车的列表的请求,但有服务器没有什么好办法知道如何你想格式化小汽车的名单。

一个简单的方法来指定你想要的是添加一个后缀:www.example.com/cars?type=HTML可能足以描述足以通知服务器你想要什么类型的数据&hellip;

如果有办法指定您希望从服务器接收的数据类型而不是污染查询字符串会不会很方便?

事实证明有一种方法&hellip;文件扩展名:www.example.com/cars.html对于应该返回什么类型的数据非常具体,并且在您需要追踪该错误时您不会在6个月内感到困惑,因为您会知道客户端请求是期望 HTML。

www.example.com/cars.jswww.example.com/cars.json可以返回不同类型的数据,您永远不会对请求应该返回给客户端的内容感到困惑。

使用RESTful实现的最佳部分是,您可以将请求错误作为HTTP状态代码提出。格式错误的请求?发出400错误。权限不正确?发出403

将错误处理程序绑定到AJAX请求,并且您将能够轻松区分返回的“成功”JSON和“错误”JSON。

如果你真的希望在JSON预计HTML,只是JSON编码它的对象为{"error":"your html <strong>here</strong>"}