30

我正在尝试使用 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 请求。

4

4 回答 4

32

GET 请求(至少通常)没有消息体。如文档中所述,jQuery 将dataGET 请求附加到 url 参数。您应该能够sort使用您的服务器应用程序从那里读取您的参数。

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

于 2012-06-08T11:55:48.000 回答
22

有几个地方你做错了。

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

像下面这样的东西应该适合你:

$.ajax({
     url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
     type: "GET",
     ...
});
于 2012-06-13T14:12:13.820 回答
5

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

$.ajax({
           url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
           type: "GET",
           contentType: "application/json",
           dataType: "json",
           ...
于 2012-06-08T12:04:38.307 回答
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;
    }
于 2012-06-13T14:03:25.017 回答