基于查询参数计算字段时,选GET还是POST?是否仍具幂等性?
GET请求幂等性判断与请求方法选择问题
问题背景
我有一个资源接口 GET /api/v1/serviced-objects/:
- 不带查询参数时,返回结果中每个元素的
distance字段值为null,响应示例:
{ "count": 2, "next": null, "previous": null, "results": [ { "id": 1, "point": "0,30", "distance": null }, { "id": 2, "point": "30,0", "distance": null } ] }
- 携带
user_point查询参数(如请求地址/api/v1/serviced-objects/?user_point=0,0)时,会计算并返回该点与服务对象点之间的距离(单位:米),响应示例:
{ "count": 2, "next": null, "previous": null, "results": [ { "id": 1, "point": "0,30", "distance": 2000 }, { "id": 2, "point": "30,0", "distance": 1000 } ] }
请问该GET请求是否仍具幂等性?还是改用POST请求更为合适?
回答
1. 该GET请求完全具备幂等性
HTTP定义的幂等性核心是:多次执行完全相同的请求,不会对服务器上的资源状态造成任何改变,且在资源未被外部修改的前提下,每次返回的结果一致。
你这个场景里,不管是否携带user_point参数,GET请求都只是读取现有资源并做纯计算性的返回——服务器上的serviced-objects资源本身没有被修改。只要服务对象的point数据没变化,重复发送同一个带user_point的请求,返回的distance结果也会完全一致。所以完全符合幂等性的要求。
2. 不需要改用POST请求
POST请求的典型适用场景是创建、修改服务器资源,或者当请求参数不适合放在URL中(比如参数体积过大、包含敏感内容)时才考虑使用。
你的场景中,user_point是用于增强查询结果的计算条件,属于资源查询的个性化参数,用GET的查询参数传递完全符合RESTful设计规范——GET就是用来获取资源,附带参数做实时计算返回是合理的设计,没必要换成POST。
内容的提问来源于stack exchange,提问作者hungry7
相关产品推荐
相关产品推荐

