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.
- checksums.yaml +4 -4
- data/.gitignore +3 -8
- data/README.md +3 -422
- data/Rakefile +17 -7
- data/benchmarks/performance_compare.rb +27 -6
- data/doc/cs/client-examples.md +535 -0
- data/doc/cs/create-client.md +118 -0
- data/doc/cs/json-schema.html +1182 -0
- data/doc/cs/protocol.md +595 -0
- data/doc/cs/readme.md +432 -0
- data/doc/cs/typed-input-validation.md +122 -0
- data/doc/{client-examples.md → en/client-examples.md} +20 -10
- data/doc/{documentation-ui.md → en/documentation-ui.md} +42 -6
- data/doc/{performance.md → en/performance.md} +11 -0
- data/doc/{protocol.md → en/protocol.md} +2 -2
- data/doc/en/readme.md +423 -0
- data/haveapi.gemspec +2 -2
- data/lib/haveapi/client_example.rb +18 -5
- data/lib/haveapi/client_examples/curl.rb +5 -5
- data/lib/haveapi/client_examples/dynamic_helpers.rb +10 -10
- data/lib/haveapi/client_examples/go_client.rb +1 -1
- data/lib/haveapi/client_examples/http.rb +4 -4
- data/lib/haveapi/client_examples/js_client.rb +10 -10
- data/lib/haveapi/client_examples/php_client.rb +24 -25
- data/lib/haveapi/client_examples/python_client.rb +11 -11
- data/lib/haveapi/client_examples/ruby_cli.rb +6 -9
- data/lib/haveapi/client_examples/ruby_client.rb +24 -16
- data/lib/haveapi/client_examples/rust_client.rb +1 -1
- data/lib/haveapi/client_examples/ts_generated_client.rb +1 -1
- data/lib/haveapi/documentation_context.rb +14 -2
- data/lib/haveapi/documentation_helpers.rb +92 -15
- data/lib/haveapi/documentation_locale.rb +65 -0
- data/lib/haveapi/documentation_oauth.rb +12 -12
- data/lib/haveapi/documentation_search.rb +5 -5
- data/lib/haveapi/documentation_validators.rb +43 -33
- data/lib/haveapi/locales/cs.yml +468 -0
- data/lib/haveapi/locales/en.yml +467 -0
- data/lib/haveapi/public/css/documentation.css +8 -4
- data/lib/haveapi/public/js/documentation.js +73 -20
- data/lib/haveapi/server.rb +32 -47
- data/lib/haveapi/shared_documentation_helpers.rb +53 -5
- data/lib/haveapi/version.rb +1 -1
- data/lib/haveapi/views/doc_layout.erb +3 -2
- data/lib/haveapi/views/doc_sidebars/create-client.erb +10 -10
- data/lib/haveapi/views/doc_sidebars/json-schema.erb +2 -2
- data/lib/haveapi/views/doc_sidebars/protocol.erb +24 -24
- data/lib/haveapi/views/documentation/search_form.erb +5 -4
- data/lib/haveapi/views/documentation/search_results.erb +6 -6
- data/lib/haveapi/views/index.erb +3 -3
- data/lib/haveapi/views/main_layout.erb +4 -4
- data/lib/haveapi/views/shared_documentation.erb +8 -5
- data/lib/haveapi/views/shared_sidebar.erb +11 -11
- data/lib/haveapi/views/version_page/auth_body.erb +7 -7
- data/lib/haveapi/views/version_page/client_auth.erb +1 -1
- data/lib/haveapi/views/version_page/client_example.erb +1 -1
- data/lib/haveapi/views/version_page/client_init.erb +1 -1
- data/lib/haveapi/views/version_page/client_overview.erb +7 -5
- data/lib/haveapi/views/version_page/example_panels.erb +5 -2
- data/lib/haveapi/views/version_page/resource_body.erb +24 -24
- data/lib/haveapi/views/version_page/resource_directory.erb +2 -2
- data/lib/haveapi/views/version_page/usage.erb +5 -5
- data/lib/haveapi/views/version_page.erb +11 -11
- data/lib/haveapi/views/version_sidebar/auth_nav.erb +2 -2
- data/lib/haveapi/views/version_sidebar/authentication_control.erb +8 -8
- data/lib/haveapi/views/version_sidebar/authentication_status.erb +1 -1
- data/lib/haveapi/views/version_sidebar/brand.erb +16 -5
- data/lib/haveapi/views/version_sidebar.erb +33 -18
- data/spec/client_examples/assets/documentation_test.cjs +107 -9
- data/spec/client_examples/comment_capture.rb +72 -0
- data/spec/client_examples/comments_spec.rb +162 -0
- data/spec/client_examples/context_spec.rb +18 -2
- data/spec/client_examples/detail_spec.rb +68 -0
- data/spec/documentation/client_overview_spec.rb +60 -0
- data/spec/documentation/example_selection_spec.rb +192 -0
- data/spec/documentation/language_settings_spec.rb +132 -0
- data/spec/documentation/locale_spec.rb +367 -0
- data/spec/documentation/navigation_spec.rb +61 -3
- data/spec/documentation/oauth_spec.rb +42 -0
- data/spec/documentation/search_index_routes_spec.rb +8 -4
- data/spec/documentation/search_spec.rb +1 -1
- data/spec/documentation/shared_pages_spec.rb +63 -2
- data/spec/documentation/validators_spec.rb +25 -0
- data/spec/extensions/exception_mailer_spec.rb +2 -2
- data/spec/packaging_spec.rb +68 -9
- data/spec/performance/event_baseline_spec.rb +1 -1
- data/spec/performance/source_versions_spec.rb +111 -2
- metadata +24 -11
- /data/doc/{create-client.md → en/create-client.md} +0 -0
- /data/doc/{documentation-oauth.md → en/documentation-oauth.md} +0 -0
- /data/doc/{json-schema.html → en/json-schema.html} +0 -0
- /data/doc/{typed-input-validation.md → en/typed-input-validation.md} +0 -0
data/doc/cs/protocol.md
ADDED
|
@@ -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
|
+
}
|