Adapters
Adapters tell Apicase how to work with some API.
Why adapters?
The problem of the most of libraries - they are restricted by only one API. Apicase uses adapters and it allows you to use any API.
Wanna get all Apicase features using Facebook API? Just wrap it into adapter and use it as well.
Wanna use Apicase in your native applications or with SSR? You can use isomorphic or platform-specific APIs as well.
Wanna cross-platform support? Feel free to switch between platform-specific adapters (e.g. fetch, node-fetch, whatwg-fetch).
Adapter structure
const adapter = {
createState: () => ({ /* ... */ }),
callback: ctx => { /* ... */ },
convert?: payload => ({ /* ... */ }),
merge?: (from, to) => ({ /* ... */ })
}
createState - define default request result
If your callback won't change result, there will be result from createState method.
callback - all request logic is here
ctx structure:
- payload - request payload
- resolve(result) - resolve request and call
donehooks - reject(result) - reject request and call
failhooks - emit(eventName, ...args) - emit custom event. You can listen to it using
req.on(eventName, cb)orService.on(eventName, cb) - setCancelCallback(cb) - callback that will be called on
req.cancel(). It may return Promise so you canawait req.cancel()to wait for request termination.
convert - prepare your payload before using in request
This is just a helper method that converts payload for callback. You can define default options here, for example.
Note
convert method doesn't change payload for hooks to not to cause unexpected behaviour.
merge - custom merge strategy for payloads
For now, request options are merged in 2 cases:
- Using
Service.extend(opts)will merge service options and newest ones. - Using
Service.doRequest(opts)will merge service options and options passed in argument.
merge callback defines custom merge strategy for payload. For example, @apicase/adapter-fetch uses this feature for path-stacking:
const Service = new ApiService({
adapter: fetch,
url: '/api'
})
// { url: '/api/posts' }
Service.doRequest({ url: 'posts' })
// { url: '/another_url' }
Service.doRequest({ url: '/another_url' })
Ready for More?
To see adapters in details, have a look at: