例如,我们需要一个API方法,该方法获取数组作为输入(设备ID的数组)并返回这些设备的列表(有关每个设备的完整信息)。
因此,有GET方法的所有属性,但是将其传递给url(数组可能很大)是个坏主意,因此,最好将其传递给正文:
[HttpGet("api/deviceNames")]
[ProducesResponseType(typeof(List<DeviceInfo>), StatusCodes.Status200OK)]
public IActionResult GetDeviceNamesByIds([FromBody]List<string> deviceIds)
{
var d = _deviceService.GetDevicesByIds(deviceIds);
return Ok(d);
}
它正常工作。但是许多作者不建议将body用于GET方法,例如https://groups.yahoo.com/neo/groups/rest-discuss/conversations/messages/9962?guccounter=1
是的。换句话说,任何HTTP请求消息均允许包含 消息正文,因此必须在考虑消息时解析消息。服务器 但是,GET的语义受到限制,以使主体(如果有) 对请求没有语义上的含义。解析要求 与方法语义要求分开。
所以,是的,您可以使用GET发送正文,否则,它对于 这样做。
这是HTTP / 1.1分层设计的一部分,这将变得清晰 再次对规范进行分区(正在进行中)。
....罗伊
但是,从另一面来看:
更新现在已淘汰了被称为“ HTTP / 1.1规范”的RFC2616。在 2014年被RFC 7230-7237取代。引用“消息正文 在处理请求时将被忽略”已被删除。 “请求消息框架与方法语义无关,即使 该方法未定义消息正文的任何用法”第二引号 “ GET方法意味着检索任何已识别的信息... 由Request-URI删除”。-来自评论
答案 0 :(得分:1)
RFC 7231并没有改变语义
GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。
它不能正常工作-并非如此。问题在于HTTP的缓存语义不考虑请求主体;通用组件将假定服务器遵守标准化的语义,因此不会在请求的消息正文中进行挖掘,以查看请求数组是否与任何先前缓存的表示形式匹配。
这反过来意味着,为了防止兼容组件出现问题,您将不得不禁用资源缓存。
由于缓存是REST architectural style中的重要约束,因此显然这是朝错误方向迈出的一步。
如果必须使用有效负载,则可能应该查看[HttpGet]
public FileResult GlobalOverview()
{
HttpWebResponse response = null;
byte[] actualBytes = null;
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
using (var httpClient = new HttpClient(clientHandler))
{
string getlisturl = "https://localhost:4478/api/Upload/GetFile?id=1";
var httpResponse = httpClient.GetAsync(getlisturl).Result;
var result = httpResponse.Content.ReadAsStringAsync().Result;
actualBytes = Convert.FromBase64String(result);
}
return File(actualBytes, "application/octet-stream", "filedd.pdf");
}
,而不是POST
。另请参阅:SOAP,GraphQL。
但是POST根本不是幂等的
是的。需要进行权衡。