Codeigniter REST API有多对多的关系?

时间:2013-06-05 16:28:29

标签: php codeigniter rest model

我正在使用Codeigniter和Phil Sturgeon的REST API库开发REST API。

https://github.com/philsturgeon/codeigniter-restserver

我已经使REST API正常工作,但现在我想知道关系的建模/ REST。例如,我在联系人和收藏集之间有多对多的关系。

格式(不包括?format = json)

GET
/rest_api/contact/{id}
GET
/rest_api/collection/{id}

关系(m-m)是否应被视为REST资源,例如?

GET (One)
/rest_api/contact_collection/{id}
GET (Collection/All)
/rest_api/contacts_collections/{contact_id}/{collection_id}
PUT (Save)
/rest_api/contact_collection/{contact_id}/{collection_id}
DELETE
/rest_api/contact_collection/{contact_id}/{collection_id}

请注意,使用Phil的CodeIngiter REST API,我认为我不能将它拆分为:

PUT
/rest_api/contact/{contact_id}/collection/{collection_id}

我也在询问ID应该出现在何处/如何出现。这两个ID应该是所请求的URL的一部分还是属于PUT / POST数据的一部分?

3 个答案:

答案 0 :(得分:1)

我建议将其建模为collections的{​​{1}}属性,contact ID。即。

POST

GET /collections/{id}

GET /contacts/{id}/collections

或更好,而不是POST /contacts/{id}/collections ,使用POSTLINKhttp://tools.ietf.org/html/draft-snell-link-method-01):

UNLINK

LINK /contacts/{id} Link: </collections/{id}>;rel="collection" 是IANA定义的关系:http://www.iana.org/assignments/link-relations

答案 1 :(得分:0)

尼古拉斯,我赞成你的回答。这就是我到目前为止所做的事情。如果您认为我走的是正确的道路,请告诉我。

# URI's Explained for base "rest_api" (controller)

# collections resource
/collections/{id}

# contacts resource
/contacts/{id}

# collections contacts subresource
/collections/{collection_id}/contacts/{id}
Routed to 
==> /contacts/id/{id}/collection_id/{collection_id} 

在Restful-terms中,它不仅没有考虑SQL和连接,而是更多地涉及集合,子集合和遍历。

一些例子:

# getting contact 3 who is in collection 1
# or simply checking whether contact 3 is in that collection (200 vs. 404)
GET /collections/1/contacts/3   ==>   /contacts/id/3/collection_id/1

# getting contact 3 who is also in collection 3
GET /collections/3/contacts/3   ==>   /contacts/id/3/collection_id/3

# adding contact 3 also to collection 2 (RELATIONSHIP)
PUT /collections/2/contacts/3   ==>   /contacts/id/3/collection_id/2

# getting all collections of contact 3
GET /contacts/3/collections

# remove contact 3 from collection 1 (RELATIONSHIP)
DELETE /collections/1/contacts/3

# collection has a new contact, who is not yet added
POST /contacts
# from payload you get back the contacts insert id (44), now place contact in collection 1 (RELATIONSHIP)
PUT /collections/1/contacts/44

如你所见,我没有使用POST将联系人放到集合中,而是使用PUT来处理联系人与集合的n:n关系。

使用的PHP CodeIgniter路由如下。我真的不确定这是否需要,但允许上面提到的漂亮的URI。

// Collections
$route['rest_api/collections/(:num)'] = "rest_api/collections/id/$1";

// Collection Contacts Subresource
$route['rest_api/collections/(:num)/contacts'] = "rest_api/contacts/collection_id/$1";
$route['rest_api/collections/(:num)/contacts/(:num)'] = "rest_api/contacts/id/$2/collection_id/$1";

某些rest_api控制器方法有点长,但似乎有效。我必须得到URI请求参数和查询字符串parmas(如果使用的话)。 Phil的CodeIgniter REST API必须稍微调整一下,以确保在执行PUT或DELETE请求时获取URI参数,因为这些值仅存在于$ this-&gt; get()方法中;奇怪。

答案 2 :(得分:0)

谢谢,

笨-RestServer

♦♦♦更改日志

♦下载2.5版:https://github.com/chriskacerguis/codeigniter-restserver/tree/v2.5

  • 如果可能,将使用基本节点的单数版本,而不仅仅是看项目,项目,项目。示例
  • 重新考虑使用格式库,该库很快将与CodeIgniter合并。
  • 固定限制错误(限制为5将允许6个请求)。
  • 添加了无效API密钥请求的日志记录。
  • 将序列化更改为序列化。
  • 更改了所有公开程度&#39; private&#39;到&#39;受保护&#39;。
  • 现在可以使用带有字符编码的MIME。
  • 修正了PUT参数。再一次只是发送一个正文查询字符串工作。实施例
  • 修复了所有未提供参数的.foo扩展名,并将.html文件移动到格式库。
  • 更新了key.php示例以使用config_item(&#39; rest_keys_table&#39;)而不是硬编码的密钥&#39;表名。
  • 更新了REST_Controller以使用config_item(&#39; rest_limits_table&#39;)而非硬编码限制&#39;。