API:我们应使用带有数组参数的动词

问题描述 投票:0回答:1

例如,我们需要一个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分层设计的一部分,这将变得清晰再次对规范进行分区(正在进行中)。

....罗伊

但是,从另一面:

更新RFC2616被称为“ HTTP / 1.1规范”,现在已过时。在2014年被RFC 7230-7237取代。引用“消息正文在处理请求时将被忽略”已被删除。“请求消息框架与方法语义无关,即使该方法未定义消息正文的任何​​用法”第二引号“ GET方法意味着检索任何已识别的信息...由“ Request-URI”删除。-来自评论

rest api http-get
1个回答
0
投票

RFC 7231并没有改变语义

GET请求消息中的有效负载没有定义的语义;在GET请求上发送有效内容正文可能会导致某些现有实现拒绝该请求。

效果不好-并非如此。问题在于HTTP的缓存语义不考虑请求主体;通用组件将假定服务器遵守标准化的语义,因此不会在请求的消息正文中进行挖掘,以查看请求数组是否与任何先前缓存的表示形式匹配。

这又意味着,为了防止兼容组件出现问题,您将不得不禁用资源缓存。

由于缓存是REST architectural style中的重要约束,所以显然这是朝错误方向迈出的一步。

如果必须使用有效负载,则可能应该查看POST,而不是GET。另请参见:SOAP,GraphQL。

© www.soinside.com 2019 - 2024. All rights reserved.