【问题标题】:jquery ajax - dealing with 2 separate response typesjquery ajax - 处理 2 种不同的响应类型
【发布时间】:2018-07-12 20:33:46
【问题描述】:

我正在开发一个应用程序 (jquery 3.2.1),其中进行 ajax 调用可能会导致以下情况之一发生 - 只要服务器提供 HTTP 200 OK 响应:

  1. 返回 HTML。这是期望的结果,因为它是对有效请求的“内容”响应。

  2. 如果存在基于请求数据的验证错误,则返回 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 吗?

每个响应标头都不同:

  1. Content-Type: text/html; charset=UTF-8

  2. Content-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 个返回类型。如果您真的想与其他开发人员一起编码,请遵循现有的编码标准和模式......

标签: jquery ajax


【解决方案1】:

正如您所观察到的,在案例 #2 中您会收到 json 格式的响应。当您的代码被传递response 参数时,这应该已经被解析了。使用JSON.stringify 再次将其转换为字符串,您将能够在 html 代码中显示它:

$('#ajaxContent').html(JSON.stringify(response)).show();

请注意,这不是一个漂亮的视图,因为 JSON 结构未转换为等效的 html 子树。

查看this fiddle 以查看完整示例。

有一些库可以将 JSON 结构转换为交互式 html,例如。 JSTree(对于您的用例可能有点矫枉过正)。

【讨论】:

    【解决方案2】:

    好的,我正在回答我自己的问题。

    这里真正的问题是:有没有办法在.done()内部判断响应类型是HTML还是JSON

    是的,有。记录在这里:jquery how to check response type for ajax call

    所以我最终的 ajax 代码如下所示:

    $.ajax({
        url: $('#searchRegulations').attr('action'),
        type: 'post',
        cache: false,
        data: $('#searchRegulations').serialize()
     }).done(function (response, status, xhr) {
    
                // The ajax handler can return either HTML or JSON. So we need to know what's been returned.
                var ct = xhr.getResponseHeader("content-type") || "";
    
                // HTML response == content to display. No validation error.
                if (ct.indexOf('html') > -1) {
                    if (response) {
                        $('main .content').hide();
                        $('#ajaxContent').html(response).show();
                        return false;
                    }
                }
                // JSON response. Validation error(s) occurred.
                if (ct.indexOf('json') > -1) {
                    $.each(response, function(i, v) {
                        $.each(v, function(k, m) {
                             var msg = '<span class="help-block">'+m+'</span>';
                             $('input[name="' + i + '"]').parent().after(msg);
                             $('input[name="' + i + '"]').closest('.form-group').addClass('has-error');
                        });
                    });
                }  
    });
    

    这样做意味着您可以检查是否返回了 HTML - 在这种情况下,将其显示在 #ajaxContent 中。如果发生错误并从 ajax 脚本返回 JSON,则可以根据返回的 JSON 在适当的表单字段下写入错误消息。

    【讨论】:

    • 如果您想要一个好的设计实践,我建议您选择返回 HTML 或 JSON 来进行成功或失败操作。我不建议您朝着返回类型可能是这个或那个的方向前进。就像任何函数/方法一样,它有 1 种返回类型。如果您真的想与其他开发人员一起编码,请遵循现有的编码标准和模式......
    • 您是否有任何资源(链接等)可以支持您的主张?我不同意。函数的输出可能是需要呈现/格式化为 HTML 的有效数据,或者是对验证错误消息的不同类型的响应。该请求将发送到同一个 ajax 端点,并且它必须做出适当的响应。在出现错误的情况下,JSON 是比 HTML 更合适的响应,因为它可以更轻松地应用于 UI 的适当部分(在这种情况下是不同的表单字段)。
    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2022-07-13
    相关资源
    最近更新 更多