Mat*_*rno 3 rest url design-patterns microservices
我们正在考虑适合我们(大部分)RESTful 微服务的最佳 URL 方案。每个服务都有自己的上下文。针对主题标签(例如 Instagram)特定逻辑的服务可以完成与主题标签相关的所有操作。完成注册用户等所有处理的用户服务。
所以我们认为每个 URL 都以 /api 开头,然后是每个服务的上下文。在这种情况下,例如 /api/hashtag 或 /api/user
问题在于这些服务与“核心”资源具有相同的名称。例如,用户服务有一个列出所有用户的资源,因此 URL 必须类似于 /api/user/user。主题标签也是如此。该服务中有一个资源列出了所有主题标签。所以 URL 必须是 /api/hashtag/hashtag。
现在您遇到了问题:“核心”资源听起来与服务完全相同。我们正在为此寻找一个好的解决方案。有这方面的最佳实践吗?
谢谢你!
url 命名背后的基本原理是面向资源的架构(ROA)。即资源层次结构。
让我们从你的问题中举一个例子。您有用户服务。我假设您将user其视为root resource.
那么让我们定义一下用户是什么样的。举个例子,我会这样认为。
User
| - code
| - name
| - cars
Run Code Online (Sandbox Code Playgroud)
这里我假设用户可以有一个代码、名称和一些汽车(可以不止一辆)。
现在让我们看看如何看到一辆车。
Car
| - number
| - make
| - model
| - year
Run Code Online (Sandbox Code Playgroud)
现在您可以像这样为用户定义一个 json 对象。
{
"code": "001A",
"name": "alice",
"cars": [
{
"number": "ab123",
"make": "toyota",
"model": "corolla",
"year": 2015
},
{
"number": "we345",
"make": "nissan",
"model": "sunny",
"year": 2017
}
]
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我想提供一个端点来检索所有用户,我会提供这样的端点。
/api/user-service/users
Run Code Online (Sandbox Code Playgroud)
请注意,用户(-- 复数),只是因为我可以拥有多个用户。它会产生这样的响应..
[
{
"code": "001A",
"name": "alice",
"cars": [
{
"make": "toyota",
"model": "corolla",
"year": 2015
},
{
"make": "nissan",
"model": "sunny",
"year": 2017
}
]
},
{
"code": "001B",
"name": "bob",
"cars": [
{
"make": "toyota",
"model": "yaris",
"year": 2016
},
{
"make": "bmw",
"model": "318i",
"year": 2017
}
]
}
]
Run Code Online (Sandbox Code Playgroud)
如果我们需要一个端点来检索特定用户的数据,我会给出这样的端点。
/api/user-service/users/{user-code}
Run Code Online (Sandbox Code Playgroud)
例子
/api/user-service/users/001A
Run Code Online (Sandbox Code Playgroud)
所以它会产生这样的响应。
{
"code": "001A",
"name": "alice",
"cars": [
{
"number": "ab123",
"make": "toyota",
"model": "corolla",
"year": 2015
},
{
"number": "we345",
"make": "nissan",
"model": "sunny",
"year": 2017
}
]
}
Run Code Online (Sandbox Code Playgroud)
如果我们想要一个端点检索给定用户的所有汽车,那就像这样。
/api/user-service/users/{user-code}/cars
Run Code Online (Sandbox Code Playgroud)
请注意,汽车(--复数)
例子
/api/user-service/users/001A/cars
Run Code Online (Sandbox Code Playgroud)
所以它会产生这样的响应。
[
{
"number": "ab123",
"make": "toyota",
"model": "corolla",
"year": 2015
},
{
"number": "we345",
"make": "nissan",
"model": "sunny",
"year": 2017
}
]
Run Code Online (Sandbox Code Playgroud)
我希望您对 REST url 命名约定有基本的了解。