【问题标题】:JQuery, send JSON object using GET methodJQuery,使用 GET 方法发送 JSON 对象
【发布时间】:2012-06-12 11:26:36
【问题描述】:

我正在尝试使用 GET 方法发送一个 json 对象。我的代码:

$.ajax({
           url: "/api/endpoint",
           type: "GET",
           data: {"sort":"date"},
           contentType: "application/json",
           dataType: "json",
           ...

但是,收到的标头将“Content-Length”设置为零,因此我在服务器上的 json 解析器不会读取内容。

我已经尝试设置内容长度标头,但它仍然为零:

$.ajax({
           url: "/api/endpoint",
           headers: {"CONTENT_LENGTH",JSON.stringify({"sort":"date"}).length},
           type: "GET",
           data: {"sort":"date"},
           contentType: "application/json",
           dataType: "json",
           ...

知道如何让它工作吗?它必须是 GET 请求。

【问题讨论】:

  • GET 请求没有内容???
  • Content-length 无关紧要,因为您没有使用正文发出请求。您如何阅读请求?
  • 您是否检查过您的请求的外观(例如在 Firebug - Net 选项卡中)?

标签: jquery ajax json


【解决方案1】:

GET 请求 (at least usually) 没有消息正文。如the docs 中所述,jQuery 将 GET 请求的data 附加到 url 参数。您应该能够使用您的服务器应用程序从那里读取您的 sort 参数。

顺便说一句,没有用户代理允许您设置 Content-Length 标头 - 它会(并且必须)根据发送的数据自动完成。

【讨论】:

    【解决方案2】:

    有些地方你做错了。

    • 不是CONTENT_LENGTH,是Content-Length
    • 不要设置Content-Length标头,浏览器会替你做的。
    • 获取请求的内容长度 = 0。

    以下内容应该适合您:

    $.ajax({
         url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
         type: "GET",
         ...
    });
    

    【讨论】:

      【解决方案3】:

      我认为你应该使用 JSON.stringify 作为 URL 中的 GET 参数,如下所示:

      $.ajax({
                 url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
                 type: "GET",
                 contentType: "application/json",
                 dataType: "json",
                 ...
      

      【讨论】:

      • -1: JSON.stringify 可能有一个& 会中断请求。另外,为什么是 contentType ?
      • 我试过这个并使用 contentType: "application/json", dataType: "json",当你使用 json.stringify() 时会破坏一些东西,把它们拿出来繁荣一下,它可以工作。跨度>
      【解决方案4】:

      正如Bergi所说,通过jQuery.ajax()将数据转换为请求参数。 从 jQuery 1.7.2 开始:

      // Determine if request has content
      s.hasContent = !rnoContent.test( s.type );    --> false when s.type == "GET'
      

      ...

      if ( !s.hasContent ) {
          // If data is available, append data to url
          if ( s.data ) {
              s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
              // #9682: remove data so that it's not used in an eventual retry
              delete s.data;
          }
      

      【讨论】:

        猜你喜欢
        • 2017-08-16
        • 2014-03-17
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 2019-06-24
        • 1970-01-01
        • 2015-11-11
        • 2015-10-21
        相关资源
        最近更新 更多