haveapi 0.32.1 → 0.32.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -8
  3. data/README.md +3 -422
  4. data/Rakefile +17 -7
  5. data/benchmarks/performance_compare.rb +27 -6
  6. data/doc/cs/client-examples.md +535 -0
  7. data/doc/cs/create-client.md +118 -0
  8. data/doc/cs/json-schema.html +1182 -0
  9. data/doc/cs/protocol.md +595 -0
  10. data/doc/cs/readme.md +432 -0
  11. data/doc/cs/typed-input-validation.md +122 -0
  12. data/doc/{client-examples.md → en/client-examples.md} +20 -10
  13. data/doc/{documentation-ui.md → en/documentation-ui.md} +42 -6
  14. data/doc/{performance.md → en/performance.md} +11 -0
  15. data/doc/{protocol.md → en/protocol.md} +2 -2
  16. data/doc/en/readme.md +423 -0
  17. data/haveapi.gemspec +2 -2
  18. data/lib/haveapi/client_example.rb +18 -5
  19. data/lib/haveapi/client_examples/curl.rb +5 -5
  20. data/lib/haveapi/client_examples/dynamic_helpers.rb +10 -10
  21. data/lib/haveapi/client_examples/go_client.rb +1 -1
  22. data/lib/haveapi/client_examples/http.rb +4 -4
  23. data/lib/haveapi/client_examples/js_client.rb +10 -10
  24. data/lib/haveapi/client_examples/php_client.rb +24 -25
  25. data/lib/haveapi/client_examples/python_client.rb +11 -11
  26. data/lib/haveapi/client_examples/ruby_cli.rb +6 -9
  27. data/lib/haveapi/client_examples/ruby_client.rb +24 -16
  28. data/lib/haveapi/client_examples/rust_client.rb +1 -1
  29. data/lib/haveapi/client_examples/ts_generated_client.rb +1 -1
  30. data/lib/haveapi/documentation_context.rb +14 -2
  31. data/lib/haveapi/documentation_helpers.rb +92 -15
  32. data/lib/haveapi/documentation_locale.rb +65 -0
  33. data/lib/haveapi/documentation_oauth.rb +12 -12
  34. data/lib/haveapi/documentation_search.rb +5 -5
  35. data/lib/haveapi/documentation_validators.rb +43 -33
  36. data/lib/haveapi/locales/cs.yml +468 -0
  37. data/lib/haveapi/locales/en.yml +467 -0
  38. data/lib/haveapi/public/css/documentation.css +8 -4
  39. data/lib/haveapi/public/js/documentation.js +73 -20
  40. data/lib/haveapi/server.rb +32 -47
  41. data/lib/haveapi/shared_documentation_helpers.rb +53 -5
  42. data/lib/haveapi/version.rb +1 -1
  43. data/lib/haveapi/views/doc_layout.erb +3 -2
  44. data/lib/haveapi/views/doc_sidebars/create-client.erb +10 -10
  45. data/lib/haveapi/views/doc_sidebars/json-schema.erb +2 -2
  46. data/lib/haveapi/views/doc_sidebars/protocol.erb +24 -24
  47. data/lib/haveapi/views/documentation/search_form.erb +5 -4
  48. data/lib/haveapi/views/documentation/search_results.erb +6 -6
  49. data/lib/haveapi/views/index.erb +3 -3
  50. data/lib/haveapi/views/main_layout.erb +4 -4
  51. data/lib/haveapi/views/shared_documentation.erb +8 -5
  52. data/lib/haveapi/views/shared_sidebar.erb +11 -11
  53. data/lib/haveapi/views/version_page/auth_body.erb +7 -7
  54. data/lib/haveapi/views/version_page/client_auth.erb +1 -1
  55. data/lib/haveapi/views/version_page/client_example.erb +1 -1
  56. data/lib/haveapi/views/version_page/client_init.erb +1 -1
  57. data/lib/haveapi/views/version_page/client_overview.erb +7 -5
  58. data/lib/haveapi/views/version_page/example_panels.erb +5 -2
  59. data/lib/haveapi/views/version_page/resource_body.erb +24 -24
  60. data/lib/haveapi/views/version_page/resource_directory.erb +2 -2
  61. data/lib/haveapi/views/version_page/usage.erb +5 -5
  62. data/lib/haveapi/views/version_page.erb +11 -11
  63. data/lib/haveapi/views/version_sidebar/auth_nav.erb +2 -2
  64. data/lib/haveapi/views/version_sidebar/authentication_control.erb +8 -8
  65. data/lib/haveapi/views/version_sidebar/authentication_status.erb +1 -1
  66. data/lib/haveapi/views/version_sidebar/brand.erb +16 -5
  67. data/lib/haveapi/views/version_sidebar.erb +33 -18
  68. data/spec/client_examples/assets/documentation_test.cjs +107 -9
  69. data/spec/client_examples/comment_capture.rb +72 -0
  70. data/spec/client_examples/comments_spec.rb +162 -0
  71. data/spec/client_examples/context_spec.rb +18 -2
  72. data/spec/client_examples/detail_spec.rb +68 -0
  73. data/spec/documentation/client_overview_spec.rb +60 -0
  74. data/spec/documentation/example_selection_spec.rb +192 -0
  75. data/spec/documentation/language_settings_spec.rb +132 -0
  76. data/spec/documentation/locale_spec.rb +367 -0
  77. data/spec/documentation/navigation_spec.rb +61 -3
  78. data/spec/documentation/oauth_spec.rb +42 -0
  79. data/spec/documentation/search_index_routes_spec.rb +8 -4
  80. data/spec/documentation/search_spec.rb +1 -1
  81. data/spec/documentation/shared_pages_spec.rb +63 -2
  82. data/spec/documentation/validators_spec.rb +25 -0
  83. data/spec/extensions/exception_mailer_spec.rb +2 -2
  84. data/spec/packaging_spec.rb +68 -9
  85. data/spec/performance/event_baseline_spec.rb +1 -1
  86. data/spec/performance/source_versions_spec.rb +111 -2
  87. metadata +24 -11
  88. /data/doc/{create-client.md → en/create-client.md} +0 -0
  89. /data/doc/{documentation-oauth.md → en/documentation-oauth.md} +0 -0
  90. /data/doc/{json-schema.html → en/json-schema.html} +0 -0
  91. /data/doc/{typed-input-validation.md → en/typed-input-validation.md} +0 -0
@@ -0,0 +1,595 @@
1
+ <h1 id="protocol-definition">Definice protokolu</h1>
2
+
3
+ HaveAPI definuje formát popisu API a URL, na kterých je tento popis dostupný.
4
+
5
+ <h1 id="self-description">Popis API</h1>
6
+
7
+ API samo poskytuje svůj popis, který klienti používají pro práci s ním.
8
+ Popis obsahuje přístupové URL, HTTP metody, vstupní a výstupní parametry
9
+ včetně jejich validátorů. Součástí jsou i příklady použití a textové poznámky.
10
+
11
+ Na požadavek ``OPTIONS /`` vrací API popis celého API včetně všech jeho verzí.
12
+ Popis konkrétní verze získáš například pomocí ``OPTIONS /v1/``.
13
+
14
+ Na HTTP metodu ``OPTIONS`` odpovídá i každá akce a vrací svůj popis.
15
+ Akce se stejnou URL rozlišíš parametrem ``?method=HTTP_METHOD``.
16
+
17
+ Změny API se tak okamžitě projeví ve všech klientech bez úpravy jediného řádku
18
+ jejich kódu. Stejný klient může beze změn pracovat se všemi API, která mají
19
+ kompatibilní formát popisu.
20
+
21
+ <h1 id="protocol-versioning">Verzování protokolu</h1>
22
+
23
+ Verze protokolu určuje podobu a obsah:
24
+
25
+ - obálky odpovědi,
26
+ - popisu API,
27
+ - přenášených dat.
28
+
29
+ Verze protokolu má tvar `<major>.<minor>`. `major` se zvyšuje při změně,
30
+ která narušuje zpětnou kompatibilitu. Pokud změna zachovává zpětnou
31
+ kompatibilitu a pouze přidává nové funkce, `major` zůstává a zvyšuje se `minor`.
32
+
33
+ <h1 id="envelope">Obálka</h1>
34
+
35
+ Každá odpověď API je kromě níže uvedeného výstupního formátu zabalena do obálky.
36
+ Obálka oznamuje úspěch či selhání akce a poskytuje návratovou hodnotu nebo
37
+ chybové zprávy.
38
+
39
+ {
40
+ "status": true if action succeeded or false if error occured,
41
+ "response": return value,
42
+ "message": error message, if status is false,
43
+ "errors: {
44
+ "parameter1": ["list", "of", "errors"],
45
+ "parameter2": ["and", "so", "on"]
46
+ }
47
+ }
48
+
49
+ Odpovědi na požadavky `OPTIONS` obsahují v obálce také verzi protokolu:
50
+
51
+ "version": <version>
52
+
53
+ <h2 id="localization">Lokalizace</h2>
54
+
55
+ Servery mohou pomocí HTTP hlavičky `Accept-Language` překládat řetězce určené
56
+ uživatelům. Lokalizace mění pouze řetězcové hodnoty, například `message`,
57
+ položky parametrů v `errors` a zprávy validátorů v popisu API. Přeložené mohou
58
+ být také hodnoty `label` a `description` parametrů v popisu API. Struktura
59
+ obálky zůstává stejná a klienti musí tyto hodnoty nadále zpracovávat jako řetězce.
60
+
61
+ <h1 id="description-format">Formát popisu</h1>
62
+
63
+ V tomto dokumentu je popis API zapsaný v JSON. Může ale používat kterýkoli
64
+ z podporovaných výstupních formátů.
65
+
66
+ <h2 id="api-version">Verze API</h2>
67
+
68
+ <a href="../protocol.png">
69
+ <img src="../protocol.png"
70
+ alt="Diagram struktury verze API"
71
+ width="600">
72
+ </a>
73
+
74
+ Verze API je popsána takto:
75
+
76
+ {
77
+ "authentication": {
78
+ ... authentication methods ...
79
+ },
80
+ "resources": {
81
+ ... resources ...
82
+ },
83
+ "meta": {
84
+ "namespace": "_meta"
85
+ },
86
+ "help": "/<version>/"
87
+ }
88
+
89
+ Podrobnosti k jednotlivým částem najdeš v příslušných oddílech.
90
+
91
+ <h2 id="authentication">Autentizace</h2>
92
+
93
+ HaveAPI definuje rozhraní pro vlastní autentizační metody. Vestavěná je HTTP
94
+ Basic autentizace a autentizace tokenem.
95
+
96
+ Autentizační metody lze nastavit pro každou verzi API. Jsou součástí popisu
97
+ API, ale klient jim musí rozumět. Z dostupných metod si může vybrat tu,
98
+ kterou upřednostňuje.
99
+
100
+ <h3 id="http-basic-authentication">HTTP Basic autentizace</h3>
101
+
102
+ HTTP Basic autentizace nepotřebuje další konfiguraci; popis pouze oznamuje
103
+ její dostupnost.
104
+
105
+ "basic": {}
106
+
107
+ HTTP Basic autentizace nepodporuje vícefaktorovou autentizaci.
108
+
109
+ <h3 id="token-authentication">Autentizace tokenem</h3>
110
+
111
+ Autentizace tokenem obsahuje zdroj ``token``, který slouží k získávání a rušení tokenů.
112
+
113
+ Tokeny se získávají akcí ``request``, ve které klient předá přihlašovací údaje
114
+ podle požadavků API. Pokud jsou správné, server buď autentizaci dokončí, nebo
115
+ vyžádá další autentizační kroky.
116
+
117
+ Při jednokrokové autentizaci vrátí akce ``request`` token a dobu jeho platnosti.
118
+ Pokud jsou potřeba další kroky, server to oznámí hodnotou ``complete = true``.
119
+ Klient pak musí zavolat další krok, tedy akci na zdroji ``token`` uvedenou
120
+ v ``next_action``.
121
+
122
+ Token se vrací v obou případech. Po dokončení autentizace slouží k ověřování
123
+ dalších požadavků. Pokud autentizace pokračuje, slouží k ověření následujícího
124
+ autentizačního požadavku, který vrátí další token.
125
+
126
+ Po dokončení autentizace lze získané tokeny obnovovat akcí ``renew`` a rušit
127
+ akcí ``revoke``.
128
+
129
+ "token": {
130
+ "http_header": "<name of HTTP header to transfer token in, by default X-HaveAPI-Auth-Token>",
131
+ "query_parameter": "<name of query parameter for token, by default auth_token>",
132
+ "resources": {
133
+ "actions": {
134
+ "request": {
135
+ ...
136
+ "input": {
137
+ ...
138
+ "parameters": {
139
+ "user": ...
140
+ "password": ...
141
+ "lifetime": ...
142
+ "interval": ...
143
+ },
144
+ ...
145
+ },
146
+ "output": {
147
+ ...
148
+ "parameters": {
149
+ "token": ...
150
+ "valid_to": ...
151
+ "complete": true/false
152
+ "next_action": ...
153
+ },
154
+ ...
155
+ },
156
+ ...
157
+ }
158
+ "revoke": ...
159
+ }
160
+ }
161
+ }
162
+
163
+ Formát části ``resources`` je stejný jako u ostatních zdrojů.
164
+
165
+ <h2 id="resources">Zdroje</h2>
166
+
167
+ Každý zdroj je popsán takto:
168
+
169
+ "<resource_name>": {
170
+ "description": "Some description that explains everything",
171
+ "actions": {
172
+ ... actions ...
173
+ },
174
+ "resources": {
175
+ ... nested resources ...
176
+ }
177
+ }
178
+
179
+ <h2 id="actions">Akce</h2>
180
+
181
+ Každá akce je popsána takto:
182
+
183
+ "<action_name>": {
184
+ "auth": true|false,
185
+ "description": "Describe what this action does",
186
+ "aliases": ["list", "of", "aliases"],
187
+ "blocking": true|false,
188
+ "input": {
189
+ "layout": "layout type",
190
+ "namespace": "namespace name",
191
+ "parameters": {
192
+ ... parameters ...
193
+ }
194
+ },
195
+ "output": {
196
+ "layout": "layout type",
197
+ "namespace": "namespace name",
198
+ "parameters": {
199
+ ... parameters ...
200
+ }
201
+ },
202
+ "examples": [
203
+ ... list of examples ...
204
+ ],
205
+ "meta": ... metadata ...,
206
+ "path": "Path for this action",
207
+ "method": "HTTP method to be used",
208
+ "help": "Path to get this very description of the action"
209
+ }
210
+
211
+ <h3 id="layouts">Rozložení</h3>
212
+
213
+ Rozložení je určeno pro vstupní a výstupní parametry. Klienti podle něj vědí,
214
+ jak odeslat požadavek a jak interpretovat odpověď.
215
+
216
+ Definovaná rozložení:
217
+
218
+ - object – zejména odpověď se má zpracovat jako instance zdroje
219
+ - object_list – seznam objektů
220
+ - hash – hash parametrů, se kterým se má pracovat jako s hashem
221
+ - hash_list – seznam hashů
222
+
223
+ V klientských knihovnách výstup s rozložením ``object`` obvykle vrací objekt
224
+ představující instanci zdroje. Parametry jsou dostupné jako vlastnosti objektu
225
+ nebo obdobným způsobem.
226
+
227
+ <h3 id="namespace">Jmenný prostor</h3>
228
+
229
+ Všechny vstupní a výstupní parametry patří do jmenného prostoru, kterým je
230
+ obvykle název zdroje.
231
+
232
+ Například:
233
+
234
+ {
235
+ "user": {
236
+ ... parameters ...
237
+ }
238
+ }
239
+
240
+ <h2 id="parameters">Parametry</h2>
241
+
242
+ Existují dva druhy parametrů.
243
+
244
+ <h3 id="data-types">Datové typy</h3>
245
+
246
+ Typ může být jeden z následujících:
247
+
248
+ - String
249
+ - Text
250
+ - Boolean
251
+ - Integer
252
+ - Float
253
+ - Datetime
254
+
255
+ <h4 id="typed-input-coercion-and-validation">Převod a validace typovaných vstupů</h4>
256
+
257
+ Servery i klienti MUSÍ typované vstupní parametry přísně validovat. Parametry
258
+ query stringu přicházejí jako řetězce a před validací se musí zpracovat.
259
+ Jednotná pravidla a příklady uvádí [Validace typovaných vstupů](typed-input-validation.md).
260
+ Explicitní `null` je povolené pouze u parametrů označených jako `nullable`
261
+ (obvykle nepovinných) a klienti ho MUSÍ zachovat a odeslat jako JSON `null`.
262
+ Server tak rozliší vynechanou hodnotu od výslovně vymazané. V query stringu
263
+ se explicitní `null` zapisuje jako prázdný řetězec. Server považuje prázdný
264
+ řetězec nebo bílé znaky za `null` pouze u typovaných parametrů s `nullable`.
265
+ U ostatních parametrů se prázdné řetězce validují běžným způsobem:
266
+ String/Text je mohou přijmout, ostatní typy je odmítají.
267
+
268
+ Příklad (query string, nepovinný typovaný parametr nastavený na `null`):
269
+
270
+ GET /resource/action?resource[dt]=
271
+
272
+ "<parameter_name>": {
273
+ "required": true/false/null,
274
+ "nullable": true/false,
275
+ "label": "Label for this parameter",
276
+ "description": "Describe it's meaning",
277
+ "type": "<one of the data types>",
278
+ "validators": ... validators ...,
279
+ "default": "default value that is used if the parameter is omitted",
280
+ "protected": true/false
281
+ }
282
+
283
+
284
+ <h4 id="validators">Validátory</h4>
285
+
286
+ Každý parametr má vlastní validátory. Může obsahovat kterýkoli z následujících.
287
+ Aby byla vstupní hodnota platná, musí projít všemi svými validátory.
288
+
289
+ <h5 id="acceptance">Předepsaná hodnota</h5>
290
+
291
+ Používá se, když parametr musí mít jednu konkrétní hodnotu.
292
+
293
+ "accept": {
294
+ "value": <value to accept>,
295
+ "message": "has to be <value>"
296
+ }
297
+
298
+ <h5 id="presence">Přítomnost</h5>
299
+
300
+ Parametr musí být přítomný. Pokud je `empty` nastaveno na `false`, před
301
+ kontrolou se odstraní bílé znaky na začátku a na konci hodnoty.
302
+
303
+ "present": {
304
+ empty: true/false,
305
+ message: "must be present"
306
+ }
307
+
308
+ <h5 id="confirmation">Potvrzení</h5>
309
+
310
+ Ověřuje, zda mají dva parametry stejnou, nebo naopak rozdílnou hodnotu.
311
+ První možnost se hodí například pro ověření shody hesel, druhá pro zadání
312
+ dvou různých e-mailových adres.
313
+
314
+ "confirm": {
315
+ "equal": true/false,
316
+ "parameter": <parameter_name>,
317
+ "message": "must (or must not) be the same as <parameter_name>"
318
+ }
319
+
320
+ <h5 id="inclusion">Povolené hodnoty</h5>
321
+
322
+ Parametr může obsahovat pouze jednu z uvedených hodnot.
323
+
324
+ "include": {
325
+ "values": ["list", "of", "allowed", "values"],
326
+ "message": "%{value} cannot be used"
327
+ }
328
+
329
+ Pokud je `values` seznam, obsahuje povolené hodnoty.
330
+ Pokud je `values` hash, povolené hodnoty jsou jeho klíče a hodnoty hashe
331
+ se mají zobrazovat v uživatelském rozhraní.
332
+
333
+ "include": {
334
+ "values": {
335
+ "one": "Fancy one",
336
+ "two": "Fancy two"
337
+ },
338
+ "message": "%{value} cannot be used"
339
+ }
340
+
341
+ <h5 id="exclusion">Zakázané hodnoty</h5>
342
+
343
+ Parametr může mít libovolnou hodnotu kromě těch, které jsou zde uvedeny.
344
+
345
+ "exclude": {
346
+ "values": ["list", "of", "excluded", "values"],
347
+ "message": "%{value} cannot be used"
348
+ }
349
+
350
+ <h5 id="specific-format">Konkrétní formát</h5>
351
+
352
+ Pokud je `match` nastaveno na true, parametr musí odpovídat zadanému
353
+ regulárnímu výrazu. V opačném případě mu odpovídat nesmí.
354
+
355
+ "format": {
356
+ "rx": "regular expression",
357
+ "match": true/false,
358
+ "description": "human-readable description of the regular expression",
359
+ "message": "%{value} is not in a valid format"
360
+ }
361
+
362
+ <h5 id="length">Délka</h5>
363
+
364
+ Používá se pouze pro parametry `String` a `Text`. Ověřuje délku řetězce.
365
+ Může kontrolovat:
366
+
367
+ - minimum,
368
+ - maximum,
369
+ - minimum i maximum,
370
+ - přesnou délku.
371
+
372
+ Validátor délky tedy musí obsahovat jednu nebo více kontrol, ale nesmí
373
+ současně určovat minimum/maximum a přesnou délku.
374
+
375
+ Rozsah délek:
376
+
377
+ "length": {
378
+ "min": 0,
379
+ "max": 99,
380
+ "message": "length has to be in range <0,99>"
381
+ }
382
+
383
+ Přesná délka:
384
+
385
+ "length": {
386
+ "equals": 10,
387
+ "message": "length has to be 10"
388
+ }
389
+
390
+ <h5 id="numericality">Číselná hodnota</h5>
391
+
392
+ Parametr musí být číslo, tedy `Integer`, `Float` nebo `String` obsahující
393
+ pouze číslice. Validátor může kontrolovat číselný rozsah a určit krok.
394
+ Může obsahovat jednu nebo více těchto podmínek.
395
+
396
+ "number": {
397
+ "min": 0,
398
+ "max": 99,
399
+ "step": 3,
400
+ "mod": 3,
401
+ "even": true/false,
402
+ "odd": true/false
403
+ }
404
+
405
+ <h5 id="custom-validation">Vlastní validace</h5>
406
+
407
+ Vlastní validaci nelze popsat prostředky API. Vývojář může, ale nemusí
408
+ uvést, že probíhá další nepopsaná validace. Dokumentace obsahuje pouze
409
+ její textový popis, který lze zobrazit uživateli. Validace se nevyhodnocuje
410
+ na klientovi, pouze na serveru.
411
+
412
+ "custom": "description of custom validation"
413
+
414
+ <h3 id="resource-association">Vazba na zdroj</h3>
415
+
416
+ Používá se pro vazby mezi zdroji, například mezi autem a kolem.
417
+
418
+ "<parameter_name>": {
419
+ "required": true/false/null,
420
+ "nullable": true/false,
421
+ "label": "Label for this parameter",
422
+ "description": "Describe it's meaning",
423
+ "type": "Resource",
424
+ "resource": ["path", "to", "resource"],
425
+ "value_id": "<name of a parameter that is used as an id>",
426
+ "value_label": "<name of a parameter that is used as a value>",
427
+ "value": {
428
+ "path": "Path to 'show' action of associated resource",
429
+ "method": "HTTP method to use",
430
+ "help": "Path to get the associated resource's 'show' description"
431
+ },
432
+ "choices": {
433
+ "path": "Path to action that returns a list of possible associations",
434
+ "method": "HTTP method to use",
435
+ "help": "Path to description of the list action"
436
+ }
437
+ }
438
+
439
+ Typ _resource_ má také odlišný výstup v odpovědi akce. Vrací hash s ID
440
+ souvisejícího zdroje a jeho popiskem, aby klient mohl zobrazit srozumitelný
441
+ popisek místo samotného ID.
442
+
443
+ U vstupních parametrů typu `Resource` se prázdný řetězec nebo bílé znaky
444
+ považují za `null`/vynechanou hodnotu pouze tehdy, pokud má parametr
445
+ `nullable`. Povinné parametry zdrojů je nadále odmítají.
446
+
447
+ "<parameter_name>": {
448
+ "<value of value_id from description>": <resource id>,
449
+ "<value of value_label from description>": "<label>"
450
+ }
451
+
452
+ <h2 id="examples">Příklady</h2>
453
+
454
+ Příklady jsou popsány obecně, aby je každý klient mohl vykreslit podle
455
+ syntaxe svého jazyka.
456
+
457
+ {
458
+ "title": "A title",
459
+ "path_params: [ ... array of integers ... ],
460
+ "request": {
461
+ ... a hash of request parameters ...
462
+ },
463
+ "response": {
464
+ ... a hash of response parameters ...
465
+ },
466
+ "status": true/false,
467
+ "message": "Message explaining an error if it occurs",
468
+ "errors": {
469
+ "<parameter>": [ ... array of errors ... ],
470
+ },
471
+ http_status: 200,
472
+ "comment": "Description of the example"
473
+ }
474
+
475
+ <h2 id="metadata">Metadata</h2>
476
+
477
+ Metadata mohou být globální nebo přiřazená k jednotlivým objektům.
478
+ Globální metadata se posílají jednou pro každou odpověď. Objektová metadata
479
+ se posílají s každým objektem, který je součástí odpovědi.
480
+
481
+ {
482
+ "global": {
483
+ "input": ... parameters or null ...,
484
+ "output: ... parameters or null ...
485
+ } or null,
486
+
487
+ "object": {
488
+ "input": ... parameters or null ...,
489
+ "output: ... parameters or null ...
490
+ } or null,
491
+ }
492
+
493
+ Objektová metadata mohou obsahovat `path_params`, pole parametrů URL,
494
+ které klient může použít při přípravě akcí nad vráceným objektem. Pole je
495
+ nepovinné. Server ho může vynechat, pokud odpověď neposkytuje identifikátory
496
+ potřebné k sestavení těchto parametrů URL.
497
+
498
+ <h2 id="blocking-mode">Blokující režim</h2>
499
+
500
+ Blokující režim slouží pro akce, jejichž provedení trvá delší dobu. Klienti
501
+ mohou sledovat jejich průběh a také je zrušit.
502
+
503
+ Blokující akce vrátí výsledek obvyklým způsobem a navíc poskytne jedinečný
504
+ identifikátor. Pomocí něj může klient kontrolovat stav přes zdroj `ActionState`.
505
+ Identifikátor stavu se předává v globálních výstupních metadatech v parametru
506
+ `action_state_id`. Zdroj `ActionState` je součástí dokumentace API a tvoří
507
+ standardní rozhraní pro prohlížení a správu právě aktivních blokujících akcí.
508
+
509
+ Akce je blokující, pokud má v popisu `blocking` nastavené na `true`
510
+ a po každém volání obsahuje v metadatech `action_state_id`. Akce tak mohou
511
+ používat blokující režim pouze tehdy, když je potřeba.
512
+
513
+ <h2 id="list-api-versions">Seznam verzí API</h2>
514
+
515
+ Pošli požadavek ``OPTIONS /?describe=versions``. Formát popisu:
516
+
517
+ {
518
+ "versions": [1, 2, 3, ... list of versions],
519
+ "default": <which version is default>
520
+ }
521
+
522
+ <h2 id="describe-default-version">Popis výchozí verze</h2>
523
+
524
+ Požadavkem ``OPTIONS /?describe=default`` získáš popis výchozí verze.
525
+
526
+ <h2 id="describe-the-whole-api">Popis celého API</h2>
527
+
528
+ Popis všech verzí je možné získat najednou.
529
+
530
+ Pošli požadavek ``OPTIONS /``. Formát popisu:
531
+
532
+ {
533
+ "default_version": <which version is default>,
534
+ "versions": {
535
+ "default": ... full version self-description ...,
536
+ "<version>": ... full version self-description,
537
+ ... all other versions ...
538
+ }
539
+ }
540
+
541
+ <h1 id="authorization">Autorizace</h1>
542
+
543
+ Akce mohou vyžadovat různé úrovně oprávnění. HaveAPI poskytuje prostředky
544
+ pro autorizaci, ale ta není součástí popisu API.
545
+
546
+ Pokud je uživatel při požadavku na popis API přihlášený, vrátí se pouze
547
+ zdroje, akce a parametry, ke kterým má přístup.
548
+
549
+ <h1 id="input-output-formats">Vstupní a výstupní formáty</h1>
550
+
551
+ Jediným podporovaným vstupním formátem je JSON.
552
+
553
+ Výstupní formát si může zvolit klient, ale vestavěná je pouze podpora JSON.
554
+ Formát se vybírá HTTP hlavičkou ``Accept``.
555
+
556
+ <h1 id="request">Požadavek</h1>
557
+
558
+ Cestu k akci a HTTP metodu zjistí klient z popisu API.
559
+
560
+ Příklad požadavku:
561
+
562
+ POST /users HTTP/1.1
563
+ Content-Type: application/json
564
+ Accept: application/json
565
+ Connection: Close
566
+
567
+ {
568
+ "user": {
569
+ "login": "mylogin",
570
+ "name": "Very Name",
571
+ "role": "admin"
572
+ }
573
+ }
574
+
575
+ <h1 id="response">Odpověď</h1>
576
+
577
+ Klienti interpretují odpověď podle rozložení, které zjistí z popisu API.
578
+
579
+ Příklad odpovědi na předchozí požadavek:
580
+
581
+ Content-Type: application/json
582
+
583
+ {
584
+ "status": true,
585
+ "response": {
586
+ "user": {
587
+ "id": 1,
588
+ "login": "mylogin",
589
+ "name": "Very Name",
590
+ "role": "admin"
591
+ }
592
+ },
593
+ "message": null,
594
+ "errors: null
595
+ }