【问题标题】:Is it possible to use conditions within an AJAX call to avoid duplicate code?是否可以在 AJAX 调用中使用条件来避免重复代码?
【发布时间】:2015-07-11 02:57:41
【问题描述】:

例如,我目前正在实现客户端 javascript,如果附加参数超过 IE 对 GET HTTP 请求的 2048ish 字符的安全限制,它将使用 POST,而是以 JSON 格式将参数附加到正文。我的代码类似于以下内容:

var URL = RESOURCE + "?param1=" + param1 + "&param2=" + param2 + "&param3=" + param3();
        if(URL.length>=2048) {
            // Use POST method to avoid IE GET character limit
            URL = RESOURCE;
            var dataToSend = {"param3":param3, "param1":param1, "param2":param2};
            var jsonDataToSend = JSON.stringify(dataToSend);
            $.ajax({
                type: "POST",
                data: jsonDataToSend,
                dataType: 'json',
                url: URL,
                async: true,
                error: function() {
                    alert("POST error");
                },
                success: function(data) {
                    alert("POST success");
                }
            });
        }else{
            // Use GET
            $.ajax({
                type: "GET",
                dataType: 'json',
                url: URL,
                async: true,
                error: function() {
                    alert("GET error");
                },
                success: function(data) {
                    alert("GET success");
                }
            });
        }

有没有办法避免写出这个 ajax 两次?类似的东西

if(URL.length>=2048) {
// Use POST instead of get, attach data as JSON to body, don't attach the query parameters to the URL
}

注意我知道使用 POST 而不是 GET 来检索数据违反了 REST 的某些原则,但由于 IE 的限制,这是我能找到的最好的解决方法。也感谢处理这种情况的替代建议。

【问题讨论】:

  • 什么数据导致您的 GET 请求超过 2048 个字符?如果您期望输入的大小,它绝对应该是一个 POST 请求。但是要回答这个问题,只需将$.ajax 提取到另一个函数
  • 通过此调用请求根据用户浏览器设置的区域设置更改的多语言数据。大约有 4.4k 个字符
  • data 仍然含糊不清。图片?文本?数据 URI? 4.4k 个字符是 很多 文本数据,绝对太多,无法注入 URL
  • 文本,现在被附加到 POST 的正文中(令人惊讶的是,IE 实际上并没有抱怨 4.4k 字符的 URL。一切仍然按预期工作。但是对 POST 的重构发生了,因为数字可能会在遥远的将来扩大,我们不希望它在那时打破。)

标签: javascript jquery ajax http duplication


【解决方案1】:

jQuery 的$.ajax 方法获取一个带有属性的对象。所以很容易,首先生成该对象和“标准设置”,然后根据某些逻辑对其进行修改,最后通过 ajax 调用将其传递给一个 loc。

原理:

 var myAjaxSettings = {
            type: "POST",
            data: jsonDataToSend,
            dataType: 'json',
            url: URL,
            async: true,
            error: function() {
                alert("POST error");
            },
            success: function(data) {
                alert("POST success");
            }
        }

  if ( <condition a> )
      myAjaxSettings.type = "GET";

  if ( <condition b> )
      myAjaxSettings.success = function (data) { ...make something different ... };

  $.ajax(myAjaxSettings);

【讨论】:

  • 如果 为真,我如何删除数据:jsonDataToSend? (无需重新输入或重新定义 myAjaxSettings)
  • @James 不要。 jQuery 会将data 转换为查询字符串并自动附加到 GET 请求
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 2013-12-25
  • 2021-08-16
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多