我正在使用的服务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
});
任何人都知道如何强制在请求正文中发送“数据”值? 感谢任何帮助,提前谢谢。
答案 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 } ... } }