我有一个以父子方式相关的对象的层次结构。数据存储在关系数据库中,每个记录使用外键parent_id
指向其父级。在这种情况下,所有记录都存储在一个表中。可以通过遍历父项列表来解析每个层次结构级别,直到到达根节点。如何使用REST访问这些元素,尤其是当我可能事先不知道层次结构的深度时?
+----------------------------------+----+-----------+
| Hierarchy Level | id | parent_id |
+----------------------------------+----+-----------+
| thing/sub1 | 1 | NULL |
| thing/sub1/subsub-A | 2 | 1 |
| thing/sub1/subsub-A/subsubsub-A1 | 3 | 2 |
| thing/sub1/subsub-A/subsubsub-A2 | 4 | 2 |
| thing/sub1/subsub-B | 5 | 1 |
| thing/sub2 | 6 | NULL |
| thing/sub2/subsub-A | 7 | 6 |
| thing/sub2/subsub-C | 8 | 6 |
+----------------------------------+----+-----------+
实现一个能够解析以下URL的REST接口:
GET http://www.example.org/service/thing/sub1/subsub-A/subsubsub-A2
响应是
{id=4}
很明显,可以轻松解决以下结构,因为我知道要使用哪些路径参数:
http://www.example.org/service/thing/sub1/
我正在努力解决如何解析URL中的嵌套子组件。我确实找到了sub-resource locator concept,但我不知道将其应用到我的场景中。我正在使用Jersey框架来实现。我正在寻找一种方法如何从后到前遍历REST URL,检索每个中间子组件的父ID,从而能够识别完整的对象,例如:
http://www.example.org/service/1/2/4
答案 0 :(得分:0)
我认为解析类似这样的URI结构要快得多:/service/tree/{id}
而不是使用嵌套标识符。
使用IANA link relations为父节点,单个节点的兄弟节点创建链接实际上非常简单:
collection
- 目标IRI指向代表上下文IRI的集合资源的资源。up
- 指文档层次结构中的父文档。 self
- 传达链接上下文的标识符。
first
- 一个IRI,指的是一系列资源中最远的前一个资源。
previous
- 指有序资源系列中的先前资源。 " prev"。next
- 表示链接的上下文是系列的一部分,系列中的下一个是链接目标。 last
- 一个IRI,指的是一系列资源中最远的资源。如果您想要一个有序树,nested set将是一个更好的分层模型。
答案 1 :(得分:0)
为了访问路径的层次结构,您还可以使用URL提供的路径段。这可以通过使用您需要注入的UriInfo object中的getPathSegments()方法来实现。
@Path("/segments")
public class PathSegments {
@Context
UriInfo uriInfo;
public PathSegments() {
}
@GET
@Path("{ uri: (.+)?}")
@Produces(MediaType.TEXT_PLAIN)
public String resolve() {
String hierarchy="";
for (int i = 0; i < uriInfo.getPathSegments().size(); i++) {
hierarchy+= "[" + i + "] " + uriInfo.getPathSegments().get(i);
if(i<uriInfo.getPathSegments().size()-1){
hierarchy+=" --> ";
}
}
return hierarchy;
}
}
这提供了以下输出:
[0] segments --> [1] a --> [2] b --> [3] c --> [4]