对于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¶m2=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
方法,并且您可以拥有一个与您的应用程序实现分离的中间件,并且相应地重写方法。如果你是纯粹主义者,这是最好的选择。
我不想在 URI 中看到这么长的参数字符串。那么,GET方法可以使用json数据吗?
在我的情况下,我需要过滤给定类型参数的结果。如果参数很多,长度可能会超过URI的限制。那么,这个问题有最佳实践吗?
为了回答您的问题,是的,您可以在 URI 中传递 JSON 作为 GET 请求的一部分(前提是您 URL-encode)。但是,考虑到您这样做的原因是由于 URI 的长度,使用 JSON 将弄巧成拙(引入比要求更多的字符)。
我建议您在 POST 请求的正文中发送参数,以常规 CGI 样式 (param1=val1¶m2=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
方法,并且您可以拥有一个与您的应用程序实现分离的中间件,并且相应地重写方法。如果你是纯粹主义者,这是最好的选择。