【问题标题】:RESTful API - How do I return different results for the same resource?RESTful API - 如何为同一资源返回不同的结果?
【发布时间】:2012-07-26 14:11:41
【问题描述】:

问题

如何为同一资源返回不同的结果?

详情

我一直在寻找构建 RESTful API 的正确方法。那里有很多很棒的信息。现在我实际上正试图将它应用到我的网站上并且遇到了一些障碍。我发现了一些建议,将资源基于您的数据库作为起点,考虑到您的数据库应该结构合理。这是我的场景:

我的网站:

这里有一些关于我的网站和 API 用途的信息

我们正在创建一个允许人们玩游戏的网站。该 API 应该允许其他开发人员构建自己的游戏并使用我们的后端来收集和存储用户信息。

场景一:

我们有一个players 数据库来存储所有玩家数据。开发者需要根据 user_id(拥有玩家数据的人)或 game_id(收集数据的游戏)来选择这些数据。

资源

http://site.com/api/players

问题:

如果开发者使用GET 调用我的资源,他们将收到玩家列表。由于有多个开发者使用这个系统,他们必须指定一些 ID 来选择所有玩家。这是我发现问题的地方。我希望开发人员能够指定两种 ID。他们可以通过 user_id 或 game_id 选择所有玩家。

  1. 您如何处理这个问题?
  2. 我需要两个单独的资源吗?

【问题讨论】:

  • 你在使用 phil sturgeon 的 Rest 框架吗? “玩家”是你的控制器吗?
  • 不,我没有使用他的rest框架,但我会试一试。玩家可以是控制器。我还没有建造任何东西。 (好吧,我构建了第 1 版,但它很糟糕)所以现在我正在尝试以正确的方式重新设计它……尝试学习和遵循 RESTful 设计。

标签: api codeigniter rest


【解决方案1】:

假设您有一个控制器名称“Players”,那么您将有 2 个方法:

function user_get(){
   //get id from request and do something
}

function game_get(){
//get id from request and do something
}

现在网址看起来像:http://site.com/api/players/user/333, http://site.com/api/players/game/333

  1. 玩家是控制器。
  2. 用户/游戏是行动

如果你使用 phil sturgeon 的框架,你会这样做,但 url 看起来像: http://site.com/api/players/user/id/333,http://site.com/api/players/game/id/333

然后您使用以下方式获取 id:$this->get('id');

【讨论】:

    【解决方案2】:

    您可以通过指定查询字符串参数来限制结果,即:

    http://site.com/api/players?id=123

    http://site.com/api/players?name=Paolo

    【讨论】:

    • 我的印象是这是糟糕的 REST API 设计。从我一直在阅读的所有内容来看,它建议 http://site.com/api/players/333 其中 333 是您要检索的播放器的 ID。我在这里错过了什么吗?
    • 是的,你是对的!这是糟糕的 REST 设计。我只是给你一个可以让它工作的答案。长答案是您可以执行以下操作:site.com/api/players/id/123 或 http://site.com/api/players/name/paolo。您的后端应该能够分别提取 123 和 paolo。
    【解决方案3】:

    使用 phil 的 REST 服务器库: https://github.com/philsturgeon/codeigniter-restserver

    我在使用 oauth 和 api 密钥生成的产品环境中使用这个库。您将创建一个 api 控制器,并为您想要的每个请求定义方法。就我而言,我创建了一个完全独立的 codeigniter 实例,并根据需要编写模型。

    你也可以使用这个 REST 库来插入数据,这一切都在他的文档中..

    这是 Phil 在 2011 年整理的有关基础知识的视频。 http://philsturgeon.co.uk/blog/2011/03/video-set-up-a-rest-api-with-codeigniter

    应该注意的是,RESTful URL 意味着使用复数/单数措辞,例如;玩家 = 单数,玩家 = 全部或多个,游戏|游戏等。


    这将允许您在控制器中执行此类操作

    //users method_get is the http req type.. you could use post, or put as well.
    public function players_get(){
      //query db for players, pass back data
    }
    

    您的 API 请求 URL 类似于:

    http://api.example.com/players/format/[csv|json|xml|html|php]
    

    这将根据您在模型中的查询返回所有用户的 json 对象。

    或

    public function player_get($id = false, $game = false){
      //if $game_id isset, search by game_id
      //query db for a specific player, pass back data
    }
    

    您的 API 请求 URL 类似于:

    http://api.example.com/player/game/1/format/[csv|json|xml|html|php]
    

    或

    public function playerGames_get($id){
      //query db for a specific players games based on $userid
    }
    

    您的 API 请求 URL 类似于:

    http://api.example.com/playerGames/1/format/[csv|json|xml|html|php]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 2014-02-07
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多