Horváth Győző
Egyetemi adjunktus
1117 Budapest, Pázmány Péter sétány 1/c., 2.420-as szoba
Tel: (1) 372-2500/1816
horvath.gyozo@inf.elte.hu
Representational State Transfer (REST) Application Programming Interface (API)
GET
, POST
, DELETE
, PUT/PATCH
)GET /people
: Összes adat lekérdezése a people
modellbőlGET /people/john
: A john
azonosítójú elem lekérdezése a people
modellbőlPOST /people
: Új elem felvétele a people
modellbe (adatok a request bodyban)DELETE /people/john
: A john
azonosítójú elem törlése a people
modellbőlPUT /people/john
: A john
azonosítójú elem frissítése a people
modellbőlA specification for building APIs in JSON
ember-data
alapértelmezetten ezt a formátumot kezelimime-type: application/vnd.api+json
MUST
) és ajánlott (RECOMMENDED
) szabályokKérés
GET /articles?include=author
Válasz
HTTP/1.1 200 OK
Content-Type: application/vnd.api+json
{
"data": [{
"type": "articles",
"id": "1",
"attributes": {
"title": "JSON API paints my bikeshed!",
"body": "The shortest article. Ever.",
"created": "2015-05-22T14:56:29.000Z",
"updated": "2015-05-22T14:56:28.000Z"
},
"relationships": {
"author": { "data": {"id": "42", "type": "people"} }
}
}],
"included": [ {
"type": "people",
"id": "42",
"attributes": {
"name": "John",
"age": 80,
"gender": "male"
}
} ]
}
Kérés
POST /photos HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": {
"type": "photos",
"attributes": {
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
},
"relationships": {
"photographer": {
"data": { "type": "people", "id": "9" }
}
}
}
}
Alakítsunk ki JSON API formátumot használó REST API szervert az alkalmazásunknak!
Hozzunk létre szerver oldalon egy új Express alkalmazást
npm install express --save
server.js
var express = require('express');
var server = express();
var port = process.env.PORT || 8080;
server.listen(port, function () {
console.log('JSON Api server started on port ' + port);
});
Alakítsunk ki REST API végpontokat: Fortune.js
npm install fortune --save
server.js
var fortune = require('fortune');
// Új tároló (alapértelmezetten memóriában tárol)
var store = fortune();
// Express middleware
server.use(fortune.net.http(store));
// Csak akkor fusson a szerver, ha sikerült csatlakozni a tárolóhoz
// Hasonlóan a Waterline-hoz
store.connect().then(function () {
server.listen(port, function () {
console.log('JSON Api server started on port ' + port);
});
});
Hozzuk létre a szerveroldalon a kliensoldalinak megfelelő adatmodellt!
http://fortunejs.com/api/#fortune-definetype
server.js
store.defineType('<adatmodell neve>', {
<mező neve>: {type: <mező típusa>},
field1: {type: String},
field2: {type: Number, min: 0, max: 100},
field3: {type: Boolean},
field4: {type: Date},
...
<kapcsolat neve>: {
link: '<kapcsolt modell neve>',
inverse: '<visszafele kapcsolat neve>',
isArray: true
},
...
});
Használjunk fájl alapú adatbázist (NeDB) az adatok perzisztálására!
npm install fortune-nedb --save
server.js
var nedbAdapter = require('fortune-nedb');
var store = fortune({
adapter: {
type: nedbAdapter,
options: { dbPath: __dirname + '/.db' }
}
});
Teszteljük a kialakított API-t!
A végponttesztelővek egyes végpontokra küldhetünk különböző metódusokkal kéréseket.
POST
metódussal új elemet az adatbázisbanGET
metódussal az összes elemet egy modellbenGET
metódussalPUT
és DELETE
metódusokkalHasználjunk JSON API formátumot a REST API-nkban!
npm install fortune-json-api --save
server.js
var jsonapi = require('fortune-json-api');
// Beállítjuk a JSON API serializer-t
var store = fortune({
adapter: {
type: nedbAdapter,
options: { dbPath: __dirname + '/.db' }
},
serializers: [{ type: jsonapi }]
});
// Minden URL-ről engedélyezzük a hozzáférést az API-hoz
// Mindenképp a `server.use(fortune.net.http(store));` sor elé kerüljön
server.use(function (req, res, next) {
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Origin', '*');
next();
});
Alakítsuk át a kliens oldali alkalmazásunkat úgy, hogy az új API-t használja adatforrásként!
A szerver oldalon alakítsuk ki úgy az adatmodellt, hogy megegyezzen a kliensoldalival!
application.js / adapter.js
FixtureAdapter => JSONAPIAdapter
export default DS.JSONAPIAdapter.extend({
host: 'http://<JSON API URL>.c9users.io',
namespace: ''
});
Az Ember.js számára engedélyezni kell a külső URL-ről történő adatlekérést.
config/environment.js
ENV.contentSecurityPolicy = {
'default-src': "'none'",
'script-src': "'self'",
'font-src': "'self' 'unsafe-eval' https://fonts.gstatic.com",
'connect-src': "'self' 'unsafe-eval' http://<REST API URL>.c9users.io",
'img-src': "'self'",
'style-src': "'self' 'unsafe-eval' https://fonts.googleapis.com",
'media-src': "'self'"
};
Küldjünk POST
kérést a megfelelő végpontra:
Kérés fejléce
Content-type: application/vnd.api+json
Kérés törzse
{
"data": {
"type": "<modell neve>",
"attributes": {
"<mezőnév>": "<érték>",
...
}
}
}
POST /photos HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
{
"data": {
"type": "photos",
"attributes": {
"title": "Ember Hamster",
"src": "http://example.com/images/productivity.png"
},
"relationships": {
"photographer": {
"data": { "type": "people", "id": "9" }
}
}
}
}
Csak az adaptert kell módosítani, minden egyéb kód változatlan