仅允许在REST API中使用GET

时间:2015-06-11 18:45:42

标签: rest

我正在开发REST API。我需要一种方法来获取所有国家/地区,以允许用户选择多个并保存应用程序配置。

我只考虑GET选项在资源中思考,因为不允许INSERT / UPDATE / DELETE。它有意义吗?。

一般来说,提供对数据的只读访问权限的最佳方式是什么?将选择与国家或城市或任何需要的数据绑定。

编辑:

它与任何特定框架无关。 API确实允许CRUD操作,在某些情况下我需要提供只读访问权限,例如以允许用户选择国家/地区的形式。该表单是CRUD操作的一部分,但我需要各国绑定选择输入以便用户可以选择它们,因此获取所有国家/地区的方法是提供一个URL(资源)来获取它们。

如果这有帮助,除了API之外,我还要设计将使用它的应用程序的用户界面。因此,我需要一种方法来提取所有国家/地区,让用户选择它们并保存表单。保存表单是对具有国家/地区(属性)的资源的POST。

4 个答案:

答案 0 :(得分:1)

inf3rno的评论,即使它的简短也是正确答案:
您不必在实体上允许每个HTTP方法a.k.a动词(see list of the standard oneslonger 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 overviewlonger explanation),因此客户端可以检查实体上允许/可能的方法。
Sitenote:您的框架很可能会为您自己构建此方法。

因此,仅在实体上允许OPTIONS是完全正常的标准程序。 "著名"例子是例如PayPal refundsFacebook 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来节省资源,编辑数据或做类似的事情。