Senchaã®çºæ¡ããããšã¯ç°ãªãæ¹æ³ã§é¢é£ããŠããå¯èœæ§ããããŸããããã®ååçãªå察è ã§ãããæ·±å»ãªã€ã³ãã©ããããããžã§ã¯ããæ§ç¯ããããã®æé©ãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããããšã¯é£ãããšèªããŠããŸãã
ç§ã®æèŠã§ã¯ãExt JSã§æã䟡å€ãããã®ã¯UIã³ã³ããŒãã³ãã®ã³ã¬ã¯ã·ã§ã³ã§ã¯ãªããåªããOOPã¢ãŒããã¯ãã£ã§ãã è¿å¹Žã®JSã®æ¥éãªçºå±ãèæ ®ããŠãã7幎åã«Ext JSã§å®è£ ãããå¿ èŠãªãã®ã®å€ãã¯ããã€ãã£ãã¯ã©ã¹ïŒåå空éãããã¯ã¹ã€ã³ãéçããããã£ã芪ã¡ãœããã®äŸ¿å©ãªåŒã³åºãïŒã«ãŸã ãããŸããã ããããæ°å¹Žåã«ããã¯ãšã³ãã§Ext JSã¯ã©ã¹ã®ç«ã¡äžããå®éšãããã£ãããšãªããŸããã æåã®åæ§ã®å®éšã«ã€ããŠã¯ããã§ã«Habréã«æçš¿ããŸããã ãã®èšäºã§ã¯ãå€ãã¢ã€ãã¢ã®æ°ããå®è£ ãšããã€ãã®æ°ããã¢ã€ãã¢ã«ã€ããŠèª¬æããŸãã
å§ããåã«ã次ã®è³ªåã«æ³šæããŠãã ãããããªãã¯ã©ãæããŸãããã©ãã§å®è¡ããã以äžã®ã³ãŒãã¹ããããã¯äœãããŸããïŒ
Ext.define('Module.message.model.Message', { .... /* scope:server */ ,async newMessage() { ......... this.fireEvent('newmessage', data); ...... } ... })
ãã®ã³ãŒãã¯ãµãŒããŒã§å®è¡ããããµãŒããŒã«æ¥ç¶ãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ããã·ã³ã®ãModule.message.model.Messageãã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§ãnewmessageãã€ãã³ããçºçãããŸãã
ãµãŒããŒåŽExt JSã䜿çšããå¯èœæ§ã瀺ãããã«ãç°¡åãªãã£ãããããžã§ã¯ããåæããŸãã ãŠãŒã¶ãŒãããã¯ããŒã ãå ¥åãããšãã«ãã°ã€ã³ããããšã¯ãããŸããã äžè¬çãªã¡ãã»ãŒãžãŸãã¯ãã©ã€ããŒãã¡ãã»ãŒãžãæçš¿ã§ããŸãã ãã£ããã¯ãªã¢ã«ã¿ã€ã ã§æ©èœããã¯ãã§ãã åžæãã人ã¯ãããžãã¹ã§ãã®çµæžãã¹ãŠãããã«è©Šãããšãã§ããŸãã
èšçœ®
éå§ããã«ã¯ãnodejs 9+ãšredis-serverãå¿ èŠã§ãïŒæ¢ã«ã€ã³ã¹ããŒã«ãããŠããããšãåæã§ãïŒã
git clone https://github.com/Kolbaskin/extjs-backend-example cd extjs-backend-example npm i
ãµãŒããŒãèµ·åããŸãã
node server
ãã©ãŠã¶ãŒã§ã localhostããŒãžãéããŸãïŒ3000 / www / auth /
ããã¯ããŒã ãå ¥åããŠEnterããŒãæŒããŸãã
ãã®ãããžã§ã¯ãã¯ãã¢ã§ãããããå€ããã©ãŠã¶ãŒïŒES8ãã¶ã€ã³ããããŸãïŒã®ãµããŒãã¯ãããŸãããæ°ããChromeãŸãã¯FFã䜿çšããŠãã ããã
ãµãŒããŒ
é çªã«è¡ããŸãããã
ãµãŒããŒã³ãŒãïŒserver.jsïŒ
// http- express // Ext JS express const express = require('express'); const staticSrv = require('extjs-express-static'); const app = express(); const bodyParser = require('body-parser'); // global = { config: require('config') } // Ext JS require('extjs-on-backend')({ // express app, // wsClient: 'Base.wsClient' }); // Ext.Loader.setPath('Api', 'protected/rest'); Ext.Loader.setPath('Base', 'protected/base'); Ext.Loader.setPath('Www', 'protected/www'); // http app.use( bodyParser.json() ); app.use(bodyParser.urlencoded({ extended: true })); // Ext JS app.use('/api/auth', Ext.create('Api.auth.Main')); app.use('/www/auth', Ext.create('Www.login.controller.Login')); // app.use(staticSrv(__dirname + '/static')); // const server = app.listen(3000, () => { console.log('server is running at %s', server.address().port); });
ã芧ã®ãšãããããã§ã¯ãã¹ãŠãExpressäžã®ãµãŒããŒã®æšæºã§ãã èå³æ·±ãã®ã¯ã察å¿ããã«ãŒããæäŸããExt JSã¯ã©ã¹ãå«ããããšã§ãã
app.use('/api/auth', Ext.create('Api.auth.Main')); app.use('/www/auth', Ext.create('Www.login.controller.Login'));
REST APIã®å®è£
Api.auth.Mainã¯ã©ã¹ã¯ãREST APIïŒprotected / rest / auth / Main.jsïŒãžã®ãªã¯ãšã¹ããåŠçããŸãã
Ext.define('Api.auth.Main', { extend: 'Api.Base', // // routes: [ { path: '/', get: 'login'}, { path: '/restore', post: 'restoreLogin' }, { path: '/registration', post: 'newuser'}, { path: '/users', get: 'allUsers'} ] // : // {query: <...>, params: <...>, body: <...>} ,async login(data) { return {data:[{ id:1, subject: 111, sender:222, }]} } ,async restoreLogin() { ... } ,async newuser() { ... } ,async allUsers() { .... } })
ãµãŒããŒã§XTemplateã䜿çšããHTMLããŒãžã®çæ
2çªç®ã®ã¯ã©ã¹Www.login.controller.Loginã¯ããã°ã€ã³ãã©ãŒã ïŒprotected / www / login / controller / Login.jsïŒã䜿çšããŠéåžžã®htmlããŒãžãäœæããŸãã
Ext.define('Www.login.controller.Login', { // "" : // , .. extend: 'Www.Base' // // , .. ,baseTpl: 'view/inner' // // , ,loginFormTpl: 'login/view/login' // ,routes: [ { path: '/', get: 'loginForm', post: 'doLogin'} ] // html // ,async loginForm () { return await this.tpl(this.loginFormTpl, { pageTitle: 'Login page', date: new Date() }); } ,async doLogin (params, res) { if(params.body.name && /^[a-z0-9]{2,10}$/i.test(params.body.name)) { this.redirect(`/index.html?name=${params.body.name}`, res); return; } return await this.tpl(this.loginFormTpl, { pageTitle: 'Login page', date: new Date() }); } })
ãã³ãã¬ãŒãã¯æšæºã®XTemplateïŒprotected / www / login / view / login.tplïŒã䜿çšããŸã
<h2>{pageTitle} (date: {[Ext.Date.format(values.date,'dmY')]})</h2> <form method="post"> <input name="name" placeholder="name"> <button type="submit">enter</button> </form>
äžèšã®ãã¹ãŠã¯å®å šãªæšæºã»ããã§ããã现å¿ã®æ³šæãæã£ãèªè ãèšãããã«ããã®ãããExt JSããµãŒããŒã«è»¢éããããšã§ãã®åºãä¿è·ããå¿ èŠã¯ãããŸããã§ããã ãããã£ãŠãèšäºã®ç¬¬2éšã«é²ã¿ããã¹ãŠã®ç®çã瀺ããŸãã
ã客æ§
éçãã£ã¬ã¯ããªã«éåžžã®ã¯ã©ã€ã¢ã³ãExt JSã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããã ãã®äŸã§ã¯ãcmdã®äœ¿çšãæå³çã«èæ ®ãããæ¢ã«æ§ç¯ãããŠããext-allããã³æšæºããŒãã䜿çšããŸããã ã¢ã»ã³ããªã®åé¡ã¯å¥ã®ãããã¯ã§ãããããããå¥ã®æçš¿ã«å°å¿µããŸãã
ãã¹ãŠã¯app.jsã§å§ãŸããŸã
// Ext.Loader.setConfig({ enabled: true, paths: { "Core": "app/core", "Admin": "app/admin", "Module": "app/admin/modules", "Ext.ux": "ext/ux" } }); // this.token = Ext.data.identifier.Uuid.createRandom()(); // // () // ( ) Ext.WS = Ext.create('Core.WSocket', { token: this.token, user: new URLSearchParams(document.location.search).get("name") }); // Ext.application({ name: 'Example', extend: 'Ext.app.Application', requires: ['Admin.*'], autoCreateViewport: 'Admin.view.Viewport' })
Webãœã±ããã®ååšã¯éèŠãªãã€ã³ãã§ããããã¯ã以äžã§èª¬æãããã¹ãŠã®éæ³ãå®è£ ã§ããããšã§ãã
ããŒãžäžã®èŠçŽ ã®ã¬ã€ã¢ãŠãã¯ãAdmin.view.Viewportã¯ã©ã¹ïŒstatic / app / view / Viewport.jsïŒã«å«ãŸããŠããŸãã é¢çœãããšã¯äœããããŸããã
äž»ãªæ©èœèŠçŽ ïŒãŠãŒã¶ãŒãªã¹ããã¡ãã»ãŒãžããŒãéä¿¡ãã©ãŒã ïŒã¯ãåå¥ã®ã¢ãžã¥ãŒã«ãšããŠå®è£ ãããŸãã
ãŠãŒã¶ãŒãªã¹ã
ãã®ãªã¹ãã®åçŽãªã¢ã«ãŽãªãºã ã¯æ¬¡ã®ãšããã§ããããŒãžãéããããšãçŸåšã®ãŠãŒã¶ãŒããµãŒããŒããããŒããããŸãã æ°ãããŠãŒã¶ãŒãæ¥ç¶ãããšããµãŒããŒã¯ãModule.users.model.UserModelãã¯ã©ã¹ã§ãaddãã€ãã³ããçæããåæããããšãåãã¯ã©ã¹ã§ãremoveãã€ãã³ããçºçããŸãã åé¡ã¯ããµãŒããŒåŽã§ã€ãã³ããããªã¬ãŒãããã¯ã©ã€ã¢ã³ãã§ããã远跡ã§ããããšã§ãã
ããããŸãæåã«ã ã¯ã©ã€ã¢ã³ãåŽã§ã¯ãStore jugglesããŒã¿ïŒéç/ã¢ããª/ã¢ãžã¥ãŒã«/ãŠãŒã¶ãŒ/ã¹ãã¢/ UsersStore.jsïŒ
Ext.define('Module.users.store.UsersStore', { extend: 'Ext.data.Store' ,autoLoad: true ,total: 0 ,constructor() { // this.dataModel = Ext.create('Module.users.model.UserModel'); // this.dataModel.on({ add: (records) => { this.onDataAdd(records) }, remove: (records) => { this.onDataRemove(records) } }) this.callParent(arguments) } // load ,async load() { // const data = await this.dataModel.$read(); // this.total = data.total; // UI this.loadData(data.data); } ,getTotalCount() { return this.total; } // ,onDataAdd(records) { this.add(records[0]); } // -- ,onDataRemove(records) { this.remove(this.getById (records[0].id)) } });
2ã€ã®èå³æ·±ãç¹ããããŸãã ãŸãããconst data = await this.dataModelã$ ReadïŒïŒ;ããšããè¡ã¯ãã¢ãã«ã®ãµãŒããŒåŽã¡ãœãããåŒã³åºããŸãã Ajaxã䜿çšãããããããã³ã«ããµããŒããããããå¿ èŠã¯ãããŸããããµãŒããŒã¡ãœãããããŒã«ã«ãšããŠåŒã³åºãã ãã§ãã åæã«ãå®å šæ§ã¯ç ç²ã«ãªããŸããïŒè©³çŽ°ã«ã€ããŠã¯ä»¥äžãåç §ïŒã
次ã«ãthis.dataModel.onïŒ...ïŒã®æšæºæ§é ã«ããããµãŒããŒã«ãã£ãŠçæãããã€ãã³ãã远跡ã§ããŸãã
ã¢ãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ã€ã¢ã³ãéšåãšãµãŒããŒéšåã®éã®ããªããžã§ãã ããã¯å ã®äºå è«ã®ãããªãã®ã§ã-ããã³ããšã³ããšããã¯ãšã³ãã®äž¡æ¹ã®ããããã£ãå®è£ ããŸãã ã¢ãã«ã泚ææ·±ãèŠãŠã¿ãŸãããã
Ext.define('Module.users.model.UserModel', { extend: 'Core.data.DataModel' /* scope:client */ ,testClientMethod() { ... } ,testGlobalMethod() { ... } /* scope:server */ ,privateServerMethod() { .... } /* scope:server */ ,async $read(params) { // redis const keys = await this.getMemKeys('client:*'); let data = [], name; for(let i = 0;i<keys.length;i++) { // name = await this.getMemKey(keys[i]); if(name) { data.push({ id: keys[i].substr(7), name }) } } // return { total: data.length, data } } })
ã³ã¡ã³ãã«æ³šæããŠãã ãã/ *ã¹ã³ãŒãïŒãµãŒããŒ* /ããã³/ *ã¹ã³ãŒãïŒã¯ã©ã€ã¢ã³ã* /-ãããã®æ§é ã¯ãã¡ãœããã®ã¿ã€ãã決å®ãããµãŒããŒã®ã©ãã«ã§ãã
testClientMethod-ãã®ã¡ãœããã¯ã¯ã©ã€ã¢ã³ãã§ã®ã¿å®è¡ãããã¯ã©ã€ã¢ã³ãåŽã§ã®ã¿äœ¿çšå¯èœã§ãã
testGlobalMethod-ãã®ã¡ãœããã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã§å®è¡ãããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éšåã§äœ¿çšã§ããŸãã
privateServerMethod-ã¡ãœããã¯ãµãŒããŒäžã§å®è¡ããããµãŒããŒäžã§ã®ã¿åŒã³åºãããšãã§ããŸãã
$ readã¯ããµãŒããŒåŽã§ã®ã¿å®è¡ãããæãèå³æ·±ãã¿ã€ãã®ã¡ãœããã§ãããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§åŒã³åºãããšãã§ããŸãã ãã¬ãã£ãã¯ã¹ã$ãã¯ããµãŒããŒåŽã®ã¡ãœãããã¯ã©ã€ã¢ã³ãåŽã§äœ¿çšã§ããããã«ããŸãã
Webãœã±ããã䜿çšããŠãã¯ã©ã€ã¢ã³ãã®æ¥ç¶ãšåæã远跡ã§ããŸãã Base.wsClientã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ããŠãŒã¶ãŒæ¥ç¶ããšã«äœæãããŸãïŒprotected / base / wsClient.jsïŒ
Ext.define('Base.wsClient', { extend: 'Core.WsClient' // ,usersModel: Ext.create('Module.users.model.UserModel') // ,async onStart() { // "add" this.usersModel.fireEvent('add', 'all', [{id: this.token, name: this.req.query.user}]); // redis await this.setMemKey(`client:${this.token}`, this.req.query.user || ''); // "" , // await this.queueProcess(`client:${this.token}`, async (data, done) => { const res = await this.prepareClientEvents(data); done(res); }) } // ,onClose() { // "remove" this.usersModel.fireEvent('remove', 'all', [{id: this.token, name: this.req.query.user}]) this.callParent(arguments); } })
fireEventã¡ãœããã«ã¯ãæšæºã®ãã®ãšã¯ç°ãªããè¿œå ã®ãã©ã¡ãŒã¿ãŒããããã€ãã³ããããªã¬ãŒãããã¯ã©ã€ã¢ã³ãã«æž¡ãããŸãã 1ã€ã®ã¯ã©ã€ã¢ã³ãèå¥åãèå¥åã®é åããŸãã¯æååãallããæž¡ãããšã¯èš±å®¹ãããŸãã åŸè ã®å Žåãã€ãã³ãã¯æ¥ç¶ãããŠãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã§ããªã¬ãŒãããŸãã ãã以å€ã®å Žåãããã¯æšæºã®fireEventã§ãã
ã¡ãã»ãŒãžã®éåä¿¡
ãã©ãŒã ã³ã³ãããŒã©ãŒïŒstatic / app / admin / modules / messages / view / FormController.jsïŒã¯ãã¡ãã»ãŒãžã®éä¿¡ãæ åœããŸãã
Ext.define('Module.messages.view.FormController', { extend: 'Ext.app.ViewController' ,init(view) { this.view = view; // this.model = Ext.create('Module.messages.model.Model'); // this.msgEl = this.view.down('[name=message]'); // this.usersGrid = Ext.getCmp('users-grid') // "" this.control({ '[action=submit]' : {click: () => {this.newMessage() }} }) } // ,newMessage() { let users = []; // const sel = this.usersGrid.getSelection(); if(sel && sel.length) { sel.forEach((s) => { users.push(s.data.id) }) } // if(users.length && users.indexOf(Ext.WS.token) == -1) users.push(Ext.WS.token); // this.model.$newmessage({ to: users, user: Ext.WS.user, message: this.msgEl.getValue() }) // this.msgEl.setValue(''); } });
ã¡ãã»ãŒãžã¯ãµãŒããŒäžã®ã©ãã«ãä¿åãããããnewmessageãã€ãã³ããçºçããŸãã èå³æ·±ãã®ã¯ããthis.fireEventïŒ 'newmessage'ãdata.toãmsgïŒ;ããšããåŒã³åºãã§ããããã§ã¯ãã¯ã©ã€ã¢ã³ãèå¥åãã¡ãã»ãŒãžã®åä¿¡è ãšããŠéä¿¡ãããŸãã ãããã£ãŠããã©ã€ããŒãã¡ãã»ãŒãžã®é åžãå®è£ ãããŸãïŒéç/ã¢ããª/管çè /ã¢ãžã¥ãŒã«/ã¡ãã»ãŒãž/ã¢ãã«/ Model.jsïŒã
Ext.define('Module.messages.model.Model', { extend: 'Core.data.DataModel' /* scope:server */ ,async $newmessage(data) { const msg = { user: data.user, message: data.message } if(data.to && Ext.isArray(data.to) && data.to.length) { this.fireEvent('newmessage', data.to, msg); } else { this.fireEvent('newmessage', 'all', msg); } return true; } })
ãŠãŒã¶ãŒã®å Žåãšåæ§ã«ãã¡ãã»ãŒãžãªã¹ãã®ããŒã¿ã¯ã¹ãã¢ãé§åããŸãïŒéç/ã¢ããª/管çè /ã¢ãžã¥ãŒã«/ã¡ãã»ãŒãž/ã¹ãã¢/ MessagesStore.jsïŒ
Ext.define('Module.messages.store.MessagesStore', { extend: 'Ext.data.Store', fields: ['user', 'message'], constructor() { // Ext.create('Module.messages.model.Model', { listeners: { newmessage: (mess) => { this.add(mess) } } }) this.callParent(arguments); } });
äžè¬ã«ããã®äŸã§èå³æ·±ãã®ã¯ããã ãã§ãã
å¯èœãªè³ªå
ã¯ã©ã€ã¢ã³ãã§ã®ãµãŒããŒã¡ãœããã®å¯çšæ§ã¯ãã¡ããè¯å¥œã§ãããã»ãã¥ãªãã£ã¯ã©ãã§ããïŒ æªæã®ããããã«ãŒããµãŒããŒã³ãŒããèŠãŠãããã¯ãšã³ããã¯ã©ãã¯ããããšããããšãã§ããŸããïŒ
ãããã圌ã¯æåããŸããã ãŸãããã¹ãŠã®ãµãŒããŒã¡ãœããã¯ãã¯ã©ã€ã¢ã³ããã©ãŠã¶ãŒã«éä¿¡ããããšãã«ã¯ã©ã¹ã³ãŒãããåé€ãããŸãã ãã®ãããã³ã¡ã³ã/ãã£ã¬ã¯ãã£ã/ * scopeïŒ... * /ãæå³ãããŠããŸãã 第äºã«ãæãå ¬éãããŠãããµãŒããŒåŽã¡ãœããã®ã³ãŒãã¯ãã¯ã©ã€ã¢ã³ãåŽã§ãªã¢ãŒãåŒã³åºãã¡ã«ããºã ãå®è£ ããäžéæ§é ã«ãã£ãŠçœ®ãæããããŸãã
åã³ã»ãã¥ãªãã£ã«ã€ããŠã ã¯ã©ã€ã¢ã³ãã§ãµãŒããŒã¡ãœãããåŒã³åºãããšãã§ããå Žåããã®ãããªã¡ãœãããåŒã³åºãããšã¯ã§ããŸããïŒ ãããŠããããããŒã¿ããŒã¹ã®ã¯ãªãŒãã³ã°æ¹æ³ã§ããå Žåã¯ïŒ
ã¯ã©ã€ã¢ã³ãããã¯ãååã«$ãã¬ãã£ãã¯ã¹ãå«ãŸããã¡ãœããã®ã¿ãåŒã³åºãããšãã§ããŸãã ãã®ãããªæ¹æ³ã®å Žåããã§ãã¯ãšã¢ã¯ã»ã¹ã®ããžãã¯ãèªåã§æ±ºå®ããŸãã å€éšãŠãŒã¶ãŒã¯ã$ãªãã§ãµãŒããŒã¡ãœããã«ã¢ã¯ã»ã¹ã§ããããããã衚瀺ãããŸããïŒåã®åçãåç §ïŒ
ã¯ã©ã€ã¢ã³ããšãµãŒããŒãå¯æ¥ã«ãªã³ã¯ãããŠããã¢ããªã·ãã¯ãªã·ã¹ãã ãæã«å ¥ããããã§ãã æ°Žå¹³ã¹ã±ãŒãªã³ã°ã¯å¯èœã§ããïŒ
å®éãã·ã¹ãã ã¯ã¢ããªã·ãã¯ã«èŠããŸãããããã§ã¯ãããŸããã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯ãç°ãªããã·ã³äžã§ãã©ã€ããã§ããŸãã ã¯ã©ã€ã¢ã³ãã¯ããµãŒãããŒãã£ã®WebãµãŒããŒïŒNginxãApacheãªã©ïŒã§å®è¡ã§ããŸãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®åé¢ã®åé¡ã¯ãèªåãããžã§ã¯ããã«ããŒã«ãã£ãŠéåžžã«ç°¡åã«è§£æ±ºãããŸãïŒããã«ã€ããŠã¯å¥ã®æçš¿ãæžãããšãã§ããŸãïŒã å éšãµãŒãã¹ã¡ãã»ãŒãžã³ã°ã¡ã«ããºã ãå®è£ ããããã«ãã·ã¹ãã ã¯ãã¥ãŒã䜿çšããŸãïŒããã«ã¯Redisãå¿ èŠã§ãïŒã ãããã£ãŠãæ°ãããã·ã³ãè¿œå ããã ãã§ããµãŒããŒéšåãç°¡åã«æ°Žå¹³æ¹åã«æ¡åŒµã§ããŸãã
éåžžã®éçºã¢ãããŒãã§ã¯ãååãšããŠãããã¯ãšã³ãã¯ããŸããŸãªã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ïŒWebãµã€ããã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒãšæ¥ç¶ã§ããç¹å®ã®APIã»ãããæäŸããŸãã ããªãã®å ŽåãExt JSã§æžãããã¯ã©ã€ã¢ã³ãã ããããã¯ãšã³ãã§åäœã§ããããšãããããŸãããïŒ
ãµãŒããŒãç¹ã«ã¢ãžã¥ãŒã«ã¢ãã«ã§ã¯ãç¹å®ã®ããžãã¹ããžãã¯ãå®è£ ãããŸãã REST APIçµç±ã§ã¢ã¯ã»ã¹ã§ããããã«ããã«ã¯ãå°ããªãã©ãããŒãã§ååã§ãã 察å¿ããäŸã¯ããã®èšäºã®æåã®éšåã«èšèŒãããŠããŸãã
çµè«
ã芧ã®ãšãããããªãè€éãªã¢ããªã±ãŒã·ã§ã³ãå¿«é©ã«ã³ãŒãã£ã³ã°ããããã«ãããã³ããšã³ããšããã¯ãšã³ãã«1ã€ã®ã©ã€ãã©ãªãçšæããããšã§åå察å¿ã§ããŸãã ããã«ã¯å€§ããªå©ç¹ããããŸãã
éçºããã»ã¹ãã¹ããŒãã¢ããããŸãã åããŒã ã¡ã³ããŒã¯ãããã¯ãšã³ããšããã³ããšã³ãã§äœæ¥ã§ããŸãã ããã®APIããµãŒããŒã«è¡šç€ºãããã®ãåŸ ã£ãŠããããšããçç±ã§ã®ããŠã³ã¿ã€ã ã¯é¢ä¿ãããŸããã
å°ãªãã³ãŒãã ã³ãŒãã®åãã»ã¯ã·ã§ã³ãã¯ã©ã€ã¢ã³ããšãµãŒããŒã§äœ¿çšã§ããŸãïŒãã§ãã¯ãæ€èšŒãªã©ïŒã
ãã®ãããªã·ã¹ãã ãç¶æããããšã¯ãã¯ããã«ç°¡åã§å®äŸ¡ã§ãã 2人ã®å€æ§ãªããã°ã©ãã®ä»£ããã«ãã·ã¹ãã ã¯1人ïŒãŸãã¯åã2人ã§ãã亀æå¯èœïŒããµããŒãã§ããŸãã åãçç±ã§ãããŒã ã®é¢è·ã«äŒŽããªã¹ã¯ãäœããªããŸãã
ããã«äœ¿çšå¯èœãªãªã¢ã«ã¿ã€ã ã·ã¹ãã ãäœæããæ©èœã
ããã¯ãšã³ããšããã³ããšã³ãã«åäžã®ãã¹ãã·ã¹ãã ã䜿çšããŸãã