使用jQuery $ .ajax()时如何使用GET在请求体中发送数据

时间:2012-04-24 13:29:39

标签: javascript jquery ajax

我正在使用的服务API具有给定的GET方法,该方法要求在请求正文中发送数据。

正文中所需的数据是由hypen分隔的id列表,可能非常大,因此必须在正文中发送,否则它可能会在浏览器/代理/ webservers等链中的某处发生。注意我无法控制服务或API,因此请不要提出更改建议。

我正在使用以下jQuery代码但是在fiddler中观察请求/响应我可以看到我发送的“数据”总是转换并附加到查询字符串,尽管我将“processData”选项设置为false。

$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   data: "id1-id2-id3",
   contentType: "text/plain",
   dataType: "json",
   processData: false, // avoid the data being parsed to query string params
   success: onSuccess,
   error: onError
});

任何人都知道如何强制在请求正文中发送“数据”值? 感谢任何帮助,提前谢谢。

4 个答案:

答案 0 :(得分:46)

通常,这不是系统使用GET请求的方式。因此,很难让你的图书馆一起玩。事实上,spec表示“如果请求方法是GET或HEAD区分大小写的匹配,则表明数据为空”。所以,除非您使用的浏览器不遵守规范的这一部分,否则我认为您运气不佳。

您可以在自己的服务器上设置端点以获取POST ajax请求,然后将服务器代码中的端点重定向到带有正文的GET请求。

如果您与身体是数据的GET请求没有绝对联系,那么您有两种选择。

使用数据进行POST:这可能就是您想要的。如果要传递数据,这可能意味着您正在修改某个模型或在服务器上执行某些操作。这些类型的操作通常使用POST请求完成。

使用查询字符串数据进行GET :您可以将数据转换为查询字符串参数,并将其传递给服务器。

url: 'somesite.com/models/thing?ids=1,2,3'

答案 1 :(得分:2)

我们通常都知道,根据http标准发送数据时,通常使用POST请求。 但是,如果您真的想使用Get在您的方案中发送数据 我建议您使用查询字符串或查询参数。

1.GET使用查询字符串作为{{url}}admin/recordings/some_id

此处some_id是要发送的必需参数,可以在服务器端使用 req.params.some_id

2. 使用查询字符串作为 {{url}}admin/recordings?durationExact=34&isFavourite=true

在这里durationDact,isFavourite是可选字符串,可以发送和使用,并且可以使用 req.query.durationExact req.query.isFavourite 在服务器端。

3. 获取发送数组 {{url}}admin/recordings/sessions/?os["Windows","Linux","Macintosh"]

,您可以像这样

在服务器端访问这些数组值
let osValues = JSON.parse(req.query.os);
        if(osValues.length > 0)
        {
            for (let i=0; i<osValues.length; i++)
            {
                console.log(osValues[i])
                //do whatever you want to do here
            }
        }

答案 2 :(得分:0)

您可以通过“ HEADERS”发送类似于“ POST”请求的数据。

类似这样的东西:

$.ajax({
   url: "htttp://api.com/entity/list($body)",
   type: "GET",
   headers: ['id1':1, 'id2':2, 'id3':3],
   data: "",
   contentType: "text/plain",
   dataType: "json",
   success: onSuccess,
   error: onError
});

答案 3 :(得分:-2)

以防万一有人仍然提出这个问题:

任何请求中都有一个正文查询对象。你不需要自己解析它。

E.g。如果你想从一个使用GET的客户端发送一个accessToken,你可以这样做:

const request = require('superagent');

request.get(`http://localhost:3000/download?accessToken=${accessToken}`).end((err, res) => {
  if (err) throw new Error(err);
  console.log(res);
});

服务器请求对象看起来像{request: { ... query: { accessToken: abcfed } ... } }