0

我正在使用 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}

关系 (mm) 是否应该被视为 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 数据的一部分?

4

3 回答 3

1

我建议将其建模为您ID的collections属性。IEcontactPOST

GET /collections/{id}

 

GET /contacts/{id}/collections

 

POST /contacts/{id}/collections

POST或者更好的是,使用LINKand UNLINK( https://datatracker.ietf.org/doc/html/draft-snell-link-method-01 )代替:

LINK /contacts/{id}
Link: </collections/{id}>;rel="collection"

collection是 IANA 定义的关系:http ://www.iana.org/assignments/link-relations )

于 2013-06-05T18:34:46.283 回答
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 请求参数和查询字符串参数。Phil 的 CodeIgniter REST API 必须稍微调整一下,以确保在执行 PUT 或 DELETE 请求时获取 URI 参数,因为这些值仅存在于 $this->get() 方法中;奇怪的。

于 2013-06-10T04:16:21.493 回答
0

谢谢,

CodeIgniter-RestServer

♦♦♦更改日志

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

  • 如果可能,将使用基节点的单数版本,而不是仅仅查看项目、项目、项目。例子。
  • 重构为使用格式库,该库很快将与 CodeIgniter 合并。
  • 修复了限制错误(限制为 5 将允许 6 个请求)。
  • 添加了无效 API 密钥请求的日志记录。
  • 将序列化更改为序列化。
  • 将所有可见性“私人”更改为“受保护”。
  • 最后带有字符编码的 MIME 现在可以工作了。
  • 修复了 PUT 参数。再次发送一个正文查询字符串就可以了。例子
  • 修复了所有 .foo 扩展在没有提供 get 参数时可以工作,并将 .html 移动到 Format 库。
  • 更新了 key.php 示例以使用 config_item('rest_keys_table') 而不是硬编码的 'keys' 表名。
  • 更新 REST_Controller 以使用 config_item('rest_limits_table') 而不是硬编码的 'limits'。
于 2015-08-26T07:51:26.623 回答