就我而言,每个用户都有一个包含大量属性的个人资料,例如:性别,年龄,姓名。设计RESTful API以获取这些属性的最佳做法是什么?以下是可能的解决方案:
通过一次通话获取所有属性
获取所有属性:
请求:getPolygon()
回复:GET http://api.domain.com/users/id/profile
逐个获取属性
获取属性列表:
请求:{"name" : "Jim", "gender" : "male", "age" : 12}
回复:GET http://api.domain.com/users/id/profile
获取指定的属性:
请求:{ "attributes" : ["name", "gender", "age"] }
回复:GET http://api.domain.com/users/id/profile/name
使用第一个解决方案,客户端在一次调用中获取所有属性。但是,问题是属性太多,我们会在配置文件中添加更多属性。我想知道哪一个更好?
答案 0 :(得分:1)
肯定第一个选项看起来好多了,主要是因为保存了多个调用 - 请注意你的客户端,他们会更容易在一次调用中获取他们需要的内容而不是调用 - 或多或少 - 相同的资源多次。
您正在寻找什么称为资源扩展 - 您可以阅读它,例如here
简而言之,它假设您发送的响应可以使用查询参数进行配置。如果不包括参数,则返回一些基本的属性子集。如果发送要扩展的参数 - 将返回基本子集以及查询参数中列出的其他属性。您还可以混合使用两种方法。一些参数可能通过查询参数进行扩展,其他参数可能被称为子资源 - 它任意依赖于资源的 size 。
答案 1 :(得分:1)
如果你有很多很多属性,另一种方法就是将它们分组。 在REST中,一切都需要是一种资源(例如,但不限于URL可识别的东西)。 你可以拥有
GET http://api.domain.com/users/id/profile
你得到了
{ "categories" : ["names", "address", "interests", "jobhistory", "publications", "blogs", "skills"] }
然后你进一步查询。这确实意味着多次出行,但您不必逐个查询多个属性,例如,最终得到75个属性中的50个查询,但可能需要3个查询才能获得所需的50个属性。
答案 2 :(得分:1)
我建议将用户个人资料属性划分为逻辑类别,并通过查询参数将这些类别提供给客户:
names (array of names (aliases)) : first, last, middle, prefix
addresses (array of addresses) : street, apt, city, state, country, county
jobs (array of jobs) : company, designation, start_date, end_date, city, state, country
提供一个API,返回用户配置文件中可用类别的最新列表,因为文档可能会过时。
GET http://api.domain.com/users/profiles/categories
响应:
{
"categories": ["names", "address", "interests", "jobs" ],
"links": [
{
"rel": "users.profiles.categories",
"href": "http://api.domain.com/users/profiles/categories"
}, {
"rel": "users.profiles.category.names",
"href": "http://api.domain.com/users/profiles?categories=names"
}, {
"rel": "users.profiles.category.addresses",
"href": "http://api.domain.com/users/profiles?categories=addresses"
}, {
"rel": "users.profiles.category.interests",
"href": "http://api.domain.com/users/profiles?categories=interests"
}, {
"rel": "users.profiles.category.jobs",
"href": "http://api.domain.com/users/profiles?categories=jobs"
}, {
"rel": "users.profiles.category.all",
"href": "http://api.domain.com/users/profiles?categories=all"
}
]
}
使用上述HATEOAS并根据查询参数中提到的类别,您的服务可以从数据库中查询这些实体并形成响应并返回给您的客户。
GET http://api.domain.com/users/id/profile?categories=names,address,interests,jobs
NOTE:
如果无法在网址中直接使用逗号(,
),则可以使用%2C
(网址编码值为,
)。
此外,如果用户不使用类别API获取所有子类别,您的实际GET API也可以将HATEOAS返回到子类别。
这只是您可以使用其他信息提供端点提供可用/支持的类别(查询参数)的方法之一,而HATEOAS将帮助您的客户通过这些可用的子类别进行导航。