Resource Type
The resource type is a identifier for a model class. It is the first segment of the request path, after alias mapping has been applied.
Sending data
Different "layouts" for sent data are supported by the extension:
Send raw body
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"property1":"Value 1",
"property2":"Value 2"
}' \
"http://your-domain.com/rest/..."
Send form-data
curl -X POST \
-H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW" \
-d '------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="field1"
Value 1
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="field2"
Value 2
------WebKitFormBoundary7MA4YWxkTrZu0gW--' \
"http://your-domain.com/rest/..."
Send x-www-form-urlencoded
curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'field1=Value 1&field2=Value 2' \
"http://your-domain.com/rest/..."
In a custom handler the sent data can be retrieved through the request's getSentData() method.
Customize the output of a model
The easiest way to customize the properties exported by your models is through implementing the JsonSerializable interface.
class Person extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
implements JsonSerializable {
public function jsonSerialize()
{
return [
'companyName' => 'the company name'
];
}
}
Show information about the models using __class property
The extension can add a property to the JSON output that provides the object's class name. This can easily be enabled with TypoScript:
plugin.tx_rest.settings {
addClass = 1
}
Add additional headers
plugin.tx_rest.settings {
responseHeaders {
Access-Control-Allow-Origin = example.com
Access-Control-Allow-Methods = GET, POST, OPTIONS, DELETE
}
}
Preprocess input data
The best way to preprocess sent data before saving is to create a custom DataProvider.
Lets assume your extension is in the namespace \Foo\Bar. When you request /foo-bar-model the Object Manager will look for a class called \Foo\Bar\Rest\DataProvider and will use it to fetch and create models (the built in DataProvider \Cundd\Rest\DataProvider\DataProvider is used as fallback).
You can extend the default DataProvider and overwrite prepareModelData().
namespace Foo\Bar\Rest;
class DataProvider extends \Cundd\Rest\DataProvider\DataProvider {
/**
* @param $data
* @return array
*/
protected function prepareModelData($data) {
// Work with the data
return $data;
}
}
How do paths and classes work together?
Paths, resource types and the associated classes
Below you find examples of the URL paths (the part after rest/) and the matching class names that will be used:
| Path | Resource Type | Class | Repository | Data Provider | Conf |
|---|---|---|---|---|---|
| /pix-gallery | pix-gallery | Tx_Pix_Domain_Model_Gallery[] | Tx_Pix_Domain_Repository_GalleryRepository | \Cundd\Rest\DataProvider\DataProvider | a |
| /pix-gallery/2 | pix-gallery | Tx_Pix_Domain_Model_Gallery | Tx_Pix_Domain_Repository_GalleryRepository | \Cundd\Rest\DataProvider\DataProvider | a |
| /cundd-foo-bar | cundd-foo-bar | \Cundd\Foo\Domain\Model\Bar[] | \Cundd\Foo\Domain\Repository\BarRepository | \Cundd\Rest\DataProvider\DataProvider | b |
| /cundd-foo-bar/34 | cundd-foo-bar | \Cundd\Foo\Domain\Model\Bar | \Cundd\Foo\Domain\Repository\BarRepository | \Cundd\Rest\DataProvider\DataProvider | b |
| /Document/db | Document-db | \Cundd\Rest\Domain\Model\Document[] | \Cundd\Rest\Domain\Repository\DocumentRepository | \Cundd\Rest\DataProvider\DocumentDataProvider | c |
| /Document/db/9 | Document-db | \Cundd\Rest\Domain\Model\Document | \Cundd\Rest\Domain\Repository\DocumentRepository | \Cundd\Rest\DataProvider\DocumentDataProvider | c |
| /Document/db/a3b | Document-db | \Cundd\Rest\Domain\Model\Document | \Cundd\Rest\Domain\Repository\DocumentRepository | \Cundd\Rest\DataProvider\DocumentDataProvider | c |
| /cundd-daa-bar | cundd-daa-bar | * | * | \Cundd\Daa\Rest\DataProvider | d |
| /cundd-daa-bar/34 | cundd-daa-bar | * | * | \Cundd\Daa\Rest\DataProvider | d |
*) These classes are not fixed and depend on the custom \Cundd\Daa\Rest\DataProvider.
Paths, methods and the associated actions
Example: Gallery
| Path | Method | Class | Action | Conf |
|---|---|---|---|---|
| /pix-gallery | GET | Tx_Pix_Domain_Model_Gallery[] | List all galleries | a |
| /pix-gallery | POST | Tx_Pix_Domain_Model_Gallery | Create a new gallery | a |
| /pix-gallery | DELETE | 405 Method Not Allowed | a | |
| /pix-gallery/2 | GET | Tx_Pix_Domain_Model_Gallery | Return the gallery with UID 2 | a |
| /pix-gallery/2 | POST | Tx_Pix_Domain_Model_Gallery | Replace the gallery with UID 2 | a |
| /pix-gallery/2 | DELETE | Tx_Pix_Domain_Model_Gallery | Delete the gallery with UID 2 | a |
| /pix-gallery/2 | PATCH | Tx_Pix_Domain_Model_Gallery | Update the gallery with UID 2 | a |
Example: Document Storage
| Path | Method | Class | Action | Conf |
|---|---|---|---|---|
| /Document/db | GET | \Cundd\Rest\Domain\Model\Document[] | List all Documents in database 'db' | c |
| /Document/db | POST | \Cundd\Rest\Domain\Model\Document | Create a new Document in database 'db' | c |
| /Document/db | DELETE | 405 Method Not Allowed | c | |
| /Document/db/9 | GET | \Cundd\Rest\Domain\Model\Document | Return the Document with UID or ID 2 in database 'db' | c |
| /Document/db/9 | POST | \Cundd\Rest\Domain\Model\Document | Replace the Document with UID or ID 2 in database 'db' | c |
| /Document/db/9 | DELETE | \Cundd\Rest\Domain\Model\Document | Delete the Document with UID or ID 2 in database 'db' | c |
| /Document/db/9 | PATCH | \Cundd\Rest\Domain\Model\Document | Update the Document with UID or ID 2 in database 'db' | c |
Configuration
a)
plugin.tx_rest.settings.paths {
path {
path = pix-gallery
read = allow
write = allow
}
}
b)
plugin.tx_rest.settings.paths {
path {
path = cundd-foo-bar
read = allow
write = allow
}
}
c)
plugin.tx_rest.settings.paths {
path {
path = Document-db
read = allow
write = allow
}
}
d)
Assume the class \Cundd\Daa\Rest\DataProvider exists.
plugin.tx_rest.settings.paths {
path {
path = Cundd-Daa-Bar
read = allow
write = allow
}
}
Caching
To enable caching set the cache life time:
plugin.tx_rest.settings.cacheLifetime = 3600
Additionally a separate life time for the expires header can be defined:
plugin.tx_rest.settings.expiresHeaderLifetime = 300
Install TYPO3 and REST in a subdirectory
If the TYPO3 installation is inside a subdirectory the environment variable TYPO3_REST_REQUEST_BASE_PATH has to be set to the subdirectories name.
E.g.: TYPO3 is installed in $DOC_ROOT/dev_install/ and accessed through http://your-domain.com/dev_install/rest/ set TYPO3_REST_REQUEST_BASE_PATH to dev_install.
Internationalization and localization
The extension supports different types to handle localized requests.
- Since version
3.6.0TYPO3's site handling is supported - Specify the
LGET-parameter - Specify a
Accept-Languageheader and define a mapping from the header value to the sys-language UID in TypoScriptplugin.tx_rest.settings { languages { de-DE = 1 } }