Content Manipulation
The restapi does not only expose content objects via a RESTful API. The API consumer can create, read, update, and delete a content object. Those operations can be mapped to the HTTP verbs POST
(Create), GET
(Read), PUT
(Update) and DELETE
(Delete).
Manipulating resources across the network by using HTTP as an application protocol is one of core principles of the REST architectural pattern. This allows us to interact with a specific resource in a standardized way:
Verb | URL | Action |
---|---|---|
POST | /folder |
Creates a new document within the folder |
GET | /folder/{document-id} |
Request the current state of the document |
PATCH | /folder/{document-id} |
Update the document details |
DELETE | /folder/{document-id} |
Remove the document |
Creating a Resource with POST
To create a new resource, we send a POST
request to the resource container. If we want to create a new document within an existing folder, we send a POST
request to that folder:
POST /news HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImZ1bGxuYW1lIjoiQWRtaW4iLCJpYXQiOjE2NDkzMTI0NDl9.RS1Ny_r0v7vIylFfK6q0JVJrkiDuTOh9iG9IL8xbzAk
Content-Type: application/json
{
"@type": "Page",
"title": "My News Item",
"description": "News Description"
}
By setting the ‘Accept’ header, we tell the server that we would like to receive the response in the ‘application/json’ representation format.
The ‘Content-Type’ header indicates that the body uses the ‘application/json’ format.
The request body contains the minimal necessary information needed to create a document (the type and the title). You could set other properties, like “description” here as well.
Successful Response (201 Created)
If a resource has been created, the server responds with the 201 Created
status code. The ‘Location’ header contains the URL of the newly created resource and the resource representation in the payload:
HTTP/1.1 201 Created
Content-Type: application/json
{
"title": "My News Item",
"description": "News Description",
"@components": {
"actions": {
"@id": "http://localhost:8080/news/@actions"
},
"breadcrumbs": {
"@id": "http://localhost:8080/news/@breadcrumbs"
},
"catalog": {
"@id": "http://localhost:8080/news/@catalog"
},
"navigation": {
"@id": "http://localhost:8080/news/@navigation"
},
"navroot": {
"@id": "http://localhost:8080/news/@navroot"
},
"translations": {
"@id": "http://localhost:8080/news/@translations"
},
"types": {
"@id": "http://localhost:8080/news/@types"
},
"workflow": {
"@id": "http://localhost:8080/news/@workflow"
}
},
"@id": "http://localhost:8080/news/my-news-item",
"@type": "Page",
"id": "my-news-item",
"created": "2022-04-08T16:00:00.000Z",
"modified": "2022-04-08T16:00:00.000Z",
"UID": "a95388f2-e4b3-4292-98aa-62656cbd5b9c",
"is_folderish": true,
"layout": "view",
"owner": "admin",
"review_state": "private",
"lock": {
"locked": false,
"stealable": true
}
}
Unsuccessful Response (400 Bad Request)
If the resource could not be created, for instance because the title was missing in the request, the server responds with 400 Bad Request
:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"message": "Required field(s) missing."
}
The response body can contain information about why the request failed.
Reading a Resource with GET
After a successful POST, we can access the resource by sending a GET request to the resource URL:
GET /news HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImZ1bGxuYW1lIjoiQWRtaW4iLCJpYXQiOjE2NDkzMTI0NDl9.RS1Ny_r0v7vIylFfK6q0JVJrkiDuTOh9iG9IL8xbzAk
Successful Response (200 OK)
If a resource has been retrieved successfully, the server responds with 200 OK
:
HTTP/1.1 200 OK
Content-Type: application/json
{
"title": "News",
"blocks": {
"79ba8858-1dd3-4719-b731-5951e32fbf79": {
"@type": "title"
}
},
"description": "News Items",
"blocks_layout": {
"items": [
"79ba8858-1dd3-4719-b731-5951e32fbf79"
]
},
"items": [],
"@components": {
"actions": {
"@id": "http://localhost:8080/news/@actions"
},
"breadcrumbs": {
"@id": "http://localhost:8080/news/@breadcrumbs"
},
"catalog": {
"@id": "http://localhost:8080/news/@catalog"
},
"navigation": {
"@id": "http://localhost:8080/news/@navigation"
},
"navroot": {
"@id": "http://localhost:8080/news/@navroot"
},
"translations": {
"@id": "http://localhost:8080/news/@translations"
},
"types": {
"@id": "http://localhost:8080/news/@types"
},
"workflow": {
"@id": "http://localhost:8080/news/@workflow"
}
},
"@id": "http://localhost:8080/news",
"@type": "Folder",
"id": "news",
"language": {
"title": "English",
"token": "en"
},
"created": "2022-04-02T20:22:00.000Z",
"modified": "2022-04-02T20:22:00.000Z",
"effective": "2022-04-02T20:22:00.000Z",
"UID": "32215c67-86de-462a-8cc0-eabcd2b39c26",
"owner": "admin",
"is_folderish": true,
"layout": "view",
"review_state": "published",
"lock": {
"locked": false,
"stealable": true
}
}
For folderish types, their childrens are automatically included in the response as items.
Unsuccessful response (404 Not Found)
If a resource could not be found, the server will respond with 404 Not Found
:
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": "Not found: /random"
}
GET Responses
Possible server reponses for a GET
request are:
- 200 OK
- 404 Not Found
- 500 Internal Server Error
Updating a Resource with PATCH
To update an existing resource we send a PATCH
request to the server. PATCH
allows to provide just a subset of the resource (the values you actually want to change).
If you send the value null
for a field, the field’s content will be deleted. Note that this is not possible if the field is required.
PATCH /news/my-news-item HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImZ1bGxuYW1lIjoiQWRtaW4iLCJpYXQiOjE2NDkzMTI0NDl9.RS1Ny_r0v7vIylFfK6q0JVJrkiDuTOh9iG9IL8xbzAk
Content-Type: application/json
{
"title": "My New News Item"
}
Successful Response (204 No Content)
A successful response to a PATCH request will be indicated by a 204 No Content
response by default:
HTTP/1.1 204 No Content
Removing a Resource with DELETE
We can delete an existing resource by sending a DELETE request:
DELETE /news/my-news-item HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImZ1bGxuYW1lIjoiQWRtaW4iLCJpYXQiOjE2NDkzMTI0NDl9.RS1Ny_r0v7vIylFfK6q0JVJrkiDuTOh9iG9IL8xbzAk
A successful response will be indicated by a 204 No Content
response:
HTTP/1.1 204 No Content
DELETE Repsonses
- 204 No Content
- 404 Not Found (if the resource does not exist)
- 405 Method Not Allowed (if deleting the resource is not allowed)
- 500 Internal Server Error
Reordering sub resources
The resources contained within a resource can be reordered using the ordering
key using a PATCH request on the container.
Use the obj_id
subkey to specify which resource to reorder. The subkey delta
can be ‘top’, ‘bottom’, or a negative or positive integer for moving up or down.
PATCH /news HTTP/1.1
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbiIsImZ1bGxuYW1lIjoiQWRtaW4iLCJpYXQiOjE2NDkzMTI0NDl9.RS1Ny_r0v7vIylFfK6q0JVJrkiDuTOh9iG9IL8xbzAk
Content-Type: application/json
{
"ordering": {"obj_id": "my-news-item", "delta": "top"}
}