Skip to content
This repository was archived by the owner on Jun 30, 2021. It is now read-only.

Commit 2f7b15a

Browse files
authored
Merge pull request #15 from digipolisantwerpdocumentation/pagingv2
PagingStrategy toegevoegd aan paginatie.
2 parents cbfeb18 + 1259588 commit 2f7b15a

File tree

1 file changed

+123
-80
lines changed

1 file changed

+123
-80
lines changed

README.md

Lines changed: 123 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# Digipolis API design & style requirements v5.1.1
1+
# Digipolis API design & style requirements v5.2.0
22

3-
geldig vanaf 01 oktober 2018
3+
geldig vanaf 01 mei 2019
44

55
## Inhoudstabel
66
<!-- PC : generated with doctoc (https://www.npmjs.com/package/doctoc) with option --notitle -->
@@ -91,6 +91,7 @@ Versie | Auteur | Datum | Opmerkingen
9191
5.0.0 | Peter Claes | 28/08/2018 | Geen HTTP response code 200 meer toegelaten bij POST.
9292
5.1.0 | Steven Vanden Broeck | 03/09/2018 | Verduidelijking extra info in error model.
9393
5.1.1 | Peter Claes | 03/10/2018 | Verduidelijking PATCH methode.
94+
5.2.0 | Steven Vanden Broeck | 13/02/2019 | Uitbreiding van de paging guidelines.
9495

9596
## Cheat sheet
9697

@@ -143,71 +144,44 @@ Swagger v2.0, JSON
143144
### Request
144145

145146
- filtering op id : steeds mee als node in URI (niet via query parameter)
146-
- query parameters, enkel voor
147-
- filtering
148-
- op resource
149-
- unieke query parameter per veld
150-
- indien meerdere waarden voor een veld filter :
151-
152-
**resource?parameter=waarde1,waarde2,waarde3**
153-
- GEEN query parameter voor id's !
154-
- op resource representatie
155-
- reserved : **fields**= (comma separated)
156-
- sortering
157-
- reserved : **sort**= (comma separated)
158-
- default : ascending
159-
- **-**\<parameter\> : descending
160-
- paginatie
161-
- reserved : **page**= (optional parameter, default value=1)
162-
- reserved : **pagesize**=(optional parameter, default=bepaald door API)
163-
- resource representation
164-
- altijd via body, nooit via query parameters
147+
- query parameters, enkel voor
148+
- filtering
149+
- op resource
150+
- unieke query parameter per veld
151+
- indien meerdere waarden voor een veld filter :
152+
153+
**resource?parameter=waarde1,waarde2,waarde3**
154+
155+
- GEEN query parameter voor id's !
156+
- op resource representatie
157+
158+
- reserved : **fields**= (comma separated)
159+
- sortering
160+
- reserved : **sort**= (comma separated)
161+
- default : ascending
162+
- **-**\<parameter\> : descending
163+
- paginatie
164+
- reserved : **page**= (optional parameter, default value=1)
165+
- reserved : **pagesize**=(optional parameter, default=bepaald door API)
166+
- resource representation
167+
168+
- altijd via body, nooit via query parameters
165169

166170
### Paginatie
167171

168172
- altijd gebruiken bij ophalen van collecties
169-
- query parameters : **page**= en **pagesize**=
170-
- optioneel mee te geven door clients (default wordt dan gebruikt)
173+
- query parameters : **page**= en **pagesize**= en **pagingStrategy**=
174+
- optioneel mee te geven door clients (bij ontbreken worden de default waardes gebruikt)
171175
- 1-based (1e pagina is pagina 1)
172176
- Response volgens HAL specificatie
173177
- media type : **application/hal+json**
174178
- reserved keywords
175179
- \_links
176180
- \_embedded
177181
- \_page
178-
- voorbeeld
179-
```json
180-
{
181-
"_links": {
182-
"self": {
183-
"href": "https://api-gateway/digipolis/business-party/v1/business-parties"
184-
},
185-
"first": {
186-
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=1&pagesize=10"
187-
},
188-
"last": {
189-
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=7386&pagesize=10"
190-
},
191-
"next": {
192-
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=2&pagesize=10"
193-
}
194-
},
195-
"_embedded": {
196-
"business-parties": [{
197-
198-
},
199-
{
200-
201-
}]
202-
},
203-
"_page": {
204-
"size": 10,
205-
"totalElements": 73853,
206-
"totalPages": 7386,
207-
"number": 1
208-
}
209-
}
210-
```
182+
- voorbeelden
183+
- beide `pagingStrategy` waardes (`noCount` en `withCount`) moeten ondersteund worden
184+
211185
### Event resources
212186

213187
POST [/\<groepering>]*/\<event> waarbij \<event> eindigt op een voltooid deelwoord
@@ -669,7 +643,7 @@ Stel dat contract 42 van business party 6532 volgende resource representatie hee
669643
"value": 850
670644
}
671645
}
672-
```
646+
```
673647
en je wil de prijs veranderen naar 950 Euro,<br/>
674648
dan kan je dit als volgt doen
675649

@@ -684,7 +658,7 @@ met als request body
684658
"value": 950
685659
}
686660
}
687-
```
661+
```
688662

689663

690664
#### DELETE
@@ -847,36 +821,51 @@ Dit geeft als resultaat een lijst van business parties aflopend volgens zip code
847821

848822
Paginatie informatie wordt **steeds** terug gegeven bij het ophalen van collections. Dit om er voor te zorgen dat collections die in eerste instantie een beperkt aantal entiteiten bevatten op termijn te groot kunnen worden om de vooropgestelde performantie te kunnen blijven garanderen.
849823

850-
Vanuit consumer standpunt is het noodzakelijk dat deze volgende informatie in de response terugkrijgt om voldoende informatie te bekomen rond de pagina's:
824+
Vanuit consumer standpunt is het noodzakelijk dat volgende informatie in de response wordt gegeven om voldoende informatie te bekomen rond de pagina's:
825+
826+
| Info | | Verplicht |
827+
| ---------------------------- | --------------------------- | ------------------------------ |
828+
| Link naar de eerste pagina | | Ja |
829+
| Link naar de laatste pagina | | Ja |
830+
| Link naar de vorige pagina | | Ja |
831+
| Link naar de volgende pagina | | Ja |
832+
| Extra metadata : | | |
833+
| | Huidig paginanummer | Ja |
834+
| | Aantal elementen per pagina | Ja |
835+
| | Totaal aantal elementen | Afhankelijk van pagingStrategy |
836+
| | Totaal aantal pagina's | Afhankelijk van pagingStrategy |
851837

852-
- Link naar de eerste pagina
853-
- Link naar de laatste pagina
854-
- Link naar de vorige pagina
855-
- Link naar de volgende pagina
856-
- Extra metadata:
857-
- Huidig paginanummer
858-
- Aantal resources per pagina
859-
- Totaal aantal resources
860-
- Totaal aantal pagina's
861838

862-
De informatie kan eenvoudig en efficiënt worden berekend in de back-end systemen en verlicht de verwerking langs consumer kant.
839+
840+
In veel paginatierichtlijnen wordt gevraagd om het totaal aantal pagina's en/of elementen altijd terug te geven zodat de gebruiker exact kan geïnformeerd worden over de lengte van de opgevraagde lijst. Dit houdt in dat er impliciet altijd een 'count' mechanisme moet geïmplementeerd worden wat bij lijsten van grote aantallen tot een merkbare vertraging kan leiden in het opvragen van de lijst.
841+
842+
Daarom kiezen we met onze API requirements voor een oplossing die 2 strategieën implementeert :
843+
- een snellere opvraging zonder verplichte 'count'
844+
- een potentieel tragere opvraging tengevolge een impliciet 'count'-mechanisme
845+
846+
De client toepassing kiest welke strategie wordt toegepast dmv van een (optionele) query parameter : **`pagingStrategy`** (zie verder).
863847

864848
### Paginatie query parameters
865849

866-
Het ophalen van een bepaalde pagina zelf dient te gebeuren door middel van de **`page`** en **`pagesize`** query parameters.
850+
Het ophalen van een bepaalde pagina zelf dient te gebeuren door middel van de **`page`** en **`pagesize`** query parameters (behalve voor de `last` link bij `pagingStrategy=noCount`, zie verder).
867851
``` prettyprint
868852
/partners?page=1&pagesize=10
869853
```
870854

871-
Paginatie queries starten steeds met *page=1*
855+
Paginatie queries starten steeds met *page=1*, niet 0. De keuze hiervoor is gemaakt op basis van gebruiksvriendelijkheid naar de API consumer en gebruiker toe.
872856

873-
De keuze hiervoor is gemaakt op basis van gebruiksvriendelijkheid naar de API consumer toe.
874-
875-
De paginatie query parameters zijn **optioneel**. Dat maakt dat indien deze niet zijn opgegeven:
857+
De paginatie query parameters zijn **optioneel**. Dat maakt dat wanneer deze **niet** zijn opgegeven:
876858

877859
- Een beperkte set van resources wordt teruggegeven bij het bevragen van collections op basis van een default page size die voor elke API wordt bepaald.
878860
- Steeds de eerste pagina wordt terug gegeven.
879861

862+
Om de paging strategie mee te geven, gebruikt de consumer de optionele parameter **`pagingStrategy`**. Deze heeft 2 mogelijke waardes :
863+
- withCount (default als de query parameter niet wordt meegegeven)
864+
- noCount
865+
866+
Bij **`withCount`** worden __`Totaal aantal elementen`__ en __`Totaal aantal pagina's`__ altijd verplicht terug gegeven. Bovendien bevat de __`link naar de laatste pagina`__ het paginanummer (zie verder voor een voorbeeld).
867+
Bij **`noCount`** worden de beide totalen niet terug gegeven en is de link naar de laatste pagina een link zonder paginanummer met de vermelding **`last`** (zie verder voor een voorbeeld).
868+
880869
### Paginatie response bericht
881870

882871
Om paginatie informatie naar de consumer terug te sturen baseren we ons op de HAL specificatie:
@@ -951,17 +940,29 @@ Dit resulteert in volgende structuur.
951940
```
952941

953942
Het **\_page** reserved keyword vormt geen onderdeel van de HAL specificatie, maar is extra metadata die in de response message komt om
954-
een indicatie te krijgen van de huidige paginanummer, aantal elementen per pagina, het totaal aantal pagina's en het totaal aantal elementen en vereenvoudigt de bewerkingen langs consumer kant om deze informatie te bekomen.
943+
een indicatie te krijgen van de huidige paginanummer, aantal elementen per pagina, het totaal aantal pagina's en het totaal aantal elementen en vereenvoudigt de bewerkingen langs consumer kant om deze informatie te bekomen. Bij **`pagingStrategy=noCount`** worden `totalElements` en `totalPages` weg gelaten.
944+
945+
Voorbeeld bij `pagingStrategy=withCount` :
955946
```json
956947
{
957948
"_page": {
958949
"size": 10,
959950
"totalElements": 73853,
960951
"totalPages": 7386,
961952
"number": 1
953+
}
962954
}
955+
```
956+
957+
Voorbeeld bij `pagingStrategy=noCount` :
958+
```json
959+
{
960+
"_page": {
961+
"size": 10,
962+
"number": 1
963+
}
963964
}
964-
```
965+
```
965966

966967
Alle aspecten van paginatie samenvoegend geeft dit volgende response wrapper message voor paginatie:
967968
```json
@@ -997,13 +998,15 @@ Alle aspecten van paginatie samenvoegend geeft dit volgende response wrapper mes
997998
}
998999
}
9991000
```
1001+
1002+
Zoals reeds vermeld vallen `totalElements` en `totalPages` weg bij `pagingStrategy=noCount`.
10001003

10011004
#### Een voorbeeld
10021005

1003-
Het ophalen van business parties
1006+
Het ophalen van business parties (withCount)
10041007

10051008
``` prettyprint
1006-
https://api-gateway/digipolis/business-party/v1/business-parties
1009+
https://api-gateway/digipolis/business-party/v1/business-parties?pagingStrategy=withCount
10071010
```
10081011

10091012
Geeft als resultaat
@@ -1038,8 +1041,48 @@ Geeft als resultaat
10381041
}
10391042
```
10401043

1044+
Het ophalen van business parties (noCount)
1045+
1046+
``` prettyprint
1047+
https://api-gateway/digipolis/business-party/v1/business-parties?pagingStrategy=noCount
1048+
```
1049+
1050+
Geeft als resultaat
1051+
```json
1052+
{
1053+
"_links": {
1054+
"self": {
1055+
"href": "https://api-gateway/digipolis/business-party/v1/business-parties"
1056+
},
1057+
"first": {
1058+
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=1&pagesize=10"
1059+
},
1060+
"last": {
1061+
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=last&pagesize=10"
1062+
},
1063+
"next": {
1064+
"href": "https://api-gateway/digipolis/business-party/v1/business-parties?page=2&pagesize=10"
1065+
}
1066+
},
1067+
"_embedded": {
1068+
"business-parties": [{
1069+
},
1070+
{
1071+
}]
1072+
},
1073+
"_page": {
1074+
"size": 10,
1075+
"number": 1
1076+
}
1077+
}
1078+
```
1079+
1080+
In de **last** link wordt gebruik gemaakt van **page=last** ipv het exacte paginanummer om te vermijden dat een count moet uitgevoerd worden bij het ophalen van de lijst. Dit houdt wel impliciet in **dat de API deze waarde (=last) ook verplicht moet ondersteunen**. Pas wanneer deze wordt gebruikt zal de API een count uitvoeren om op dat moment de laatste pagina te berekenen en terug te geven.
1081+
1082+
Een API moet altijd beide `pagingStrategy` methodes ondersteunen.
1083+
10411084
**Bij het ophalen van een collection zonder specificatie van query parameters dient paginatie informatie altijd aanwezig te zijn in de
1042-
response message**.
1085+
response message**, gebruik makend van de `withCount` paginatie strategie.
10431086
Het aantal elementen dat in zulk geval wordt teruggegeven (page size) is API specifiek en dient te worden bepaald tijdens de API design fase.
10441087

10451088
## Event resources
@@ -1172,7 +1215,7 @@ In sommige gevallen kan het nuttig zijn om **extra info** mee te geven zodat de
11721215
]
11731216
}
11741217
}
1175-
```
1218+
```
11761219

11771220
### HTTP status codes en error model
11781221

0 commit comments

Comments
 (0)