API:我们应在数组参数中使用哪个动词

时间:2019-09-30 16:59:10

标签: rest api http-get

例如,我们需要一个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删除”。-来自评论

1 个答案:

答案 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根本不是幂等的

是的。需要进行权衡。