【问题标题】:Ajax post request string data instead of objectAjax 发布请求字符串数据而不是对象
【发布时间】:2013-02-04 13:25:36
【问题描述】:

类似于this question 我需要在发布请求中发送一个字符串作为数据。

与那个不同,我不能使用一个对象,因为我有重复的项目。正如您在我的示例数据 sn1 中看到的那样,sn2 和 sn3 在不同的日期时间重复了几次。

样本数据:

&sn3=2013-2-4T12:43:52&sn3=2013-2-4T12:43:55&sn1=2013-2-4T12:43:59&sn1=2013-2-4T12:44:0&sn2=2013-2-4T12:44:0&sn3=2013-2-4T12:44:2&sn2=2013-2-4T12:44:3&sn3=2013-2-4T12:44:19&sn3=2013-2-4T12:44:19&sn3=2013-2-4T12:44:19&sn2=2013-2-4T12:44:19&sn3=2013-2-4T12:44:21&sn2=2013-2-4T12:44:22&sn2=2013-2-4T12:46:39&sn3=2013-2-4T12:46:42&sn2=2013-2-4T12:46:44&sn2=2013-2-4T12:46:45&sn2=2013-2-4T12:46:46&sn2=2013-2-4T12:47:27&sn2=2013-2-4T12:47:27&sn2=2013-2-4T12:49:44&sn2=2013-2-4T12:50:21&sn2=2013-2-4T12:52:21&sn2=2013-2-4T12:52:24&sn2=2013-2-4T12:57:35&sn3=2013-2-4T12:57:38&sn3=2013-2-4T12:57:39&sn2=2013-2-4T12:57:39&sn2=2013-2-4T12:57:40&sn3=2013-2-4T12:57:46&sn3=2013-2-4T13:21:30

我尝试使用以下

console.log(screens); //logs my sample data posted above.
        $.ajax({
            url : url,
            type: "POST",
            dataType : 'text',
            data : screens,
            success : function(data) {
                console.log("sucessfull sending:")
                console.log(data);
            },
            error : function() {
                console.log('failed');
            }

        });

但它总是触发失败。

我可以将它作为字符串发送吗?如果不是,如何使用相同的密钥发送多个项目?

【问题讨论】:

  • 调试器控制台中的“网络”选项卡是否显示错误?错误函数的返回参数中的错误是什么?另外,将您的错误函数更改为error: function(jqXHR, textStatus, errorThrown),然后您可以在errorThrown 中看到错误消息。您还可以获得更多信息来检查错误事件处理程序中的其他 2 个参数。您收到的错误信息是什么?
  • 我没有网络标签。我正在使用 phonegap 开发它,所以我无法访问令人惊叹的调试器控制台。当我们使用另一种解决方案时,我没有费心记录所有内容!谢谢!
  • 啊,我明白了。至少您可以在将来需要时使用错误处理程序参数。很抱歉,没有意识到你在使用 phonegap。
  • 可能是因为我没有提到它:)。如果我在标签中添加 phonegap,我会得到一半的正常回复。您的评论非常有帮助,主要是因为我从未注意到我们在控制台中有一个网络选项卡,它非常方便。我来自移动背景,phonegap 讨厌我。所以每一点都有帮助!谢谢!

标签: javascript jquery ajax


【解决方案1】:
    console.log(screens); //logs my sample data posted above.
    $.ajax({
        url : url,
        type: "POST",
        dataType : 'text',
        data : {screens:screens},
        success : function(data) {
            console.log("sucessfull sending:")
            console.log(data);
        },
        error : function() {
            console.log('failed');
        }

    });

data : {screens:screens},,如果你这样做,在服务器上你将能够得到它:screensString = Request["screens"]。之后,screensString 将包含一个包含所有屏幕的字符串。

【讨论】:

  • 感谢您的建议,这就是我想要的。将我的字符串中的 &s 替换为 |s 并且服务器可以拆分并使用它。
  • 嗯。如果我没有遗漏一些重要的东西,您应该可以像使用| 一样使用&。无需任何替换。
  • 可能。但为什么要冒险?我确定我可以使用|。安全总比后悔好!
【解决方案2】:

当您没有在 ajax 选项中指定 contentType 时,您的请求将默认为 'application/x-www-form-urlencoded;字符集=UTF-8'。 但是,当您的帖子数据只是文本时,您应该通过指定 contentType 'text' 让服务器知道这一事实。 与 contentType 不同,dataType 指定您期望从服务器返回的响应数据的类型。

【讨论】:

  • 这并没有解决问题,但我不知道 contentType 参数。谢谢。
【解决方案3】:

我认为您需要在参数中使用 []。

而不是多次发送&sn3=(它正在重写自己)将其作为数组发送,就像这样&sn3[]=

如果您从表单输入中获取此数据,请使用 name="sn3[]",如果是这种情况,我建议您使用 $('#yourform').serialize() 作为发送的数据

【讨论】:

  • +1,这也是一个很好的建议,但我们选择了另一个。无论如何,服务器都必须解析字符串,这对客户端来说是额外的工作。
  • 注意:这取决于服务器如何处理[]。在 php 中你会得到很好的数组。在 asp.net - 你会得到一个包含所有 sn3[] 值的项目,这些值用 | 分隔,我记得。
  • 谢谢,顺便说一下,纠正你所说的(gameower)服务器将得到一个数组而不是字符串
猜你喜欢
  • 2017-08-17
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-08
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多