æè¡é¨ã®é«äºã§ãã
æè¿ãæ¥æ¬ã§ããã¤ã¯ããµã¼ãã¹ã¨ããè¨èãæµè¡ãã¤ã¤ããã¾ãã
ä»åã¯ããªãã¯ãã¯ãããããã¤ã¯ããµã¼ãã¹ãé¸æããã®ããã¾ãå®éã«ã©ã®ãããªããæ¹ããã¦ããã®ãã¨ãããã¨ãç´¹ä»ãã¾ãã
Conwayã®æ³å
ããæ°å¹´ã®éãã¯ãã¯ãããã¯ã¬ã·ãã®æ稿ã»æ¤ç´¢ãµã¼ãã¹ãããé£ãä¸å¿ã¨ããçæ´»ã®ã¤ã³ãã©ãã¨ãã¦äºæ¥é åãæ¡å¤§ãã¤ã¤ããã¾ããæµ·å¤ã¬ã·ããµã¼ãã¹ã®è²·åã«ããæµ·å¤å±éã¯ãåãªãééçãªé¢ä¿ã«ã¨ã©ã¾ããã人çã»æè¡çãªäº¤æµãå«ãã¦æ¬æ ¼åãã¤ã¤ããã¾ããã¾ãããã¢ãã¤ã«ãã¡ã¼ã¹ãããæ¨èªã¨ããã¢ãã¤ã«ã¢ããªã±ã¼ã·ã§ã³ã¸ã®åãçµã¿ãå éãã¦ãã¾ããã
äºæ¥é åã®æ¡å¤§ãã°ãã¼ãã«å±éãã¢ãã¤ã«ãã¡ã¼ã¹ãã¨ãã£ããã¸ãã¹è¦æ±ã®å¤åã«å¿ãã¦ãä¼ç¤¾ã®çµç¹æ§é ãå¤åãã¦ãã¾ããããã¦ãConwayã®æ³å ã¨ãã¦ç¥ããã¦ããããã«ãçµç¹æ§é ã¨ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ã«ã¯å¯æ¥ãªé¢ä¿ãããã¾ãã
Any organization that designs a system ... will inevitably produce a design whose structure is a copy of the organization's communication structure. ï¼Conway 1968ï¼
çµç¹æ§é ãå¤ããã®ã§ããã°ãã¯ãã¯ãããã®ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ãå¤åããªããã°ãªãã¾ããããçµç¹ã¨ã¢ã¼ããã¯ãã£ã¯åãå½¢ã§ããããã¢ã¼ããã¯ãã£ã¯ãã¼ã±ããã«å¾ããªããã°ãªããªããï¼Coplien and Harrison 2004ï¼ã®ã§ãã
ã¯ãã¯ãããã¯ã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ã®è»¢æãé²ãã¦ãã¾ããã大ããªã²ã¨ã¤ã®ã¢ããªã±ã¼ã·ã§ã³ãä¸ä¸¸ã¨ãªã£ã¦è²ã¦ãã¨ããã¢ãã«ãããèªå¾çãªã¢ããªã±ã¼ã·ã§ã³ç¾¤ãäºæ¥é åãå½ãè¶ãã¦é£æºããã¦ããã¢ãã«ã¸ã®è»¢æã§ãã
ã¢ããªã·ãã¯ã¢ã¼ããã¯ãã£
ã¯ãã¯ãããã¯ã巨大ãªã³ã¼ããã¼ã¹ãæã¤ã·ã¹ãã ã§ãããªãã¸ããªã«ã¯ãã¯ãã¯ãããã®ã¦ã§ããµã¤ãã®ããã®ã³ã¼ãã ãã§ã¯ãªããAPIã管çæ©è½ããããã¨ãã£ãè¤æ°ã®ãµãã·ã¹ãã ã®ããã®ã³ã¼ããå«ã¾ãã¦ãããã¡ã³ããã³ã¹ããã¦ãã¾ãããã®ä»çµã¿ã¯ãã¯ãã¯ãããã¨ãããµã¼ãã¹ãä¼ç¤¾ã«æå±ããéçºè ã®ã»ã¼å ¨å¡ãéçºããç¶æãã¦ããã¨ããã¢ãã«ã®ãã¨ã§ã¯ããã¾ãæ©è½ãã¦ãã¾ããã
ã¨ã¯ãããã¾ã£ããåé¡ããªãã£ããã¨ããã¨ãããã§ã¯ããã¾ããã
ã³ã¼ããè¤æ°ãµãã·ã¹ãã éã§å ±æãã¦ãããããå ±æãããã³ã¼ãã«ã¯ãç¹å®ã®ãµãã·ã¹ãã ãããã使ããªãã¢ãã«ãåå¨ããããç¹å®ã®ãµãã·ã¹ãã ããããå¼ã°ããªãã¡ã½ããããã£ãããã¾ããã¢ãã«ãè¤æ°ã®ã³ã³ãã¯ã¹ãã«æå±ãã¦ãããããå ¨ä½åã®ç解ãé£ãããæå³ããªãã¨ããã®å¤æ´ã®å½±é¿ããããããå¦çã®æµããã¤ãã¿ã«ããã³ã¼ãã«ãªã£ã¦ãã¾ã£ã¦ãã¾ããã
ã¾ããèªåãã¹ãã®å®è¡æéãé常ã«é·ããªã£ã¦ãã¾ãã¨ããåé¡ãããã¾ããã¯ãã¯ãããã§ã¯ãç¾å¨17,000é ç®ãè¶ ããèªåãã¹ããåå¨ãã¾ããRRRspec ã¨ããåæ£ãã¹ãå®è¡ã·ã¹ãã ã«ãã£ã¦ãã¹ãã並ååãããã¨ã«ããå®è¡æéã10ååå¾ã«ã¨ã©ãã¦ãã¾ããããããå°ãªããªãã³ã¹ãããããããã§ãããããå®ç¾ã§ãã¦ãããã¨ã§ãã
ãã®ä»ããããã¤ã¡ã³ãã«ãå½±é¿ãã§ã¦ãã¾ããã¯ãã¯ãããã§ã¯ããããã¤ã¡ã³ãã¯ç¶ç¶çã¤ã³ãã°ã¬ã¼ã·ã§ã³ã«ãã£ã¦èªåãã¹ããééãããªãã¸ã§ã³ã®ã³ã¼ãã ãã¨ããã«ã¼ã«ãããã¾ãããã®ããããããã¤ããããµãã·ã¹ãã ã®ã³ã¼ãã«åé¡ããªãã¦ããå¥ã®ãµãã·ã¹ãã ãå©ç¨ãã¦ããã³ã¼ãã«ãã£ã¦ãã¹ãã失æãããããã¤ãã§ããªãã¨ãããã¨ãçºçãããã®ã§ããã¾ãããªãªã¼ã¹ããæ©è½ã¯åé¡ããªãã¦ããä»ã®é¨åã«åé¡ããã£ãããããã¼ã«ããã¯ãããªãã¦ã¯ãªããªããªã£ãã¨ãããã¨ãããã¾ããã
éçºè å人ãå ¨ä½ãææ¡ã§ããè¦æ¨¡ã®ããã¸ã§ã¯ãã§ããã°ãå¯çµåãªã³ã¼ãã«ã¯ååãªã¡ãªããããããå¹çè¯ãæ©è½ãã¾ããããããä¸å®ã®è¦æ¨¡ãè¶ããã¨ãããè¦çã«ãªããèãããããã®ã«ãªã£ã¦ãã¾ãã¾ãã
RESTful Hypermedia API
ãã®ãããªå·¨å¤§ãªã¢ããªã±ã¼ã·ã§ã³ã®ã³ã¼ããã¼ã¹ã«ããã以ä¸ã·ã¹ãã ãçµã¿è¾¼ã¿ãåå± ããã¦ããã¨ãããã¨ã¯ç¾å®çãªé¸æã§ã¯ããã¾ããããã¤ã¦ã®ã¯ãã¯ãããã§ã¯ããã¼ã¿ã®å ±æãããããã«ã³ã¼ãã®å ±æããã¦ãã¾ããããããã«ããã¼ã¿ã®å ±æã®ããã«RESTful JSON APIãæ§ç¯ãããã¨ã§ãã³ã¼ãã®å ±æãªãã«ãã¼ã¿ã®å ±æãããããæ¹ã¸ã¨å¤§ããæ¹éãå¤ããã®ã§ãã
RESTful JSON APIã¨ä¸è¨ã§è¡¨ç¾ãã¦ããå³å¯ãªè¦æ ¼ãããããã§ã¯ããã¾ãããã§ããããã¢ããªã±ã¼ã·ã§ã³ãã¨ã«ããããAPIãå®è£ ããã¨ãã¾ã£ããç°ãªã£ãè¨è¨ææ³ã«ãã¨ã¥ããã©ãã©ãªAPIãã§ãããã£ã¦ãã¾ãã¾ãã
ããã§ãã¼ãã¤ã³ãã«ãªãã®ããGarageã¨ãã°ãã社å ã©ã¤ãã©ãªã§ããGarageã¯ãRESTfulã§ãããHypermediaã«ç¾å®çãªã¬ãã«ã§å¯¾å¿ãããï¼Miyagawa 2013ï¼ã¨ããææ³ã§è¨è¨ããããRESTful APIãRailsä¸ã§å®è£ ããããã®ã©ã¤ãã©ãªã§ãã
Garageã®ç¹å¾´ã¯ã次ã®2ç¹ã§ãã
- ãªã½ã¼ã¹æ¦å¿µã®å°å ¥
- OAuth 2.0ã¨çµ±åãããã¢ã¯ã»ã¹å¶å¾¡
Garageãæ¡ç¨ãããã¨ã§ãRESTfulãHATEOASã¨ãã£ãè¨è¨ææ³ã¨ãJSONãOAuth 2.0ã¨ãã£ãæ¨æºãåãå ¥ããAPIã容æã«å®è£ ãããã¨ãã§ããããã«ãªãã¾ãã
Garage
ã§ã¯ãå®éã«Garageãå©ç¨ããã³ã¼ããè¦ã¦ã¿ã¾ãããã次ã®ã³ã¼ãã¯ãGarageãã¤ãã£ãRailsã®ã¢ãã«ã«ãªãã¾ããGarage::Representer
ã¯ãã«ãã¼ã¢ã¸ã¥ã¼ã«ã§ãActiveRecordãªãã¸ã§ã¯ãããªã½ã¼ã¹ã¨ãã¦è¡¨ç¾ããããã®æå©ãããã¦ããã¾ãã
class Employee < ActiveRecord::Base include Garage::Representer belongs_to :division property :id property :title property :first_name property :last_name property :division, selectable: true link(:division) { division_path(division) } def self.build_permissions(perms, other, target) perms.permits! :read end end
ãªã½ã¼ã¹ã¯ãã¡ããã©ã¢ãã«ã¨ãã¥ã¼ã¨ã®ä¸éã«ããããããªæ¦å¿µã§ãRESTfulãªæä½ã®åä½ã§ããããJSONå½¢å¼ã¸ã®ã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ãæ å½ãã¾ããã¾ãããªã½ã¼ã¹ã¯å¿ ãããActiveRecordãªãã¸ã§ã¯ãã§ãªãã¦ããã¾ãã¾ããã
property
ã link
ã¨ãã£ãè¦æ
£ããªã宣è¨ãç®ã«ã¤ãããããã¾ããããããã¯ãGarageã«ãã£ã¦è¿½å ãããã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ã®ããã®å®£è¨ã§ããproperty
宣è¨ã¯ãã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ããã¢ãã«ã®å±æ§ãæå®ãã¾ããlink
宣è¨ã¯ãé¢é£ãããªã½ã¼ã¹ããã¤ãã¼ã¡ãã£ã¢ã§è¡¨ç¾ããããã®å®£è¨ã§ãã
build_permissions
ã¯ã©ã¹ã¡ã½ããã¯ãã¢ã¯ã»ã¹å¶å¾¡ã®ããã®ã¡ã½ããã§ãããããªã½ã¼ã¹ãããªã½ã¼ã¹ãªã¼ãã¼ã«ãã£ã¦ã®ã¿æ´æ°ã§ããããã«ãããã±ã¼ã¹ãªã©ããªã½ã¼ã¹åä½ã§ã®ã¢ã¯ã»ã¹å¶å¾¡ã«å©ç¨ãã¾ããGarageã¯ãOAuth 2.0 ã¹ã³ã¼ãã«ããã¢ã¯ã»ã¹å¶å¾¡ãåºæ¬ã¨ãã¦ãã¾ãããããã¨çµã¿åããããã¨ã«ãã£ã¦ç´°ããªã¢ã¯ã»ã¹å¶å¾¡ãå®ç¾ãã¾ãã
ã³ã³ããã¼ã©ã§ã¯ã Garage::RestfulActions
ã¢ã¸ã¥ã¼ã«ãã¤ã³ã¯ã«ã¼ããã¾ããããã«ãã£ã¦ãCRUDã®çæãã¢ã¯ã»ã¹å¶å¾¡ã®æ©è½ãå®ç¾ããã¾ãã
class EmployeesController < ApplicationController include Garage::RestfulActions def require_resources @resources = Employee.all end end
ãã®ããã«å®ç¾©ãããªã½ã¼ã¹ã«å¯¾ããå®éã«cURLã§ãªã¯ã¨ã¹ããéã£ã¦ã¿ãã¨ã次ã®ãããªçµæãå¾ããã¨ãã§ãã¾ãã
% curl -s -H 'Authorization: Bearer xxxxxxxx' 'http://localhost:3000/employees' | json_pp [ { "_links" : { "division" : { "href" : "/divisions/1" } }, "title" : "Manager", "id" : 1, "last_name" : "Cooper", "first_name" : "Alice" }, { "_links" : { "division" : { "href" : "/divisions/1" } }, "title" : null, "id" : 2, "last_name" : "Dylan", "first_name" : "Bob" } ]
è¤æ°ã®ãªã½ã¼ã¹ãJSONã®é
åã¨ãã¦åå¾ã§ãã¾ãããåã
ã®ãªã½ã¼ã¹ã«ã¯ãproperty
宣è¨ã§æå®ãããã®ãå«ã¾ãã¦ãã¾ããã¾ããlink
宣è¨ã§æå®ãããã¤ãã¼ãªã³ã¯ãã_links
ã¨ãããã¼ã®å¤ã¨ãã¦å«ã¾ãã¦ãã¾ãã
ã¯ã¨ãªãã©ã¡ã¼ã¿ã« fields
ã¨ããé
ç®ã追å ãããªã½ã¼ã¹ããåå¾ãããã£ã¼ã«ããæå®ãããã¨ãã§ãã¾ããããã¯ãGarageã®æ©è½ã®ã²ã¨ã¤ã§ãã
% curl -s -H 'Authorization: Bearer xxxxxxxx' 'http://localhost:3000/employees?fields=id,division' | json_pp [ { "division" : { "name" : "Music", "id" : 1, "phone" : "008" }, "id" : 1 }, { "division" : { "name" : "Music", "id" : 1, "phone" : "008" }, "id" : 2 } ]
æ示çã«åå¾ãããã£ã¼ã«ããæå®ãããã¨ã§ãproperty
宣è¨ã§ selectable
ã¨ãã¦ãããã£ã¼ã«ããåå¾ãããã¨ãã§ãã¾ãããé¢é£ãããªã½ã¼ã¹ããã¹ãããããªã½ã¼ã¹ã¨ãã¦åãè¾¼ã¾ãã¦ãããã¨ã«ã注ç®ãã¦ãã ããã
Pantryman
Garageã«ãã£ã¦ãRESTful JSON APIã®è¨è¨ãçµ±ä¸ãããã¨ã®ã¡ãªããã®ã²ã¨ã¤ã«ãæ±ç¨çãªã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªãå©ç¨ã§ããã¨ãããã®ãããã¾ããGarageãæ¡ç¨ãã¦å®è£ ãããAPIã§ããã°ãã¢ããªã±ã¼ã·ã§ã³æ¯ã«ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªãå®è£ ããå¿ è¦ãããã¾ããã
Pantrymanã¨å¼ã°ãã社å ã©ã¤ãã©ãªãå©ç¨ããã¨ãããã»ã©ã®APIã«ã¢ã¯ã»ã¹ããã³ã¼ãã次ã®ããã«æ¸ããã¨ãã§ãã¾ãã
client = Pantryman::Client.new(access_token: 'xxxxxxxx') employees = client.get('/employees') employees.each do |employee| puts <<-EOF ID: #{employee.id} Title: #{employee.title || '-'} Name: #{employee.first_name} #{employee.last_name} EOF end
å ¬è¡¨ãããè¨èªï¼Published Languageï¼
Garageãæ¡ç¨ãããã¨ã«ãã£ã¦ãRESTful JSON APIã«ãããJSONãã¼ã¿å½¢å¼è¡¨ç¾ã®çµ±ä¸ããOAuth 2.0ã«ãã¨ã¥ãã¢ã¯ã»ã¹å¶å¾¡ãçµ±ä¸çãªå®è£ ã§å®ç¾ã§ããããã«ãªãã¾ããã
ãã¤ã¯ããµã¼ãã¹ã®æèã§ãã°ãã°åãä¸ããããæ¦å¿µã®ã²ã¨ã¤ã«ãããã¡ã¤ã³é§åè¨è¨ãã§ç´¹ä»ããã¦ãããã¿ã¼ã³ã§ãããå¢çã¥ããããã³ã³ããã¹ãï¼Bounded Contextï¼ããããã¾ãããã¨ãã°ãSoundCloudã§ã¯ãå¢çã¥ããããã³ã³ããã¹ãããµã¼ãã¹æ½åºã®åä½ã¨ãã¦ãããã¨ãç´¹ä»ããã¦ãã¾ãã
å¢çã¥ããããã³ã³ããã¹ãã¨ããæ¦å¿µãæ¡ç¨ãããªãã°ããããã®éã§ã©ã®ããã«æ å ±ãã³ãã¥ãã±ã¼ã·ã§ã³ããããã¨ãããã¨ããåæ§ã«éè¦ã¨ãªãã¾ãããã®ããã®ãã¿ã¼ã³ãããå ¬è¡¨ãããè¨èªï¼Published Languageï¼ãã§ãã
å¿ è¦ãªãã¡ã¤ã³ã®æ å ±ãã³ãã¥ãã±ã¼ã·ã§ã³ã«ãããå ±éã®åªä½ã¨ãã¦è¡¨ç¾ã§ãããæ確ã«ããã¥ã¡ã³ãåãããå ±æè¨èªã使ç¨ããå¿ è¦ã«å¿ãã¦ãã®è¨èªã¸ã®å¤æã¨ããã®è¨èªããã®å¤æãè¡ãªããã¨ï¼Evans 2003ï¼
ã¯ãã¯ãããã«ãããGarageã¯ãã¡ããã©ãã®å ¬è¡¨ãããè¨èªã®æ©è½ãæã£ã¦ãã¾ããã©ã®ãããªã¢ããªã±ã¼ã·ã§ã³ã§ãããGarageã¨ããå ¬è¡¨ãããè¨èªãåãããã¨ã§ãä»ã®ã¢ããªã±ã¼ã·ã§ã³ã¨çµ±ä¸çã§ä¸è²«ããæ å ±ã®ããã¨ããã§ããããã«ãªã£ã¦ããã®ã§ãã
ãã¤ã¯ããµã¼ãã¹ï¼Microservicesï¼
ã¯ãã¯ãããããã¢ããªã·ãã¯ã¢ã¼ããã¯ãã£ããGarageãåºç¤ã¨ããã¢ã¼ããã¯ãã£ã¸ã®è»¢æãå§ãã¦ãã1年以ä¸ãçµã¡ã¾ãããç¾å¨ã®ã¯ãã¯ãããã®ããããã¼ã¸ã¯ãå®ã®ã¨ããè²ã ãªãµã¼ãã¹ããæ å ±ãåå¾ããã²ã¨ã¤ã®ãã¼ã¸ã¨ãã¦è¡¨ç¤ºããããã«ãªã£ã¦ãã¾ãã
ãã¨ãã°ãæ¯æ¥ã®ããããã¬ã·ãã®åç»ããã®ã²ã¨ã¤ã§ããããã¯ãæçåç»ã®æ å ±ãAPIçµç±ã§åå¾ãã表示ãã¦ãã¾ãããã®ä»ã«ãæ²ç¤ºæ¿ãæçæ室ã«ã¤ãã¦ãåæ§ã§ãããããã®ãµã¼ãã¹ã¯ãããããç¬ç«ãããã¼ã ãéçºããç¬ç«ããã¢ããªã±ã¼ã·ã§ã³ã¨ãã¦æ§ç¯ããã¦ãã¾ãã
ãã®ããã«ã¯ãã¯ãããã§ã¯ãæ°è¦ã®ã¢ããªã±ã¼ã·ã§ã³ãç¬ç«ãããã¼ã ã«ããç¬ç«ãããµã¼ãã¹ã¨ãã¦éçºããããããé£æºããã¦ããã¨ããã¢ããã¼ããã¨ãããã«ãªãã¾ãããç§ãã¡ã¯ããã®ã¢ã¼ããã¯ãã£ããã¤ã¯ããµã¼ãã¹ï¼Microservicesï¼ã¨ãã¦ä½ç½®ä»ããããå¼ãã§ãã¾ãã
"Microservices: Decomposing Applications for Deployability and Scalability"ï¼Richardson 2014 ï¼ã¨ããè¨äºã®ä¸ã§ããã¤ã¯ããµã¼ãã¹ã®ã¡ãªããã«ã¤ãã¦æ¬¡ã®ãããªãã®ãæãããã¦ãã¾ãã
- ãµã¼ãã¹ãç¸å¯¾çã«å°ãããããã¨ãã§ãã
- ä»ã®ãµã¼ãã¹ã¨ç¬ç«ãã¦ãããã¤ã§ãã
- ã¹ã±ã¼ã«æ¦ç¥ãä»ã®ãµã¼ãã¹ããç¬ç«ãã¦è¡ãªãã
- ä»ã®ãµã¼ãã¹ã«ããé害ã®å½±é¿ãåé¢ãããã¨ãã§ãã
- ç¹å®ã®æè¡ã¸ã®ããã¯ã¤ã³ãé¿ãããã¨ãã§ãã
ã¯ãã¯ãããã®çµé¨ã§ãããã¤ã¯ããµã¼ãã¹åã«ãã£ã¦ããããããã®ãããªã¡ãªãããåãããã¨ãã§ãã¦ããã¨æãã¦ãã¾ããã¯ãã¯ãããèªä½ã®ã³ã¼ããã¼ã¹ã¯å·¨å¤§ãªã¾ã¾ã§ãããããããã®ãµã¼ãã¹ã¯ããããç¬ç«ãã巨大ãªã³ã¼ããã¼ã¹ã®éãã«ã²ããããããã¨ãªãã¹ãã¼ãæããã£ã¦ãµã¼ãã¹éçºãã§ãã¦ãã¾ãã
ä¸æ¹ã§ãç¹å®ã®æè¡ã¸ã®ããã¯ã¤ã³ãé¿ãããã¨ãã§ããã¨ããç¹ã§ã¯ãã¾ã ã¾ã Ruby on Railsã¨ããé¸æã主æµã¨ãªã£ã¦ãã¾ãããã®ç¹ã«ã¤ãã¦ã¯ããã£ã¨ãã£ã¬ã³ã¸ããä½å°ãããã®ã§ã¯ãªããã¨æãã¦ãã¾ããç¹ã«ãã¦ã¼ã¶ã¼ã¤ã³ã¿ãã§ã¼ã¹ããªãããã¯ã¨ã³ãã®ãµã¼ãã¹ã«ã¤ãã¦ã¯ãå¥ã®è¨èªããã¬ã¼ã ã¯ã¼ã¯ãæ¡ç¨ãã¦ããããã¨èãã¦ãã¾ãã
ã¾ã¨ã
ã¯ãã¯ãããã¯ããã¸ãã¹ç°å¢ã®å¤åã«ã¨ããªãçµç¹æ§é ã®å¤åã«ãããã¦ãã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£ãã¢ããªã·ãã¯ã¢ã¼ããã¯ãã£ãããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¸ã¨é²åããã¦ãã¾ãããããã§ã®ãã¼ãã¤ã³ãã¯ãRESTful JSON APIãOAuth 2.0ã¨ãã£ãã¦ã§ãã§å¹ããã¦ããæè¡ãæ¡ç¨ãã¦ããç¹ã§ããããã«ããã軽éãªççµåã¢ã¼ããã¯ãã£ãå®ç¾ãã¦ãã¾ãã
ãã®çµæã¨ãã¦ãç¬ç«æ§ã®é«ããã¼ã ãæ¯è¼çå°ããªãµã¼ãã¹ãç´ æ©ãéçºããã¦ã¼ã¶ã¼ããã«ã¹ãã¼ãæããã£ã¦ä¾¡å¤ãå±ããã¨ããä½å¶ãã§ãã¾ãããããã¯ãä»ã¾ã§éãã«ã¯ãã¯ãããã«å ¨ã¦ãè©°ãè¾¼ãã¨ããããæ¹ã§ã¯ã§ããªãã£ããã¨ã§ããä»å¾ã¯ãããããããæ¹ããã£ã¨æ¨ãé²ãããããªãå¹æãçã£ã¦ããããã¨ãããã¾ãã
ãªããã¯ãã¯ãããã§ã¯ãã¤ã¯ããµã¼ãã¹åãå¼·åã«æ¨é²ãã¦ãã仲éãåéãã¦ãã¾ãããã®ã¨ã³ããªãèªãã§ãèå³ããæã¡ããã ããæ¹ã¯ããã²ã¨ããå¿åãã ããã