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

Oli*_*ain 53 javascript ajax jquery

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

正文中所需的数据是由hypen分隔的id列表,可能非常大,因此必须在正文中发送,否则它可能会在浏览器/代理/ web服务器等链中的某处发生.注意我无法控制服务或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
});
Run Code Online (Sandbox Code Playgroud)

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

End*_*ssa 50

通常,这不是系统如何使用GET请求.因此,很难让你的图书馆一起玩.实际上,规范说"如果请求方法是GET或HEAD区分大小写的匹配,就好像数据为空".所以,除非您使用的浏览器不遵守规范的这一部分,否则我认为您运气不佳.

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

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

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

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

url: 'somesite.com/models/thing?ids=1,2,3'
Run Code Online (Sandbox Code Playgroud)

  • Elasticsearch广泛使用GET与body (19认同)
  • 虽然我感谢您的意见,但两项建议都涉及更改我所说的不可能的服务. (5认同)
  • 感谢您添加一个将POST转换为带有正文的GET的代理的附加建议.我试图在.NET中实现它,但它抛出一个"ProtocolViolationException"异常,错误"无法发送带有此动词的内容体",这显然再次强调了一个带有正文的GET不是支持用例. (4认同)
  • 我什至不知道为什么人们坚持认为 GET 是没有身体数据的东西。是的,ofc,当您尝试使用带有正文的 POST 方法(例如用于过滤)来获取(我的意思是逻辑上获取)信息时,这更有意义,因为有人在互联网上说您不应该在 GET 中传递正文数据方法。如果您需要获取信息并传递附加数据(例如搜索查询) - 只需继续并传递它即可。 (2认同)
  • “可能意味着您正在修改某些模型或在服务器上执行某些操作。” ——有可能,但并非总是如此。我有一个批量的 GET 请求。如果我在查询中发送所有内容,那就太长了。我唯一的选择是更改服务器配置或假装这是 POST 请求的适当情况。叽。 (2认同)

小智 5

我们一般都知道,为了按照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
            }
        }
Run Code Online (Sandbox Code Playgroud)