对于RestfulAPI,GET方法可以使用json数据吗?

For Restful API, can GET method use json data?

我不想在 URI 中看到这么长的参数字符串。那么,GET方法可以使用json数据吗?

在我的情况下,我需要过滤给定类型参数的结果。如果参数很多,长度可能会超过URI的限制。那么,这个问题有最佳实践吗?

为了回答您的问题,是的,您可以在 URI 中传递 JSON 作为 GET 请求的一部分(前提是您 URL-encode)。但是,考虑到您这样做的原因是由于 URI 的长度,使用 JSON 将弄巧成拙(引入比要求更多的字符)。

我建议您在 POST 请求的正文中发送参数,以常规 CGI 样式 (param1=val1&param2=val2) 或 JSON(由您的 API 解析收据)

理论上,没有什么可以阻止您在 GET 请求中发送请求正文。 HTTP 协议允许这样做,但没有定义语义,因此您需要记录当客户端发送 GET 负载时究竟会发生什么。例如,您必须定义 JSON 正文中的参数是否等同于查询字符串参数或其他完全相同的参数。

但是,由于没有明确定义的语义,您无法保证您的应用程序和客户端之间的实现会遵守它。服务器或代理可能会拒绝整个请求,或忽略主体,或其他任何内容。处理损坏实现的 REST 方法是以一种与您的应用程序分离的方式来规避它,所以我想说您有两个可以被认为是最佳实践的选项。

简单的选择是使用 POST 而不是其他答案推荐的 GET。由于 POST 未通过 HTTP 标准化,因此您必须记录其工作原理。

我更喜欢的另一种选择是在假设 GET 有效载荷从未被篡改的情况下实施您的应用程序。然后,如果某些实现出现问题,您允许客户端使用 X-HTTP-Method-Override 覆盖 HTTP 方法,这是客户端使用 POST 模拟 HTTP 方法的流行约定。因此,如果客户端有一个损坏的实现,它可以将 GET 请求写成 POST,发送 X-HTTP-Method-Override: GET 方法,并且您可以拥有一个与您的应用程序实现分离的中间件,并且相应地重写方法。如果你是纯粹主义者,这是最好的选择。