繁体   English   中英

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

[英]How to send data in request body with a GET when using jQuery $.ajax()

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

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

我正在使用以下 jQuery 代码但是观察提琴手中的请求/响应我可以看到我发送的“数据”总是被转换并附加到查询字符串,尽管我将“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
});

任何人都知道我如何强制在请求正文中发送“数据”值?

通常,这不是系统使用 GET 请求的方式。 所以,很难让你的图书馆一起玩。 事实上,规范说“如果请求方法是区分大小写的 GET 或 HEAD 匹配,就好像数据是 null。” 所以,我认为你运气不好,除非你使用的浏览器不遵守规范的那一部分。

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

如果您不完全依赖于以正文作为数据的 GET 请求,您有两种选择。

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

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

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

众所周知,按照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 发送 arrays {{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
            }
        }

你知道,我有一个不太标准的方法来解决这个问题。 我通常使用 nextjs。 如果可能的话,我喜欢让事情变得平静。 如果我需要发出 get 请求,我会改用 post 并在正文中添加一个 GET 子方法参数。 此时我的服务器端处理它。 我知道它在技术上仍然是一个 post 方法,但这使得意图很明确,我不需要添加任何查询参数。 然后 get 方法使用 post 方法中提供的数据处理 get 请求。 希望这会有所帮助。 这有点绕过正确的协议,但它确实意味着没有疯狂的变通办法,服务器端的代码可以毫无问题地处理它。 服务器端出现的第一件事是 if(subMethod === "GET"){|DO WHATEVER YOU NEED|}

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

任何请求中都有一个body query object。 您不需要自己解析它。

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

服务器请求 object 然后看起来像{request: {... query: { accessToken: abcfed }... } }

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

正文中所需的数据是用连字符分隔的ID列表,并且可能非常大,因此必须在正文中发送,否则可能会在浏览器/代理/网络服务器等链中的某处出现foobar。 注意:我无法控制服务或API,因此请不要提出更改建议。

我正在使用以下jQuery代码,但是在提琴手中观察请求/响应,尽管我将“ 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
});

有谁知道我可以如何强制在请求正文中发送“数据”值? 感谢您的任何帮助,在此先感谢您。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM