关于REST的几个问题

时间:2012-07-11 12:27:21

标签: web-services http rest

1)如何处理关系?

假设我有一个文章资源,由作者撰写。

基本上我会有类似的东西:

{
    "article": {
        "id": 1,
        "title": "Foo bar",
        "body": "Lorem ipsum dolor sid amet",
        "published_on": "2011-05-06 21:54:23",
        "author": {
            "id": 25,
            "username": "johndoe"
        }
    }
}

我将在api/articles/1

访问我的资源

我的问题是,表示这些数据的最佳方式是什么?

我应该这样做:

{
    "article": {
        "id": 1,
        "title": "Foo bar",
        "body": "Lorem ipsum dolor sid amet",
        "published_on": "2011-05-06 21:54:23",
    }
}

通过致电api/articles/1/author

访问作者

仅包含作者ID(子对象标识符)

{
    "article": {
        "id": 1,
        "title": "Foo bar",
        "body": "Lorem ipsum dolor sid amet",
        "published_on": "2011-05-06 21:54:23",
        "author": {
            "id": 25,
        }
    }
}

或者包括如上所示的完整关系?


2)PUT或POST创建新对象?

在SO和其他地方看,我注意到它们都用于创建和/或更新对象。

据我了解,两者都是有效的行动,但这取决于具体情况。如果我创建与先前创建的对象相关的子对象,我将使用POST

例如:我为文章创建了一个投票,因为文章已经存在,我将POST一个新的投票,但是,如果我创建一个新文章,我PUT

我是对的吗?


3)我们应该如何设置日期格式?

我已经看到SO使用Unix时间戳,其中ISO8601主要用于其他地方。

对此有任何“标准”或建议吗?

1 个答案:

答案 0 :(得分:2)

  

1)如何处理关系?

你的第一种方法不是很好,因为它不允许发现作者 - 可能是你想知道的。

第二种方法是有效的,但要求您提前知道延迟提取作者的URI模式,例如: api/author/25

只要您没有一对多关系(文档的大小呈指数级增长)或非常大的嵌套对象,第三种方法就可以了。

由几个人提倡的四种方法是使用超链接而不是抽象标识符或完整文档来使用原则。

  

2)PUT或POST创建新对象?

这里没有混淆。 POST总是用于创建新对象,而PUT应该更新现有对象(如果不存在,则可能创建一个。底线:每次调用POST时,都会更改系统状态(资源)。但是你可以调用PUT多次(幂等 - 当您想要安全地重试时很好。)

请注意,POST链接通常不包含ID(例如POST api/articles),而PUT DO:PUT api/articles/42。如果您知道ID,则该实体可能已存在。

  

3)我们应该如何格式化日期?

UNIX时间戳和都可以。我不确定JSON schema recommendations是否有任何标准appart:

  

<强> 5.23。格式

     

[...]

     

date-time这应该是ISO 8601格式的YYYY-MM-DDThh:mm:ssZ(UTC时间)的日期。这是推荐的日期形式/         时间戳。