Restful API:readonly / writeonly字段

时间:2017-05-23 19:31:06

标签: rest

我有一个关于restful apis的概念性问题。在我的数据模型中,我有国家和公司。

api的用户无法创建国家/地区对象。数据库中有各国的常数条目。他们将创建公司对象,将国家作为一个领域。因此,在创建公司时,api期望json像:

{
    'name': 'company name',
    'country': 5, // country id
    ...
}

在客户端,在显示公司时,我们还想显示其国家/地区。一种方法是,在获得公司资源后,我们发出另一个get请求来获取country对象。但这种方法在性能方面存在问题,特别是在我们列出多家公司的网页上。

另一种方法是在get请求的另一个字段中包含国家/地区详细信息,例如:

{
    'name': 'company name',
    'country': 5, // country id
    'country_details': {
        'name': 'USA',
        'phone_code': 1,
        'id': 5
    }
    ...
}

我认为这也不是正确的方法,因为对于同一资源的post和get请求,数据表示是不同的。对此案有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  

...因为对同一资源的post和get请求的数据表示不同。

来自RFC 7231

POST

  

POST方法请求目标资源处理      请求中附带的陈述......

PUT

  

PUT方法请求目标资源的状态      用表示定义的状态创建或替换      包含在请求消息有效负载中。一个成功的PUT      表示会建议随后对此进行GET      目标资源将导致等效表示      发送了200(OK)回复。

  

POST和PUT方法的根本区别在于      通过封闭表示的不同意图突出显示。      POST请求中的目标资源旨在处理      根据资源自身的语义封闭表示,      而PUT请求中的封闭表示定义为      替换目标资源的状态。

所以POSTGET机构不同不是问题,但它适用于PUTGET。如果不使用POSTGET的相同网址,我会更清楚地区分。这是有道理的,因为GET将包含公司标识符,而POST则不会。

例如,将公司发布到国家/地区网址可能是有意义的,这样我们就不需要在正文中包含国家/地区ID:

POST: /usa/company

BODY: { 'name': 'company name' }

RESPONSE: 200 with Content-Location header: /companies/1

然后GET的后续Content-Location

GET: /companies/1

RESPONSE: { 'name': 'company name', 'country': 'USA' }