我正在开发一个REST API . 我需要一种方法来获取所有国家/地区,以允许用户选择多个并保存应用程序配置 .
我正在考虑只有一个GET选项的资源,因为不允许INSERT / UPDATE / DELETE . 是否有意义? .
通常,提供对数据的只读访问的最佳方法是什么?将选择与国家或城市或任何需要的数据绑定 .
Edited:
它与任何特定框架无关 . API确实允许CRUD操作,在某些情况下我需要提供只读访问权限,例如以允许用户选择国家/地区的形式 . 该表单是CRUD操作的一部分,但我需要各国绑定选择输入以便用户可以选择它们,因此获取所有国家/地区的方法是提供获取它们的URL(资源) .
如果这有帮助,除了API,我正在设计将使用它的应用程序的用户界面 . 因此,我需要一种方法来提取所有国家/地区,让用户选择它们并保存表单 . 保存表单是对具有国家/地区(属性)的资源的POST .
4 回答
根据我的理解,你想要做的是:
请求:
响应:
保持尽可能简单就行了(仅使用名称/ ID) . 您可以通过JavaScript应用程序获取整个列表,并让用户选择特定的国家/地区 .
之后,您可以POST到其他资源,例如:
通过此操作,您可以节省资源 . 这对我来说听起来完全没问题 . 请不要使用GET来节省资源,编辑数据或执行类似的操作 .
inf3rno的评论,即使它的简短也是正确答案:
您不必在实体上允许每个HTTP方法a.k.a动词(see list of the standard ones或longer list here) . 我会更进一步:我认为我从来没有看到任何实体上允许所有HTTP方法的任何现实生活API,因此排除它们不是问题 .
甚至还有一个名为
OPTIONS
的HTTP方法(请参阅http method overview或longer explanation),因此客户端可以检查实体上允许/可能的方法 .Sitenote:您的框架很可能会为您自己构建此方法 .
因此,只允许实体上的
GET
是完全正常的标准程序 . "Famous"例子是例如PayPal refunds或Facebook friendlists如果您只是搜索随机REST API,还有更多 .你的问题只有一部分,我担心:
我希望这只是附加信息而与计划的
GET
请求无关,因为GET
永远不应该"do any action"(例如"saving","selecting"作为HTTP specs状态:REST并没有说你需要定义所有的crud操作 . 如果您只想提供对特定资源的只读访问权限,那么它绝不会违反REST原则 . 重要的是你的GET应该是幂等的,如果不是这样,并且GET请求以某种方式改变资源的状态,那么你肯定不会违反REST . 在这种情况下,您需要使用POST请求 .
还需要确保该资源的其他请求(POST,PUT,DELETE等)应该引发405(不允许方法)状态代码 .
此外,您有可能想要使用缓存来进行国家/地区信息GET请求(HTTP和内部缓存),因此在我看来您的设计是准确的 .
如果您使用JAX-RS(RESTeasy,Jersey,...),则需要使用此注释: @GET
如果您使用Spring MVC,则需要使用此注释: method = RequestMethod.GET
Example:
@RequestMapping(value =“/ xxxxx / yyyyy / ”,method = RequestMethod.GET,produce = MediaType.APPLICATION_JSON_VALUE)
如果您需要由管理员使用UPDATE / DELETE / POST,您可以使用Spring Security
Example:
@RolesAllowed({AuthoritiesConstants.ADMIN,AuthoritiesConstants.USER})