2017-01-11 3 views
1

Angenommen I eine Baumstruktur haben, wieDarstellen Baumdatenstruktur in REST als URL-Sequenz

Kategorien:

Category1 
    Subcategory11 
    Subcategory12 
    Category2 
    Subcategory21 
    Subcategory22 
    ... 

Kategorie und Unterkategorie sind die gleichen Datentyp (Kategorie). Möglicherweise könnte es> 2 Ebenen des Gehäuses geben.

Was wäre die beste Möglichkeit, die Abfrage darzustellen, die alle Top-Kategorien zurückgibt? Funktioniert etwas wie www.mysite.com/api/categories oder www.mysite.com/api/categories/top?

Angenommen, ich möchte die gesamte Liste der Kategorien in einem REST-Aufruf zurückgeben, was wäre dieser Endpunkt und würde eine solche Anforderung die REST-Prinzipien verletzen? Kann ich etwas wie www.mysite.com/api/categories/tree verwenden?

BTW, ich habe die How should a REST URL schema look like for a tree hierarchy? gesehen, aber das ist kein reines Beispiel für einen Baum von homogenen Knoten.

+1

Erste und formost, REST kaum etwas mit URI-Design zu tun hat; RESTs Absicht ist die Entkopplung von API/Server und ihren Clients. HTTP bietet Content-Type-Negotiation, mit der ein Client dem Server mitteilen kann, wie die Antwort aussehen soll. Sie könnten also einen Medientyp definieren, der nur die obersten Kategorien enthält (dh 'application/vnd.yourComp.category.top + json') und einen, der die vollständige Hierarchie enthält (dh' application/vnd.yourComp.category.full + xml') und lassen Sie dann den Kunden entscheiden, was er sehen möchte. –

+0

Ich denke, dass Sie DFS-Algorithmus und diese Implementierungsbeispiele benötigen. https://www.cis.upenn.edu/~matuszek/cit594-2003/Examples/TreeTraversals/TreeTraversals.java – Musa

Antwort

0

ich denke, dass Sie DFS-Algorithmus und diese Implementierung Beispiele benötigen .... (https://www.cis.upenn.edu/~matuszek/cit594-2003/Examples/TreeTraversals/TreeTraversals.java)

Aber Sie können diese Methode aller Kategorie passieren und Baum dieser Kategorie erhalten. Und zusätzlich möchte ich erwähnen, dass Sie CategoryDTO und relativ CategoryMapper darstellen bessere Art auf Antwort (auf Darstellungsebene zB - geruhsamen) verwenden können

// zur besseren Lesbarkeit Einrichter, Getter und andere Felder (und Code-Teile) weggelassen werden, ist

public class Category implements Serializable, Comparable<Category> { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long id; 

    @Column(name = "created_on") 
    private Instant createdOn; 

    @Column(name = "created_by") 
    private String createdBy; 

    @Column(name = "status") 
    private Integer status; 

    @Column(name = "name") 
    private String name; 

    @ManyToOne(fetch = FetchType.LAZY) 
    private Category parent; 

    @Transient 
    private List<Category> child = new ArrayList<>(); 

    } 

diese Methode, die

private List<Category> createTreeCategoriesByParent(final List<Category> categories, Long parentId) { 
     List<Category> siblings; 
      siblings = new ArrayList<>(); 
      categories.forEach(category -> { 
       if (Objects.equals(category.getParent() == null ? null : category.getParent().getId(), parentId)) { 
        List<Category> children = createTreeCategoriesByParent(categories, category.getId()); 
        children.sort(Category::compareTo); 
        category.setChild(children); 
        siblings.add(category); 
       } 
      }); 
      return siblings; 
    } 
Liste der Kategorie Baum zurück

Ihre Eingabe Kategorie wird

[ 
    { 
    "status": 1, 
    "name": "Woman", 
    "accOrder": 0, 
    "parentId": null, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Man", 
    "accOrder": 0, 
    "parentId": null, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Shoes", 
    "accOrder": 0, 
    "parentId": 1, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Bijoux", 
    "accOrder": 1, 
    "parentId": 1, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Sneckers", 
    "accOrder": 1, 
    "parentId": 3, 
    "child": [] 
    }, 
    { 
    "status": 0, 
    "name": "Kids", 
    "accOrder": 1, 
    "parentId": null, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Good Sneckers", 
    "accOrder": 1, 
    "parentId": 5, 
    "child": [] 
    }, 
    { 
    "status": 1, 
    "name": "Bad Snackers", 
    "accOrder": 2, 
    "parentId": 5, 
    "child": [] 
    }] 

Ausgang ist

[ 
    { 
    "status": null, 
    "name": "Woman", 
    "accOrder": 0, 
    "parentId": null, 
    "child": [ 
     { 
     "status": null, 
     "name": "Shoes", 
     "accOrder": 0, 
     "parentId": 1, 
     "child": [ 
      { 
      "status": null, 
      "name": "Sneckers", 
      "accOrder": 1, 
      "parentId": 3, 
      "child": [ 
       { 
       "createdBy": null, 
       "status": null, 
       "name": "Good Sneckers", 
       "accOrder": 1, 
       "parentId": 5, 
       "child": [] 
       }, 
       { 
       "status": null, 
       "name": "Bad Snackers", 
       "accOrder": 2, 
       "parentId": 5, 
       "child": [] 
       } 
      ] 
      } 
     ] 
     }, 
     { 
     "status": null, 
     "name": "Bijoux", 
     "accOrder": 1, 
     "parentId": 1, 
     "child": [] 
     } 
    ] 
    }, 
    { 
    "status": null, 
    "name": "Man", 
    "accOrder": 0, 
    "parentId": null, 
    "child": [ 
     { 
     "status": null, 
     "name": "T-shirt", 
     "accOrder": 1, 
     "parentId": 2, 
     "child": [] 
     } 
    ] 
    }, 
    { 
    "status": null, 
    "name": "Kids", 
    "accOrder": 1, 
    "parentId": null, 
    "child": [] 
    }, 
    { 
    "status": null, 
    "name": "Furniture", 
    "accOrder": 4, 
    "parentId": null, 
    "child": [] 
    } 
]