This is a small guide that shows you how to use this module. In this document, we'll be modifying the skeleton to use aurelia-api.
For this guide, we assume you have the aurelia skeleton set up. We'll also assume you have node and npm installed, and that you're familiar with installing modules.
Finally, we'll assume that you have jspm installed. If you don't, run npm i -g jspm
.
Now it's time to start doing something
First, head on over to your favorite terminal and run jspm install aurelia-api
from your project root.
This will install the module of which you're reading the getting-started right now. Woah!
Cool, the module has been installed... But now we want it to do something, right?
Head on over to your favorite editor, open up the project and open file src/users.js
.
As you can see, it's using aurelia-fetch-client
to do the API calls to https://api.github.com/
.
We're going to change that, and make use of aurelia-api
.
In order for us to actually make calls to github, we'll have to configure an endpoint.
Info: An endpoint is the url for a specific API. It can be the github API, your SSO server, API etc.
Let's configure a new endpoint by editing main.js
:
import 'bootstrap';
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
.developmentLogging()
// Add this:
.plugin('aurelia-api', config => {
config.registerEndpoint('github', 'https://api.github.com/');
});
aurelia.start().then(a => a.setRoot());
}
Aaaawesome. That wasn't really complicated, right?
All we did, was tell aurelia to use the aurelia-api
plugin and register an endpoint. Now, let's use it!
Now head back to src/users.js
. Change the file to look like this:
import {inject} from 'aurelia-framework';
import {Endpoint} from 'aurelia-api';
import 'fetch';
@inject(Endpoint.of('github'))
export class Users {
heading = 'Github Users';
users = [];
constructor(githubEndpoint) {
this.githubEndpoint = githubEndpoint;
}
activate() {
return this.githubEndpoint.find('users')
.then(users => this.users = users);
}
}
Here's what we've changed. We've:
- Swapped out
HttpClient
withEndpoint
. - Altered the
@inject()
decorator to use theEndpoint
resolver. - Completely removed the config calls in the constructor. (We added that in
src/main.js
earlier). - Assigned the endpoint to the viewModel.
- Changed
this.http.fetch('users')
tothis.githubEndpoint.find('users')
. Notice that we removed the.json()
step, too. Our Rest api methods already do that for you.
And done! We've now successfully swapped auth aurelia-fetch-client
with aurelia-api
.
Head back to your terminal, run gulp watch
and open the project in your browser. Now, when you navigate to http://localhost:9000/#/users, you'll notice that absolutely nothing has changed; which was the point of this getting started.
There are some additional things you can do with the plugin.
You probably don't only want to retrieve data but send some also. The Rest client of an endpoint has all the methods and options you might desire. Here is just a quick overview. All methods will, when the body passed as an object, stringify it if the Content-Type
is application/json
(the default), resp. convert it to querystring format if the Content-Type
is application/x-www-form-urlencoded
. All methods return a Promise with the server response parsed to an object if possible.
endpoint
.client // the httpClient instance
.endpoint // name of the endpoint
.default // The fetch client defaults
.find(resource, criteria, options) // GET
.findOne(resource, id, criteria, options) // GET
.post(resource, body, options) { // POST
.update(resource, criteria, body, options) // PUT
.updateOne(resource, id, criteria, body, options) // PUT
.patch(resource, criteria, body, options) // PATCH
.patchOne(resource, id, criteria, body, options) // PATCH
.destroy(resource, criteria, options) // DELETE
.destroyOne(resource, id, criteria, options) // DELETE
.create(resource, body, options) // POST
.request(method, path, body, options) // method
```
The [Rest api](api_rest.md) has more information about those. Here is just another quick example:
```js
import {Rest} from 'aurelia-api';
@inject(Rest)
export class MyViewModel {
constructor (restClient) {
restClient.update('product', 17, null, {price: 4000})
.then(console.log)
.catch(console.error);
}
}
```
### Multiple endpoints
You're allowed to register as many endpoints as you like:
```js
import 'bootstrap';
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
.developmentLogging()
.plugin('aurelia-api', config => {
config
.registerEndpoint('github', 'https://api.github.com/')
.registerEndpoint('auth', 'https://auth.example.io/')
.registerEndpoint('api', 'https://api.example.io/');
});
aurelia.start().then(a => a.setRoot());
}
```
You can now use these by supplying the correct name in `@inject(Endpoint.of(name))` (replace `name` with `'github'`, `'auth'` or `'api'`).
### Default endpoint
Just using a single endpoint? Or mainly using a specific endpoint? That's fine.
You can register an endpoint as the default, which will be returned whenever you don't specify an endpoint name.
```js
import 'bootstrap';
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
.developmentLogging()
.plugin('aurelia-api', config => {
config
.registerEndpoint('github', 'https://api.github.com/')
.registerEndpoint('auth', 'https://auth.example.io/')
.registerEndpoint('api', 'https://api.example.io/')
.setDefaultEndpoint('api');
});
aurelia.start().then(a => a.setRoot());
}
```
And when using it:
```js
import {inject} from 'aurelia-framework';
import {Endpoint} from 'aurelia-api';
import 'fetch';
@inject(Endpoint.of(), Endpoint.of('github'))
export class MyClass {
constructor(apiEndpoint, githubEndpoint) {
// apiEndpoint, as that's the default.
}
}
```