首页 文章

仅允许在REST API中使用GET

提问于
浏览
3

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

我正在考虑只有一个GET选项的资源,因为不允许INSERT / UPDATE / DELETE . 是否有意义? .

通常,提供对数据的只读访问的最佳方法是什么?将选择与国家或城市或任何需要的数据绑定 .

Edited:

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

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

4 回答

  • 1

    根据我的理解,你想要做的是:

    请求:

    获取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来节省资源,编辑数据或执行类似的操作 .

  • 0

    inf3rno的评论,即使它的简短也是正确答案:
    您不必在实体上允许每个HTTP方法a.k.a动词(see list of the standard oneslonger list here) . 我会更进一步:我认为我从来没有看到任何实体上允许所有HTTP方法的任何现实生活API,因此排除它们不是问题 .

    甚至还有一个名为 OPTIONS 的HTTP方法(请参阅http method overviewlonger explanation),因此客户端可以检查实体上允许/可能的方法 .
    Sitenote:您的框架很可能会为您自己构建此方法 .

    因此,只允许实体上的 GET 是完全正常的标准程序 . "Famous"例子是例如PayPal refundsFacebook friendlists如果您只是搜索随机REST API,还有更多 .


    你的问题只有一部分,我担心:

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

    我希望这只是附加信息而与计划的 GET 请求无关,因为 GET 永远不应该"do any action"(例如"saving","selecting"作为HTTP specs状态:

    [...] GET和HEAD方法不应具有采取除检索之外的动作的重要性 .

  • 0

    REST并没有说你需要定义所有的crud操作 . 如果您只想提供对特定资源的只读访问权限,那么它绝不会违反REST原则 . 重要的是你的GET应该是幂等的,如果不是这样,并且GET请求以某种方式改变资源的状态,那么你肯定不会违反REST . 在这种情况下,您需要使用POST请求 .

    还需要确保该资源的其他请求(POST,PUT,DELETE等)应该引发405(不允许方法)状态代码 .

    此外,您有可能想要使用缓存来进行国家/地区信息GET请求(HTTP和内部缓存),因此在我看来您的设计是准确的 .

  • 0

    如果您使用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})

相关问题