1

问题

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

细节

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

我的网站:

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

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

场景一:

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

资源

http://site.com/api/players

问题:

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

  1. 你怎么处理这个?
  2. 我需要两个单独的资源吗?
4

3 回答 3

2

假设您有一个控制器名称“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/333http://site.com/api/players/game/333

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

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

然后你得到 id 使用: $this->get('id');

于 2012-07-26T14:55:52.400 回答
0

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

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

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

这是菲尔在 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]
于 2012-07-26T15:04:55.917 回答
0

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

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

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

于 2012-07-26T14:30:27.847 回答