Config
Expose documents via json rest.
Enable Shard Rest
The rest extenions needs to be configured with an endpoint map. The endpoint map defines which documents will be exposed by the rest controller, and what urls will be used to access them. Eg:
- 'zoop' => [
- 'shard' => [
- 'manifest' => [
- 'default' => [
- 'extension_configs' => [
- 'extension.rest' => [
- 'endpoint_map' => [
- 'users' => [
- 'class' => 'My\Users\Document',
- 'property' => 'username'
- ]
- ]
- ]
- ]
- ]
- ]
- ]
- ]
Embedded Lists
To make embedded lists accessable via rest, configure them like this:
- ...
- 'endpoint_map' => [
- 'users' => [
- 'class' => 'My\Users\Document',
- 'property' => 'username',
- 'embedded_lists' => [
- 'assets' => [
- 'property' => 'name',
- 'class' => 'My\Assets\Document'
- ]
- ]
- ]
- ]
- ...
Customize Route
Shard Module automatically configures the rest controller on the /rest
route. You may wish to override that in your module config.
By default, the config above would expose the user with username toby
at:
- http://myserver.com/rest/users/toby
Access Control
If the Access Control extension is enabled, all permissions will be respected.
Get
Get a single document.
To get a document use:
- http://myserver.com/rest/user/toby
Partial documents
To get only some properties of a document use:
- http://myserver.com/rest/user/toby?select(username,age)
Single nested document
Append the property name:
- http://myserver.com/rest/user/toby/address
Single document from a nested list
To get one item from a list of documents append the property name and the id of the document you want:
- http://myserver.com/rest/user/toby/assets/funky-car
Errors
error | description |
---|---|
404 | If the endpoint requested does not exists, or the document requested cannot be found. |
Get List
Get a list of documents.
An array of documents will be returned when a list is requested, rather than a specific document. A successful response will include a contentRange: x-x/x
header.
- http://myserver.com/rest/user
Partial documents
- http://myserver.com/rest/user?select(username,age)
Filter
- http://myserver.com/rest/user?country=australia
And Filter
- http://myserver.com/rest/user?country=australia&type=active
Or Filter
- http://myserver.com/rest/user?country=[australia, usa]
Sort Ascending
- http://myserver.com/rest/user?sort(+username)
Sort Decending
- http://myserver.com/rest/user?sort(-username)
Multiple Sort
- http://myserver.com/rest/user?sort(+country,+username)
Offset
- HEADERS
- range: items=2-25
- http://myserver.com/rest/user
Nested List
- http://myserver.com/rest/assets
Errors
error | description |
---|---|
404 | If the endpoint requested does not exist. |
416 | Content-Type: application/api-problem+json , Requested range cannot be returned. Occurs if a bad range is requested, eg: Range: 10-5 |
204 | If the requested list is empty. |
Post
Create a document
To create a new document, use a POST request, and place the json document in the request body.
- POST
- HEADERS
- Content-type: application/json
- CONTENT
- {"username": "lucy", "age": 27}
- http://myserver.com/rest/user
Single nested document
- POST
- HEADERS
- Content-type: application/json
- CONTENT
- {"street": "Street Rd", "number": "45", city: "Sydney"}
- http://myserver.com/rest/user/address
Single document from a nested list
- POST
- HEADERS
- Content-type: application/json
- CONTENT
- {"make": "ford", "model": "stumpy"}
- http://myserver.com/rest/user/assets/old-car
Create with reference
Add a reference to an already existing document.
- POST
- HEADERS
- Content-type: application/json
- CONTENT
- {"username": "jsason", "country": {"$ref": "country/australia"}}
- http://myserver.com/rest/user
Errors
error | description |
---|---|
404 | If the endpoint or document requested does not exist. |
500 | Content-Type: application/api-problem+json , Document validation failed. Occurs if the validation extension is turned on, and validation fails. |
500 | Content-Type: application/api-problem+json , Document already exists. Occurs request to create a document with id that already exists. |
Put
Update a document.
Note: PUT will update all properties of a document. If you need to update only some of the properties of a doument, use PATCH.
The response from a successful PUT will always be a 204.
Update a document
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- {"age": "18"}
- http://myserver.com/rest/user/toby
Create via PUT
If the document selected for update does not exist, it will be created.
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- {"age": "27"}
- http://myserver.com/rest/user/lucy
Update single nested document
Append the property name:
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- {"street": "Street Rd", "number": "45", city: "Sydney"}
- http://myserver.com/rest/user/toby/address
Update single document in a nested list
To update one item from a list of documents append the property name and the id of the document you want:
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- {"make": "gm", "model": "camero"}
- http://myserver.com/rest/user/toby/assets/funky-car
Replace a whole list
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- [
- {"username": "gumpy"},
- {"username": "sleepy"}
- {"username": "happy"}
- ]
- http://myserver.com/rest/user
Update document id
A document id can be updated. To do so, include the new document id in the PUT data. Note that this will actually delete the existing document, and create a new document with the new id.
- PUT
- HEADERS
- Content-type: application/json
- CONTENT
- {"username": "toby-different"}
- http://myserver.com/rest/user/toby
Errors
error | description |
---|---|
404 | If the endpoint or document requested does not exist. |
500 | Content-Type: application/api-problem+json , Document validation failed. Occurs if the validation extension is turned on, and validation fails. |
Patch
Patch a document.
Note: PATCH will update a selection of properties on a document.
The response from a successful PATCH will always be a 204.
Patch a document
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- {"age": "18"}
- http://myserver.com/rest/user/toby
Create via PATCH
If the document selected for patch does not exist, it will be created.
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- {"age": "27"}
- http://myserver.com/rest/user/lucy
Patch single nested document
Append the property name:
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- {"street": "Street Rd"}
- http://myserver.com/rest/user/toby/address
Patch single document in a nested list
To patch one item from a list of documents append the property name and the id of the document you want:
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- {"make": "gm", "model": "camero"}
- http://myserver.com/rest/user/toby/assets/funky-car
Patch whole list
Patching a list will add the supplied items to the list, without removing the existing items.
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- [
- {"username": "gumpy"},
- {"username": "sleepy"}
- {"username": "happy"}
- ]
- http://myserver.com/rest/user
Patch document id
A document id can be patched. To do so, include the new document id in the PATCH data. Note that this will actually delete the existing document, and create a new document with the new id.
- PATCH
- HEADERS
- Content-type: application/json
- CONTENT
- {"username": "toby-different"}
- http://myserver.com/rest/user/toby
Errors
error | description |
---|---|
404 | If the endpoint or document requested does not exist. |
500 | Content-Type: application/api-problem+json , Document validation failed. Occurs if the validation extension is turned on, and validation fails. |
Delete
Delete a document.
The response from a successful DELETE will always be a 204.
Delete a document
- DELETE
- HEADERS
- Content-type: application/json
- http://myserver.com/rest/user/toby
Delete a list
- DELETE
- HEADERS
- Content-type: application/json
- http://myserver.com/rest/user
Delete single nested document
Append the property name:
- DELETE
- HEADERS
- Content-type: application/json
- http://myserver.com/rest/user/toby/address
Delete single document in a nested list
To delete one item from a list of documents append the property name and the id of the document you want:
- DELETE
- HEADERS
- Content-type: application/json
- http://myserver.com/rest/user/toby/assets/funky-car
Errors
error | description |
---|---|
404 | If the endpoint or document requested does not exist. |
Batch
Execute multiple requests at once
A batch request is always a POST to the batch
endpoint. The POST content describes the requests which should be executed in order. The response content will describe the result of each request.
For example, this batch request will be the same as executing the nine separate requests in order:
- POST
- HEADERS
- Content-type: application/json
- CONTENT
- {
- "get single author": {
- "uri": "/rest/author/james",
- "method": "GET"
- },
- "get author list": {
- "uri": "/rest/author",
- "method": "GET"
- },
- "get author list of partials": {
- "uri": "/rest/author?select(name)",
- "method": "GET"
- },
- "get filtered author list": {
- "uri": "/rest/author?country=germany",
- "method": "GET"
- },
- "get author list offset": {
- "uri": "/rest/author",
- "method": "GET",
- "headers": {
- "Range": "items=2-100"
- }
- },
- "replace game list": {
- "uri": "/rest/game",
- "method": "POST",
- "content": {"name": "forbidden-island", "type": "co-op"}
- },
- "delete an author": {
- "uri": "/rest/author/harry",
- "method": "DELETE"
- },
- "update a game": {
- "uri": "/rest/game/feed-the-kitty",
- "method": "PUT",
- "content": {"type": "childrens", "author": {"$ref": "author/harry"}}
- },
- "patch a game": {
- "uri": "/rest/game/feed-the-kitty",
- "method": "PATCH",
- "content": {"type": "kids"}
- }
- }
- http://myserver.com/rest/batch
The response object might look like:
- {
- "get single author": {
- "status": 200,
- "content": { ... }
- },
- "get author list": {
- "status": 200,
- "headers": {
- "Content-Range": "x-x/x"
- },
- "content": [ ... ]
- },
- "get author list of partials": {
- "status": 200,
- "headers": {
- "Content-Range": "x-x/x"
- },
- "content": [ ... ]
- },
- "get filtered author list": {
- "status": 200,
- "headers": {
- "Content-Range": "x-x/x"
- },
- "content": [ ... ]
- },
- "get author list offset": {
- "status": 200,
- "headers": {
- "Content-Range": "x-x/x"
- },
- "content": [ ... ]
- },
- "replace game list": {
- "status": 204
- },
- "delete an author": {
- "status": 204
- },
- "update a game": {
- "status": 204
- },
- "patch a game": {
- "status": 204
- }
- }