我正在尝试使用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请求。
答案 0 :(得分:32)
GET请求(at least usually)没有邮件正文。如the docs中所述,jQuery将data
GET请求附加到url参数。您应该能够从服务器应用程序中读取sort
参数。
BTW,没有用户代理允许您设置Content-Length
标题 - 它将(并且必须)根据发送的数据自动完成。
答案 1 :(得分:22)
有些地方你有点不对劲。
CONTENT_LENGTH
,而是Content-Length
。Content-Length
标题,浏览器会为您执行此操作。以下内容适用于您:
$.ajax({
url: "/api/endpoint?parameters="+encodeURIComponent(JSON.stringify({"sort":"date"})),
type: "GET",
...
});
答案 2 :(得分:5)
我认为你应该在URL中使用JSON.stringify作为GET参数:
$.ajax({
url: "/api/endpoint?parameters="+JSON.stringify({"sort":"date"}),
type: "GET",
contentType: "application/json",
dataType: "json",
...
答案 3 :(得分:3)
如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;
}