如何在REST中实现父子关系,从而允许JAXRS中的层次结构

时间:2014-11-21 13:22:25

标签: mysql rest jersey nested hierarchy

问题:如何在REST中检索分层对象?

我有一个以父子方式相关的对象的层次结构。数据存储在关系数据库中,每个记录使用外键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

2 个答案:

答案 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]