JQuery,使用GET方法发送JSON对象

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

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

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

我已经尝试过设置内容长度标题,但它仍然以0为单位来到服务器:

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

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

GET请求( 至少通常 )没有消息体。 正如文档中所提到的 ,jQuery将GET请求的data附加到url参数。 您应该可以从服务器应用程序中读取sort参数。

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

有几个地方你有点不对劲。

  • 它的Content-Length不是CONTENT_LENGTH
  • 不要设置Content-Length标头,浏览器会为你做。
  • 获取请求的content-length = 0。

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

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

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

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

正如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; }