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

IT技术 javascript jquery ajax
2021-02-07 01:48:12

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

正文中所需的数据是由连字符分隔的 id 列表,并且可能非常大,因此必须在正文中发送,否则它可能会在浏览器/代理/网络服务器等链中的某个位置出现 foobar。请注意,我无法控制服务或 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
});

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

3个回答

通常,这不是系统使用 GET 请求的方式。因此,很难让您的库发挥作用。事实上,规范说“如果请求方法是 GET 或 HEAD 的区分大小写的匹配,就像数据为空一样。” 因此,我认为除非您使用的浏览器不遵守规范的那一部分,否则您很不走运。

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

如果您不是完全依赖于主体是数据的 GET 请求,那么您有两种选择。

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

使用查询字符串数据获取:您可以将数据转换为查询字符串参数,并以这种方式将它们传递给服务器。

url: 'somesite.com/models/thing?ids=1,2,3'
感谢您添加一个将 POST 转换为带有正文的 GET 的代理的额外建议。我试图在 .NET 中实现这一点,但它抛出了一个“ProtocolViolationException”异常,错误为“无法发送带有此动词的内容正文”,这清楚地再次强调了带有正文的 GET 不是支持用例。
2021-03-28 01:48:12
我什至不知道为什么人们坚持认为 GET 是没有身体数据的东西。是的,当然,当您尝试使用带有正文的 POST 方法(例如用于过滤)获取(我的意思是从逻辑上获取)信息时,这更有意义,因为有人在互联网上说您不应该在 GET 中传递正文数据方法。如果您需要获取信息并传递其他数据(例如搜索查询) - 继续并传递它。
2021-04-01 01:48:12
虽然我很感激您的意见,但两项建议都涉及更改我所说的不可能的服务。
2021-04-04 01:48:12
Elasticsearch 广泛使用 GET 与 body
2021-04-05 01:48:12
@EndangeredMassa,“如果您正在传递数据,那可能意味着您正在修改某些模型或在服务器上执行某些操作。这些类型的操作通常是通过 POST 请求完成的。” 在一般情况下不是真的。该请求也可能属于搜索查询,其中没有修改模型并且服务器正在使用请求中提供的参数执行查找。这些查询请求通常是普通的 GET 请求,例如在google.com/search?q=REST,HTTP,GET,query 中
2021-04-06 01:48:12

众所周知,按照http标准发送数据,一般使用POST请求。但是,如果您真的想在您的场景中使用 Get 发送数据,我建议您使用查询字符串或查询参数。

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

这里 some_id 是要发送的修正参数,可以在服务器端使用和req.params.some_id

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

这里的 durationExact ,isFavourite 是可选的发送字符串,可以在服务器端使用req.query.durationExactreq.query.isFavourite

3. GET 发送数组 {{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
            }
        }

以防万一有人还在提出这个问题:

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

例如,如果您想使用 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 } ... } }

我懂了。但是查询和正文可以同时使用得到相同的结果。我认为他很容易将 request.query 作为替代方案。
2021-03-20 01:48:12
OP 要求的是request.body,而不是request.query. 您提到POST但您仍在request.get()代码示例中使用。
2021-03-28 01:48:12
用户可以在浏览器的地址栏中看到 request.query。有时我们想对用户隐藏我们传输的数据。所以,我们还是更喜欢 POST 请求
2021-04-10 01:48:12