我正在开发REST API。我需要一种方法来获取所有国家/地区,以允许用户选择多个并保存应用程序配置。
我只考虑GET选项在资源中思考,因为不允许INSERT / UPDATE / DELETE。它有意义吗?。
一般来说,提供对数据的只读访问权限的最佳方式是什么?将选择与国家或城市或任何需要的数据绑定。
编辑:
它与任何特定框架无关。 API确实允许CRUD操作,在某些情况下我需要提供只读访问权限,例如以允许用户选择国家/地区的形式。该表单是CRUD操作的一部分,但我需要各国绑定选择输入以便用户可以选择它们,因此获取所有国家/地区的方法是提供一个URL(资源)来获取它们。
如果这有帮助,除了API之外,我还要设计将使用它的应用程序的用户界面。因此,我需要一种方法来提取所有国家/地区,让用户选择它们并保存表单。保存表单是对具有国家/地区(属性)的资源的POST。
答案 0 :(得分:1)
inf3rno的评论,即使它的简短也是正确答案:
您不必在实体上允许每个HTTP方法a.k.a动词(see list of the standard ones或longer list here)。我会更进一步:我认为我从来没有看到任何实体上允许所有HTTP方法的任何现实生活API,因此排除它们不是问题。
甚至还有一个名为New-Object : Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-000000000000} failed due to the following error: 80040154 Class not
registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
unable to create makecab.makecab object
At D:\SCCM Script\Cabmaker.ps1:11 char:14
的HTTP方法(请参阅http method overview或longer explanation),因此客户端可以检查实体上允许/可能的方法。
Sitenote:您的框架很可能会为您自己构建此方法。
因此,仅在实体上允许OPTIONS
是完全正常的标准程序。
"著名"例子是例如PayPal refunds或Facebook friendlists如果您只是搜索随机REST API,还有更多。
您的问题中只有一部分,我担心:
我正在开发REST API。我需要一种方法来获取所有国家/地区,允许用户选择多个并保存应用程序配置。
我希望这只是附加信息而与计划的GET
请求无关,因为GET
永远不应该做任何行动" (例如"保存","选择"作为HTTP specs州:
[...] GET和HEAD方法不应该采取除检索之外采取行动的重要性。
答案 1 :(得分:0)
如果你使用JAX-RS(RESTeasy,Jersey,...),你需要使用这个注释: @GET
如果您使用Spring MVC,则需要使用此注释: method = RequestMethod.GET
示例:强>
@RequestMapping(value =“/ xxxxx / yyyyy / {zzzzz}”,method = RequestMethod.GET,produce = MediaType.APPLICATION_JSON_VALUE)
如果您需要管理员使用UPDATE / DELETE / POST,您可以使用Spring Security
示例:强>
@RolesAllowed({AuthoritiesConstants.ADMIN,AuthoritiesConstants.USER})
答案 2 :(得分:0)
REST并未说明您需要定义所有crud操作。如果您只想提供对特定资源的只读访问权限,那么它绝不会违反REST原则。重要的是你的GET应该是幂等的,如果不是这样,并且GET请求以某种方式改变资源的状态,那么你肯定不会违反REST。在这种情况下,您需要使用POST请求。
还需要确保该资源的其他请求(POST,PUT,DELETE等)应该引发405(不允许方法)状态代码。
此外,您有可能想要使用缓存来进行国家/地区信息GET请求(HTTP和内部缓存),所以在我看来您的设计是准确的。
答案 3 :(得分:0)
根据我的理解,你想要做的是:
请求:
获取api.domain.com/countries
响应:
{
"US": {
"url": "api.domain.com/countries/us",
"name": "US",
"continent": "America",
"others": "..."
},
"UK": {
"url: "api.domain.com/countries/uk",
"...."
}
...
保持尽可能简单是可以的(仅使用名称/ ID)。您可以通过JavaScript应用程序获取整个列表,并让用户选择特定的国家/地区。
之后,您可以POST到其他资源,例如:
POST api.domain.com/user/1/countries
{
"user": "api.domain.com/user/1",
"countries": [
"api.domain.com/countries/us",
"api.domain.com/countries/it"
]
}
通过此操作,您可以保存资源。这对我来说听起来完全没问题。 请不要使用GET来节省资源,编辑数据或做类似的事情。