我有一个关于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请求,数据表示是不同的。对此案有什么建议吗?
答案 0 :(得分:1)
来自RFC 7231的...因为对同一资源的post和get请求的数据表示不同。
POST
:
POST方法请求目标资源处理 请求中附带的陈述......
而PUT
:
PUT方法请求目标资源的状态 用表示定义的状态创建或替换 包含在请求消息有效负载中。一个成功的PUT 表示会建议随后对此进行GET 目标资源将导致等效表示 发送了200(OK)回复。
和
POST和PUT方法的根本区别在于 通过封闭表示的不同意图突出显示。 POST请求中的目标资源旨在处理 根据资源自身的语义封闭表示, 而PUT请求中的封闭表示定义为 替换目标资源的状态。
所以POST
和GET
机构不同不是问题,但它适用于PUT
和GET
。如果不使用POST
和GET
的相同网址,我会更清楚地区分。这是有道理的,因为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' }