Zagnieżdżanie endpointów - relacje.

Zagnieżdżanie endpointów - relacje.
TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

Tworzę proste API do platformy zawierającej wpisy z różnych blogów. Zastanawiam się nad strukturą endpointów. Część modelu nad którą się zastanawiam to relacje między encjami: Blog, Post i Komentarz. Gdzie:

  • Komentarz nie może istnieć bez Postu
  • Post nie może istnieć bez Bloga

Nasuwają mi się dwa rozwiązania, ale nie wiem które wybrać:

Pierwsze

Kopiuj
/blogs/{blogId}
/blogs/{blogId}/posts/{postId}
/blogs/{blogId}/posts/{postId}/comments/{commentId}

Drugie:

Kopiuj
/blogs/{blogId}
/blogs/{blogId}/posts/{postId}
/posts/{postId}/comments/{commentId}

Moje wątpliwości co do wyboru rozwiązania wynikają z faktu, że czym głębsze zagnieżdżenia, tym więcej pracy związanej z obsługą powiązanych encji np:
W pierwszym rozwiązaniu dodając komentarz musiałbym za każdym razem sprawdzać czy podany w ścieżce blog istnieje. W drugim natomiast wystarczy, że sprawdzę post do którego chcę dodać komentarz (zakładam że post nie może istnieć bez bloga tzn. usuwając bloga usuwam też posty i komentarze - więc spójność zostanie zachowana).

edytowany 1x, ostatnio: travis.chigurh
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Postów:1873
1

Tak z praktycznego punktu widzenia:

  1. Skoro mam postId, to po co mi bookId? Gdyby było wiele do wielu albo jakieś relatywne numerowanie postów, to może wtedy, aby uzyskać jednoznaczność.
  2. Nie odzwierciedlaj schematu bazy danych w API. Pathy to jedno, a schemat bazy i walidacja - drugie.

”Engineering is easy. People are hard.” Bill Coughran
edytowany 2x, ostatnio: Charles_Ray
LU
  • Rejestracja:około 11 lat
  • Ostatnio:2 dni
  • Lokalizacja:Gdańsk
2

Nie wiem czy pobieranie komentarza po id się w praktyce przydaję. Wydaje mi się, że zwykle pobiera się listę komentarzy dla
danego postu zwykle z paginacją.

/posts/{postId}/comments/{commentId}

Tutaj też de facto trzeba by sprawdzić czy taki post istnieje wystarczyłoby tak naprawdę:

/comments/{commentId}

Polecam przeczytać: https://github.com/allegro/restapi-guideline#user-content-minimize-resources-nesting


edytowany 1x, ostatnio: lukascode
TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

Mam jeszcze jedno pytanie. Podzieliłem już sobie endpointy na konkretne metody w kontrolerach. I zastanawiam się czy dobrze Was zrozumiałem. Postawiłem sobie takie wymagania odnośnie bloga:

  • pobrać wszystkie blogi (do tego jakaś paginacja)
  • pobrać konkretny blog wraz z wszystkim kolekcjami
  • pobrać tylko posty danego bloga
  • pobrać tylko userów bloga

Chce to zrobić w ten sposób:

Blog Controller

Kopiuj
GET /blogs
GET /blogs/{blogId}   // pobiera cały obiekt blog wraz z kolekcjami
GET /blogs/{blogId}/posts   // pobiera tylko powiązaną kolekcje obiektów post
GET /blogs/{blogId}/users

Dla postów analogicznie
Post Controller

Kopiuj
GET /posts
GET /posts/{postId}
GET /posts/{postId}/comments
itd...

Czy dobrze to zrozumiałem?

.andy
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 3 lata
  • Postów:1524
1

GET /blogs/{blogId}/users a co to robi? O jakich userów bloga chodzi?


Software is like sex: it's better when it's free.
- Linus Torvalds
TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

@.andy:
Dotyczy userów tego bloga. Czy w ten sposób ma wyglądać endpoint, który pobierze tylko powiązane kolekcje dla zadanego obiektu nadrzędnego. np. wszystkie posty zadanego bloga, wszystkich użytkowników bloga itd. Dodatkowo zakładam że to odpowiedzialność kontrolera obiektu nadrzędnego?

edytowany 1x, ostatnio: travis.chigurh
LU
  • Rejestracja:około 11 lat
  • Ostatnio:2 dni
  • Lokalizacja:Gdańsk
0

@travis.chigurh: Zależy od klienta, który będzie to wyświetlał / konsumował.


edytowany 1x, ostatnio: lukascode
TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
1

@lookacode1: Konsumpcja:

  • pobrać wszystkie blogi (list view + paginacja)
  • pobrać konkretny blog wraz z wszystkim kolekcjami (strona details z np, ruchem na stronie, ilość postów itd)
  • pobrać tylko posty danego bloga (list view + paginacja)

Czy powyższe założenia są poprawne co do ich umieszczenia w wyżej wymienionych kontrolerach?

LU
  • Rejestracja:około 11 lat
  • Ostatnio:2 dni
  • Lokalizacja:Gdańsk
1

@travis.chigurh: Seems legit.


TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

Dzięki wszystkim za pomoc :)

TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

Pojawił się kolejny problem z endpointem tworzenia postów do konkretnego bloga. Wcześniej chciałem stworzyć post w następujący sposób:

Kopiuj
POST /blogs/{blogId}/posts

Jednak jak chcę unikać zagnieżdżonych endpointów, więc myślę o czymś takim:

Kopiuj
POST /posts

Ale jak w takim razie przekazać Id powiązanego Bolga? w body? w headerze?

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Postów:1873
1

Myślmy. Na stole masz 3 opcje:

  1. Przekazać id bloga w path
  2. Przekazać id bloga w body
  3. Przekazać id bloga w headerze

Która jest najbardziej naturalna, tj. bez zakładania gaci przez głowę?

Btw. Czy to nie jest jakieś zadanie rekrutacyjne?


”Engineering is easy. People are hard.” Bill Coughran
TC
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Kraków
  • Postów:49
0

@Charles_Ray
Do wczoraj wybrał bym 1. Jednak bardziej naturalne wydaje się body więc 2.

nie jest to zadanie, sam próbuje się uczyć i wiem że nic nie wiem :)

//edit:
chcę też zrobić API nie na zasadzie by działało, ale również miało sens w kontekście realnych projektów

edytowany 1x, ostatnio: travis.chigurh
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:dzień
  • Postów:1873
3

Ja bym poszedł w opcję (1), chociaż (2) też wydaje się OK. Opcja (3) to totalny folklor ;)


”Engineering is easy. People are hard.” Bill Coughran
LU
  • Rejestracja:około 11 lat
  • Ostatnio:2 dni
  • Lokalizacja:Gdańsk
2

Pierwsze wydaje się bardziej naturalne.


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)