Java 使用group by的rest命名约定
我正在研究rest端点,它必须返回按“州”分组的“所有可用城市”。 我返回以下对象:Java 使用group by的rest命名约定,java,api,rest,naming-conventions,Java,Api,Rest,Naming Conventions,我正在研究rest端点,它必须返回按“州”分组的“所有可用城市”。 我返回以下对象: @Builder @Data class CitiesByState { Map<String, List<Cities>> citiesByStateName; } ?因为状态名称用作键 我宁愿 http://url/api/states/{statename}/cities,它还启用REST的cacheable约束 在这方面已经描述了很多假设您有一个集合资源/cities,
@Builder
@Data
class CitiesByState
{
Map<String, List<Cities>> citiesByStateName;
}
?因为
状态名称
用作键
我宁愿
http://url/api/states/{statename}/cities
,它还启用REST的cacheable
约束
在这方面已经描述了很多假设您有一个集合资源
/cities
,其中列出了所有城市。
进一步假设一个城市有许多属性(如州、人口等)
作为客户机(REST消费者,就像JavaScript驱动的web应用程序一样),您不想让选择组的哪个属性吗
将资源耦合到URI标识的表示
您的方法通过为此城市资源的表示预定义来限制这种灵活性。
像州划分的城市一样。但这将要求固定耦合,因为分组现在也取决于客户端和服务器的实现。每次更改用例的客户端分组时,您也必须调整服务器端
将分组委托给客户端
部署应用于:
关注点分离是客户机-服务器约束背后的原则。通过将用户界面关注点与数据存储关注点分离,我们提高了用户界面跨多个平台的可移植性,并通过简化服务器组件提高了可伸缩性
好处:通过在客户端执行分组,您将保持更大的灵活性。
应用这种关注点分离将客户机与服务器分离:
/states
constgroupby=(x,f)=>x.reduce((a,b)=>((a[f(b)]| |=[])。push(b,a),{});
var cities=restApi.get(“/cities”);
var citiesGroupedByState=groupBy(城市,c=>c.state)
哪些公约?
REST(在罗伊·菲尔丁的论文中)和(以及蒂姆·伯纳斯·李)都没有预见到命名约定:
路径组件包含通常以分层形式组织的数据,这些数据与非分层查询组件(第3.4节)中的数据一起用于标识资源[…]
参见澳大利亚政府API标准第节:
URL必须遵循如下所述的标准命名约定:
/namespace/project-name/v1/collection?attributes=first_name,last_name
\___________________________________/\______________________________/
| |
path query
您可能会问,当查询URL时,客户端如何请求特定的表示(响应类型,如分组的映射
)
用罗伊·T·菲尔丁的沉思回答道:
REST API应该永远不会有对客户端重要的“类型化”资源。规范作者可以使用资源类型来描述接口后面的服务器实现,但这些类型必须与客户机无关且不可见。对客户机重要的唯一类型是当前表示的媒体类型和标准化关系名称
我喜欢您的解决方案,但是客户端应该调用1次以检索所有状态(50次),我们应该调用API states/{statename}/cites(50次)。我们是否受到性能问题的影响?对于这种情况,只使用cities api URL,而不使用状态参数更合适<代码>http://url/api/cities
/namespace/project-name/v1/collection?attributes=first_name,last_name
\___________________________________/\______________________________/
| |
path query