【发布时间】:2018-07-12 20:33:46
【问题描述】:
我正在开发一个应用程序 (jquery 3.2.1),其中进行 ajax 调用可能会导致以下情况之一发生 - 只要服务器提供 HTTP 200 OK 响应:
返回 HTML。这是期望的结果,因为它是对有效请求的“内容”响应。
如果存在基于请求数据的验证错误,则返回 JSON 错误。
我的 ajax 代码如下所示:
$.ajax({
url: $('#searchRegulations').attr('action'),
type: 'post',
cache: false,
data: $('#searchRegulations').serialize()
}).done(function (response) {
if (response) {
// Display response (point 1)
$('main .content').hide();
$('#ajaxContent').html(response).show();
return false;
} else {
// Handle JSON error (point 2)
}
});
正如我在上面的 cmets 中提到的,如果发生情况 1(返回 HTML),那么我将其写入#ajaxContent。没关系。
但是对于情况 2,我该怎么办?如果我添加以下代码:
// Handle JSON error (point 2)
$('main .content').hide();
$('#ajaxContent').html(response).show();
#ajaxContent 里面没有写任何东西。
这是因为没有返回 HTML 吗?
每个响应标头都不同:
Content-Type: text/html; charset=UTF-8Content-Type: application/json; charset=UTF-8
我在 jquery ajax documentation 上查看了 dataType,但不确定这是否相关,因为根据结果我实际上收到了 2 个单独的 Content-Type。
在场景 2 中返回 JSON 的原因是因为有一些代码(未显示)可以在每个字段下方写入错误消息,例如
`{rf_keywords: {length: "Search keywords must under 1500 characters in length."}}`
所以 HTML 更适合情况 1,而 JSON 更适合情况 2。
有人可以建议吗?
【问题讨论】:
-
发布您返回的示例: 1. HTML 响应,例如父 HTML 标记 2. Json 响应,例如 json 对象中的父对象
-
您可以更改响应吗?如果是,您可以更改为类似 {htmlContent: "
", json: '{yourjsonobject:here}' 并检查响应 if (response.htmlContent) { //do HTML stuff } if (response .json) { //做 json 的东西 } -
如果发生错误,让服务器相应地更改 HTTP 状态代码 - 例如400 表示验证错误,404 表示资源未找到,403 表示禁止,等等。您会发现各种标准状态非常适合大多数类型的请求错误。这样,您的 JS 代码将落入“失败”回调而不是“完成”,然后您可以轻松知道您需要将响应解析为 JSON 而不是 HTML。
-
那么在
.done()中是否无法查看响应类型(text/html;或application/json;)是什么?我必须进入.fail()方法才能做到这一点? -
如果您想要一个好的设计实践,我建议您选择返回 HTML 或 JSON 来进行成功或失败操作。我不建议您朝着返回类型可能是这个或那个的方向前进。就像任何函数/方法一样,它有 1 个返回类型。如果您真的想与其他开发人员一起编码,请遵循现有的编码标准和模式......