3 回答
TA贡献1772条经验 获得超5个赞
如果您在GET请求中使用请求正文,那么您将违反REST原则,因为您的GET请求将无法缓存,因为缓存系统仅使用URL。
更糟糕的是,您的URL无法加入书签,因为该URL不包含将用户重定向到此页面所需的所有信息
使用URL或Query参数代替请求正文参数。
例如:
/myapp?var1=xxxx&var2=xxxx/myapp;var1=xxxx/resource;var2=xxxx
事实上,HTTP RFC 7231说:
GET请求消息中的有效负载没有定义的语义; 在GET请求上发送有效负载主体可能会导致某些现有实现拒绝该请求。
TA贡献1827条经验 获得超8个赞
似乎资源过滤/搜索可以以RESTful方式实现。我们的想法是引入一个名为/filters/
或的新端点/api/filters/
。
使用此端点过滤器可以视为资源,因此通过POST
方法创建。这种方式 - 当然 - 身体可用于携带所有参数以及可以创建复杂的搜索/过滤器结构。
创建此类过滤器后,有两种方法可以获得搜索/过滤结果。
将返回具有唯一ID的新资源以及
201 Created
状态代码。然后使用此IDGET
可以使请求/api/users/
如下:GET /api/users/?filterId=1234-abcd
新的过滤器通过创建后
POST
它将不会与回复201 Created
,但在一次与303 SeeOther
一起Location
头指向/api/users/?filterId=1234-abcd
。此重定向将通过底层库自动处理。
在这两种情况下,需要进行两次请求以获取过滤结果 - 这可能被视为一个缺点,尤其是对于移动应用程序。对于移动应用程序,我会使用单个POST
调用/api/users/filter/
。
如何保持创建的过滤器?
它们可以存储在DB中,以后再使用。它们也可以存储在一些临时存储器中,例如redis,并且有一些TTL,之后它们将过期并将被删除。
这个想法有什么好处?
过滤器,过滤结果可以缓存,甚至可以加入书签。
- 3 回答
- 0 关注
- 1587 浏览
添加回答
举报