haveapi 0.22.0 → 0.22.1

Sign up to get free protection for your applications and to get access to all the features.
data/doc/protocol.md DELETED
@@ -1,535 +0,0 @@
1
- # Protocol definition
2
- HaveAPI defines the format for the self-description and URLs where the self-description
3
- can be found.
4
-
5
- # Self-description
6
- The API is self-describing. It documents itself. Clients use the self-description
7
- to work with the API. The Self-description contains access URLs, HTTP methods,
8
- input and output parameters and their validators.
9
- A part of description is also an example usage and text notes.
10
-
11
- The API responds to ``OPTIONS /``, which returns description of whole
12
- API, containing all its versions. To get description only of selected version,
13
- use e.g. ``OPTIONS /v1/``.
14
-
15
- Every action also responds to HTTP method ``OPTIONS``,
16
- with which you can get description for selected action. To distinguish actions with
17
- the same URL, use parameter ``?method=HTTP_METHOD``.
18
-
19
- Thanks to this ability, API changes immediately reflects in all clients without
20
- changing a single line of code. A client can also be used on all APIs with compatible
21
- self-describing format, without any changes at all.
22
-
23
- # Protocol versioning
24
- Protocol version defines the form and contents of
25
-
26
- - the envelope,
27
- - API description,
28
- - data transfers.
29
-
30
- Protocol version is in the form `<major>.<minor>`. `major` is incremented
31
- whenever a change is made to the protocol that breaks backward compatibility.
32
- When backward compatibility is kept and only some new features are added to the
33
- protocol, `major` stays and `minor` is incremented.
34
-
35
- # Envelope
36
- In addition to output format specified below, every API response
37
- is wrapped in an envelope.
38
- The envelope reports if action succeeded or failed, provides return value or error
39
- messages.
40
-
41
- {
42
- "status": true if action succeeded or false if error occured,
43
- "response": return value,
44
- "message": error message, if status is false,
45
- "errors: {
46
- "parameter1": ["list", "of", "errors"],
47
- "parameter2": ["and", "so", "on"]
48
- }
49
- }
50
-
51
- Responses for `OPTIONS` requests also send a protocol version in the envelope:
52
-
53
- "version": <version>
54
-
55
- # Description format
56
- In this document, the self-description is encoded in JSON. However, it can
57
- be encoded in any of the supported output formats.
58
-
59
- ## API version
60
-
61
- <a href="/doc/protocol.png">
62
- <img src="/doc/protocol.png"
63
- alt="Diagram representing the structure of an API version"
64
- width="600">
65
- </a>
66
-
67
- API version is described as:
68
-
69
- {
70
- "authentication": {
71
- ... authentication methods ...
72
- },
73
- "resources": {
74
- ... resources ...
75
- },
76
- "meta": {
77
- "namespace": "_meta"
78
- },
79
- "help": "/<version>/"
80
- }
81
-
82
- See appropriate section for detailed description of each section.
83
-
84
- ## Authentication
85
- HaveAPI defines an interface for implementing custom authentication methods.
86
- HTTP basic and token authentication is built-in.
87
-
88
- Authentication methods can be set per API version. They are a part of
89
- the self-description, but must be understood by the client.
90
- The client can choose whichever available authentication method he prefers.
91
-
92
- ### HTTP basic authentication
93
- HTTP basic authentication needs no other configuration, only informs about its presence.
94
-
95
- "basic": {}
96
-
97
- HTTP basic authentication does not support multi-factor authentication.
98
-
99
- ### Token authentication
100
- Token authentication contains resource ``token``, that is used to acquire
101
- and revoke tokens.
102
-
103
- Tokens are acquired by action ``request``, in which the client provides arbitrary
104
- login credentials. If the login credentials match, the server either concludes
105
- the authentication process, or multiple authentication steps may be necessary.
106
-
107
- For single-step authentication processses, action ``request`` returns the
108
- token and its validity period. If multiple authentication steps are necessary,
109
- the server signals this by returning ``complete = true``. The client then has
110
- to call the next authentication step, which is an action on the ``token``
111
- resource, as returned in ``next_action``.
112
-
113
- Tokens are returned in both cases. If the authentication is finished, the token
114
- is then used for authenticating further requests. If the authentication continues,
115
- the token is used to authenticate the next authentication request, which then
116
- returns another token.
117
-
118
- After the authentication is complete, acquired tokens can be renewed using action
119
- ``renew`` and revoked by calling the ``revoke`` action.
120
-
121
- "token": {
122
- "http_header": "<name of HTTP header to transfer token in, by default X-HaveAPI-Auth-Token>",
123
- "query_parameter": "<name of query parameter for token, by default auth_token>",
124
- "resources": {
125
- "actions": {
126
- "request": {
127
- ...
128
- "input": {
129
- ...
130
- "parameters": {
131
- "user": ...
132
- "password": ...
133
- "lifetime": ...
134
- "interval": ...
135
- },
136
- ...
137
- },
138
- "output": {
139
- ...
140
- "parameters": {
141
- "token": ...
142
- "valid_to": ...
143
- "complete": true/false
144
- "next_action": ...
145
- },
146
- ...
147
- },
148
- ...
149
- }
150
- "revoke": ...
151
- }
152
- }
153
- }
154
-
155
- The format for ``resources`` section is the same as for any other resource.
156
-
157
- ## Resources
158
- Each resource is described as:
159
-
160
- "<resource_name>": {
161
- "description": "Some description that explains everything",
162
- "actions": {
163
- ... actions ...
164
- },
165
- "resources": {
166
- ... nested resources ...
167
- }
168
- }
169
-
170
- ## Actions
171
- Every action is described as:
172
-
173
- "<action_name>": {
174
- "auth": true|false,
175
- "description": "Describe what this action does",
176
- "aliases": ["list", "of", "aliases"],
177
- "blocking": true|false,
178
- "input": {
179
- "layout": "layout type",
180
- "namespace": "namespace name",
181
- "parameters": {
182
- ... parameters ...
183
- }
184
- },
185
- "output": {
186
- "layout": "layout type",
187
- "namespace": "namespace name",
188
- "parameters": {
189
- ... parameters ...
190
- }
191
- },
192
- "examples": [
193
- ... list of examples ...
194
- ],
195
- "meta": ... metadata ...,
196
- "path": "URL for this action",
197
- "method": "HTTP method to be used",
198
- "help": "URL to get this very description of the action"
199
- }
200
-
201
- ### Layouts
202
- Layout type is specified for input/output parameters. Thanks to the layout type,
203
- clients know how to send the request and how to interpret the response.
204
-
205
- Defined layout types:
206
-
207
- - object - mainly the response is to be treated as an instance of a resource
208
- - object_list - list of objects
209
- - hash - simply a hash of parameters, it is to be treated as such
210
- - hash_list - list of hashes
211
-
212
- In client libraries, the ``object`` layout output usually results in returning
213
- an object that represents the instance of the resource. The parameters are defined
214
- as object properties and the like.
215
-
216
- ### Namespace
217
- All input/output parameters are put in a namespace, which is usually
218
- the name of the resource.
219
-
220
- For example:
221
-
222
- {
223
- "user": {
224
- ... parameters ...
225
- }
226
- }
227
-
228
- ## Parameters
229
- There are two parameter types.
230
-
231
- ### Data types
232
- The type can be one of:
233
-
234
- - String
235
- - Text
236
- - Boolean
237
- - Integer
238
- - Float
239
- - Datetime
240
-
241
- "<parameter_name>": {
242
- "required": true/false/null,
243
- "label": "Label for this parameter",
244
- "description": "Describe it's meaning",
245
- "type": "<one of the data types>",
246
- "validators": ... validators ...,
247
- "default": "default value that is used if the parameter is omitted",
248
- "protected": true/false
249
- }
250
-
251
-
252
- #### Validators
253
- Every parameter has its own validators. Any of the following validators
254
- may be present. Input value must pass through all validators in order
255
- to be considered valid.
256
-
257
- ##### Acceptance
258
- Used when a parameter must have one specific value.
259
-
260
- "accept": {
261
- "value": <value to accept>,
262
- "message": "has to be <value>"
263
- }
264
-
265
- ##### Presence
266
- The parameter must be present. If `empty` is `false`, leading and trailing
267
- whitespace is stripped before the check.
268
-
269
- "present": {
270
- empty: true/false,
271
- message: "must be present"
272
- }
273
-
274
- ##### Confirmation
275
- Used to confirm that two parameters have either the same value or not have the
276
- same value. The former can be used e.g. to verify that passwords are same
277
- and the latter to give two different e-mail addresses.
278
-
279
- "confirm": {
280
- "equal": true/false,
281
- "parameter": <parameter_name>,
282
- "message": "must (or must not) be the same as <parameter_name>"
283
- }
284
-
285
- ##### Inclusion
286
- The parameter can contain only one of given options.
287
-
288
- "include": {
289
- "values": ["list", "of", "allowed", "values"],
290
- "message": "%{value} cannot be used"
291
- }
292
-
293
- If the `values` are a list, than it is a list of accepted values.
294
- If the `values` are a hash, the keys of that hash are accepted values,
295
- values in that hash are to be shown in UI.
296
-
297
- "include": {
298
- "values": {
299
- "one": "Fancy one",
300
- "two": "Fancy two"
301
- },
302
- "message": "%{value} cannot be used"
303
- }
304
-
305
- ##### Exclusion
306
- The parameter can be set to anything except values listed here.
307
-
308
- "exclude": {
309
- "values": ["list", "of", "excluded", "values"],
310
- "message": "%{value} cannot be used"
311
- }
312
-
313
- ##### Specific format
314
- If `match` is true, the parameter must pass given regular expression.
315
- Otherwise it must not pass the regular expression.
316
-
317
- "format": {
318
- "rx": "regular expression",
319
- "match": true/false,
320
- "description": "human-readable description of the regular expression",
321
- "message": "%{value} is not in a valid format"
322
- }
323
-
324
- ##### Length
325
- Useful only for `String` and `Text` parameters. Checks the length of given string.
326
- It may check either
327
-
328
- - minimum
329
- - maximum
330
- - minimum and maximum
331
- - constant length
332
-
333
- The length validator must therefore contain one or more checks, but cannot
334
- contain both min/max and equality.
335
-
336
- Length range:
337
-
338
- "length": {
339
- "min": 0,
340
- "max": 99,
341
- "message": "length has to be in range <0,99>"
342
- }
343
-
344
- Constant length:
345
-
346
- "length": {
347
- "equals": 10,
348
- "message": "length has to be 10"
349
- }
350
-
351
- ##### Numericality
352
- Numericality implies that the parameter must be a number, i.e. `Integer`, `Float`
353
- or `String` containing only digits. It can check that the number is in a specified
354
- range and can provide a step. The validator can contain one or more of these conditions.
355
-
356
- "number": {
357
- "min": 0,
358
- "max": 99,
359
- "step": 3,
360
- "mod": 3,
361
- "even": true/false,
362
- "odd": true/false
363
- }
364
-
365
- ##### Custom validation
366
- Custom validation cannot be documented by the API. The developer may or may not
367
- provide information that some non-documented validation takes place. The documentation
368
- contains only the description of the validations that may be shown to the user,
369
- but is not evaluated client-side, only server-side.
370
-
371
- "custom": "description of custom validation"
372
-
373
- ### Resource association
374
- This is used for associations between resources, e.g. car has a wheel.
375
-
376
- "<parameter_name>": {
377
- "required": true/false/null,
378
- "label": "Label for this parameter",
379
- "description": "Describe it's meaning",
380
- "type": "Resource",
381
- "resource": ["path", "to", "resource"],
382
- "value_id": "<name of a parameter that is used as an id>",
383
- "value_label": "<name of a parameter that is used as a value>",
384
- "value": {
385
- "path": "URL to 'show' action of associated resource",
386
- "method": "HTTP method to use",
387
- "help": "URL to get the associated resource's 'show' description"
388
- },
389
- "choices": {
390
- "path": "URL to action that returns a list of possible associations",
391
- "method": "HTTP method to use",
392
- "help": "URL to description of the list action"
393
- }
394
- }
395
-
396
- The _resource_ type also has a different output in action response. It returns
397
- a hash containing associated resource ID and its label, so that clients
398
- can show the human-friendly label instead of just an ID.
399
-
400
- "<parameter_name>": {
401
- "<value of value_id from description>": <resource id>,
402
- "<value of value_label from description>": "<label>"
403
- }
404
-
405
- ## Examples
406
- Examples are described in a generic way, so that every client can
407
- render them according to its syntax.
408
-
409
- {
410
- "title": "A title",
411
- "path_params: [ ... array of integers ... ],
412
- "request": {
413
- ... a hash of request parameters ...
414
- },
415
- "response": {
416
- ... a hash of response parameters ...
417
- },
418
- "status": true/false,
419
- "message": "Message explaining an error if it occurs",
420
- "errors": {
421
- "<parameter>": [ ... array of errors ... ],
422
- },
423
- http_status: 200,
424
- "comment": "Description of the example"
425
- }
426
-
427
- ## Metadata
428
- Metadata can be global and per-object. Global metadata are sent once for each
429
- response, where as per-object are sent with each object that is a part of the
430
- response.
431
-
432
- {
433
- "global": {
434
- "input": ... parameters or null ...,
435
- "output: ... parameters or null ...
436
- } or null,
437
-
438
- "object": {
439
- "input": ... parameters or null ...,
440
- "output: ... parameters or null ...
441
- } or null,
442
- }
443
-
444
- ## Blocking mode
445
- Blocking mode is for actions whose execution takes a long time. Clients can monitor
446
- progress of such actions and even cancel their execution.
447
-
448
- The blocking action returns its result as usual, but provides a unique identifier using
449
- which clients can check its status via the `ActionState` resource. The state identifier
450
- is passed through global output metadata in a parameter called `action_state_id`.
451
- Resource `ActionState` is a part of the API's documentation and is the standard interface
452
- for browsing and manipulating currently active blocking actions.
453
-
454
- An action is blocking if parameter `blocking` in its description is `true` and if
455
- `action_state_id` is present in its metadata after each call. This allows actions
456
- to be blocking only when needed.
457
-
458
- ## List API versions
459
- Send request ``OPTIONS /?describe=versions``. The description format:
460
-
461
- {
462
- "versions": [1, 2, 3, ... list of versions],
463
- "default": <which version is default>
464
- }
465
-
466
- ## Describe default version
467
- Send request ``OPTIONS /?describe=default`` the get the description
468
- of the default version.
469
-
470
- ## Describe the whole API
471
- It is possible to get self-description of all versions at once.
472
-
473
- Send request ``OPTIONS /``. The description format:
474
-
475
- {
476
- "default_version": <which version is default>,
477
- "versions": {
478
- "default": ... full version self-description ...,
479
- "<version>": ... full version self-description,
480
- ... all other versions ...
481
- }
482
- }
483
-
484
- # Authorization
485
- Actions may require different levels of authorization. HaveAPI provides means for
486
- implementing authorization, but it is not self-described.
487
-
488
- If the user is authenticated when requesting self-description, only allowed
489
- resources/actions/parameters will be returned.
490
-
491
- # Input/output formats
492
- For now, the only supported input format is JSON.
493
-
494
- Output format can be chosen by a client. However, no other format than JSON is built-in.
495
- The output format can be chosen with HTTP header ``Accept``.
496
-
497
- # Request
498
- Action URL and HTTP method the client learns from the self-description.
499
-
500
- Example request:
501
-
502
- POST /users HTTP/1.1
503
- Content-Type: application/json
504
- Accept: application/json
505
- Connection: Close
506
-
507
- {
508
- "user": {
509
- "login": "mylogin",
510
- "name": "Very Name",
511
- "role": "admin"
512
- }
513
- }
514
-
515
- # Response
516
- Clients know how to interpret the response thanks to the layout type they learn
517
- from the self-description.
518
-
519
- Example response to the request above:
520
-
521
- Content-Type: application/json
522
-
523
- {
524
- "status": true,
525
- "response": {
526
- "user": {
527
- "id": 1,
528
- "login": "mylogin",
529
- "name": "Very Name",
530
- "role": "admin"
531
- }
532
- },
533
- "message": null,
534
- "errors: null
535
- }
data/doc/protocol.png DELETED
Binary file