ã¯ããã«
è»èŒªãåçºæããã®ã¯å¥œãã§ã¯ãªãã®ã§ããã®èšäºã¯æžããŸããããããªããã°ãªããŸããã§ããã RESTã«ã€ããŠã¯ãã§ã«å€ãã®ããšãè¿°ã¹ãŠããŸãã å€ãã®WebãµãŒãã¹ãããã€ããŒã¯ããµãŒãã¹ãRESTfulã§ããããšãèªããŸãã ã€ã³ã¿ãã¥ãŒäžã«ãããã¯ãšã³ããã¢ãã€ã«ããŸãã¯ããã³ããšã³ãã®éçºè åãã®ã€ã³ã¿ãã¥ãŒã§ãããã©ããã«é¢ä¿ãªããRESTã«é¢ããå°ãªããšãããã€ãã®è³ªåãééããªãèãããšãã§ããŸãã ããã€ã³ã¿ãã¥ãŒã®äžã§ããã®è³ªåããããããšãäžåºŠãããŸãããå±¥æŽæžã«RESTãç¥ã£ãŠããããšãæžããã®ã§ã ãªãœãŒã¹ãRESTfulãµãŒãã¹ãžã®ãªã¯ãšã¹ãã§èŠã€ãããªãã£ãå Žåãã©ã®HTTPã³ãŒããåãåããŸããïŒ åç404ãæºå ŽäžèŽã§æ¡æãããŸããã æ£çŽãªãšããããã®è³ªåãRESTãç¥ã£ãŠãããã©ãããç解ããã®ã«ã©ã®ããã«åœ¹ç«ã€ãã¯ãŸã ããããŸããã§ããããèªä¿¡ãæã£ãŠèšããããšã¯1ã€ã§ãã é·ãéç§ãæ©ãŸããŠããããã€ãã®è³ªåããããŸãïŒ
- ãªãRESTã¯ãããªã«æµè¡ã«ãªã£ãã®ã§ããïŒ ãã®ã¢ãŒããã¯ãã£ã¯2000幎ã«ææ¡ãããŸãããïŒ
- ãµãŒãã¹ãRESTfulã§ããå ŽåãäœãåãåããŸããïŒ
- ãµãŒãã¹ãRESTfulãã©ãããå€æããæ¹æ³ã¯ïŒ
- RESTãµãŒãã¹URLãã©ã®ããã«æ£ããäœæããå¿ èŠããããŸããïŒ
- RESTfulãµãŒãã¹ã§äœ¿çšããhttpã¡ãœãããšã³ãŒãã¯äœã§ããïŒ
ãããã®è³ªåã®å°ãªããšã1ã€ã«å®å šãªçããåºãããšãã§ããªãå Žåã¯ãèªã¿ç¶ããŠãã ããã ãããã®ãã¹ãŠã®è³ªåã«æ確ã«åçã§ããå Žåã¯ãæ£ããURLã®åœ¢åŒãæå®ããGETãPOSTãPUTãDELETEããªãœãŒã¹ã䜿çšããCRUDæäœã«å¯Ÿå¿ããŠããå¿ èŠãããããšãèæ ®ããå¿ ãèªã¿ç¶ããå¿ èŠããããŸãã
äžèšã®è³ªåã«å¯ŸããçããèŠã€ããŠå šäœåã瀺ãããã«ãã€ã³ã¿ãŒããããç¹ã«Stack Overflowã§å€ãã®æ··ä¹±ããã£ãããšãå€æãããããäžé£ã®ä»æ§ãRoy Fieldingã®è«æãããã³Leonard Richardsonã®æ¬ãèªãå¿ èŠããããŸããã ç§ãèŠã€ããæ å ±ã¯ããªã圹ç«ã€ããã«æããã®ã§ãç§ã¯ãããããªããšå ±æããããšã«ããŸããã
WebãµãŒãã¹ã®èŠ³ç¹ããRESTãæ€èšããŠããããããã®èšäºã§ã¯ãå šäœåãè¡šãããã«ç¥ã£ãŠããå¿ èŠã®ãããã¹ãŠã®ããšãè¿°ã¹ãããšããŸããã
ããã§ã¯ãWebãµãŒãã¹ã®äžçãžã®æ ãå§ããŸãããã
SOAããã³WebãµãŒãã¹
ãµãŒãã¹æåã¢ãŒããã¯ãã£ãšããŠæ¡åŒµå¯èœãªSOAã¯ãããŸããŸãªææé åã§å¶åŸ¡ã§ããåæ£ã·ã¹ãã ãç·šæããã³äœ¿çšããããã®ãã©ãã€ã ã§ã[1]ã SOAã§ã¯ããµãŒãã¹ã¯æ¬¡ã®åºæºãæºããæ©èœãæããŸã[2]ã
- ç¹å®ã®çµæãæã€æ©èœãè¡šããŸãã
- èªå·±å®çµåã§ãã
- 顧客ã«ãšã£ãŠã¯ãã©ãã¯ããã¯ã¹ã§ãã
- ä»ã®ãµãŒãã¹ã§æ§æãããå ŽåããããŸãã
ãµãŒãã¹ã®èª¬æ -ããã¯ããµãŒãã¹ãšã®å¯Ÿè©±ã«å¿ èŠãªãµãŒãã¹ã«é¢ããæ å ±ã§ãïŒWSDLãªã©ïŒã
ãµãŒãã¹ãããã€ããŒã¯ã ãµãŒãã¹ãæäŸãã人ãŸãã¯çµç¹ã§ãã
ãµãŒãã¹æ¶è²»è -ãããã¯é¡§å®¢ã§ããããµãŒãã¹ã®æ¶è²»è ã§ãã
å®çŸ©[3]ã«ãããšã WebãµãŒãã¹ã¯ããããã¯ãŒã¯ãä»ãããã·ã³/ããã°ã©ã ã®çžäºäœçšã®ããã«èšèšãããã·ã¹ãã ã§ãã WebãµãŒãã¹ã«ã¯ããã·ã³åŠç圢åŒïŒãµãŒãã¹ã®èª¬æïŒã§èšè¿°ãããã€ã³ã¿ãŒãã§ã€ã¹ãå¿ èŠã§ãã ä»ã®ã·ã¹ãã ã¯ãã¡ãã»ãŒãžãä»ããŠWebãµãŒãã¹ãšå¯Ÿè©±ããå¿ èŠããããŸãã
WebãµãŒãã¹ãšSOAã®é¢ä¿ã¯ãWebãµãŒãã¹ãéããŠSOAãå®è£ ã§ãããšããããšã§ãã
SOAãå®è£ ããããã«ä»ã«ååšããããŸãã¯ååšããæ¹æ³ã«èå³ãããå Žåã¯ãCOMããã³CORBAãã芧ãã ããã
WebãµãŒãã¹ãããã³ã«
ã©ã®ãµãŒãã¹ãRESTfulã§ãã©ã®ãµãŒãã¹ãRESTfulã§ã¯ãªããã決å®ããåã«ãããã€ãã®å®è£ ããŸãã¯WebãµãŒãã¹ãããã³ã«ãšåŒã°ããæ¹æ³ãæ€èšããŠãã ããã æåãªWebãµãŒãã¹ãããã³ã«ã®ãªã¹ãã¯[4]ã«ãããŸãã
1. XML-RPC
XML-RPCïŒXMLãªã¢ãŒãããã·ãŒãžã£ã³ãŒã«ïŒãããã³ã«[5]ã¯ã1999幎ã«æåã«å ¬éãããŸããã XML-RPCã¡ãã»ãŒãžå šäœãHTTP-POSTãªã¯ãšã¹ãã§ãã XMLã¯ã¡ãã»ãŒãžã®ãšã³ã³ãŒãã«äœ¿çšãããŸãã ããã·ãŒãžã£ãã©ã¡ãŒã¿ã«ã¯ãã¹ã«ã©ãŒå€ãæ°å€ãæååãæ¥ä»ãé åãæ§é ã䜿çšã§ããŸãã WebãµãŒãã¹ã®å¿çã«ã¯ãããã·ãŒãžã£ããè¿ãããå€ããŸãã¯ã³ãŒããšãšã©ãŒã¡ãã»ãŒãžãæ ŒçŽã§ããŸãã
èŠæ±ãšå¿çã®äŸïŒäŸã¯ä»æ§èªäœããæäŸãããŸã[5]ïŒïŒ
Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>
HTTP/1.1 200 OK Connection: close Content-Length: 158 Content-Type: text/xml Date: Fri, 17 Jul 1998 19:55:08 GMT Server: UserLand Frontier/5.1.2-WinNT <?xml version="1.0"?> <methodResponse> <params> <param> <value><string>South Dakota</string></value> </param> </params> </methodResponse>
XML-RPCãããã³ã«ã®çæãšããŠã倧ããªã¡ãã»ãŒãžãµã€ãºïŒéåžžã®XMLã®4åïŒããã³WebãµãŒãã¹èšè¿°èšèªïŒWSDLã«äŒŒããã®ïŒã®æ¬ åŠããããããã䜿çšããŠãããã·ã¯ã©ã¹ãçæã§ããŸããã¯ã©ã€ã¢ã³ãåŽã
2. JSON-RPC
2009幎ã«å ¬éãããJSON-RPCãããã³ã«[6]ã¯ããã®åäœåçãXML-RPCã«éåžžã«äŒŒãŠããŸãã äž»ãªéãã¯ãããŒã¿ã®ãšã³ã³ãŒãæ¹æ³ããã©ã³ã¹ããŒãå±€ããã®ç¬ç«æ§ãéç¥ïŒéç¥èŠæ±ïŒã®éä¿¡æ©èœãããã³è€æ°ã®èŠæ±ãåæã«éä¿¡ããéã®å¿çã®èå¥æ©èœã§ãã
JSON-RPCã¯JSONã䜿çšããŠããŒã¿ããšã³ã³ãŒãããŸãã ããã·ãŒãžã£ãšãã©ã¡ãŒã¿ã®ååã«å ããŠããªã¯ãšã¹ãã¯idå€ã瀺ããŸããããã¯ãã¯ã©ã€ã¢ã³ãåŽã§ã¬ã¹ãã³ã¹ãèå¥ããããã«äœ¿çšãããŸãã ã€ãŸããid = 12345ã®ãªã¯ãšã¹ããéä¿¡ããå Žåããã®ãªã¯ãšã¹ãã®ã¬ã¹ãã³ã¹ã¯id = 12345ã®ã¡ãã»ãŒãžãè¿ãå¿ èŠããããŸãã
éç¥-ãããã¯ããµãŒããŒãå¿çããªãå¯èœæ§ãããç¹å¥ãªèŠæ±ã§ãã ãªã¯ãšã¹ããéç¥ãšããŠããŒã¯ããã«ã¯ãidãã©ã¡ãŒã¿ãŒå€= nullãæå®ããŸãã
ãã©ã³ã¹ããŒãå±€ããã®ç¬ç«ã¯ãJSON-RPC [6]ä»æ§ãHTTPãå¿ é ãããã³ã«ãšããŠæå®ããŠããªããšããäºå®ã«ãã£ãŠã®ã¿åŒãèµ·ããããŸãã HTTPã§JSON-RPCã䜿çšããå ŽåãPOSTèŠæ±ã䜿çšããå¿ èŠããããŸãã
JSON-RPCãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®äŸïŒ
--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1} <-- {"jsonrpc": "2.0", "result": 19, "id": 1} --> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3} <-- {"jsonrpc": "2.0", "result": 19, "id": 3}
XML-RPCã®å Žåã®ããã«ãJSON-RPCã®æ¬ ç¹ã¯ãWebãµãŒãã¹èšè¿°èšèªã®æ¬ åŠã§ãïŒWSDLã«äŒŒãŠããŸãïŒã
3. SOAP
Simple Object Access ProtocolïŒSOAPïŒ[7]ã¯XML-RPCã®åŸç¶ã§ãã SOAPã®äž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- éä¿¡ããããã¹ãŠã®ã¡ãã»ãŒãžã¯ãXMLïŒSOAPã¡ãã»ãŒãžïŒã䜿çšããŠãšã³ã³ãŒããããŸãã
- ãã¹ãŠã®SOAPãµãŒãã¹ã«ã¯ãXMLã§ãããWSDLã®èª¬æããããŸãã ããã«ãããã¯ã©ã€ã¢ã³ãã¯ãããã·ã¯ã©ã¹ãèªåçã«çæã§ããŸãã
- SOAPã¯ãã»ãŒãã¹ãŠã®æ¢ç¥ã®TCP / IPãããã³ã«ïŒTCPãUDPãHTTPãSMTPãFTPãªã©ïŒããµããŒãããŸãã ãã®ãããSOAPã¯ä»¥åã®ãããã³ã«ã«æ¯ã¹ãŠããªãè€éãªãããã³ã«ã§ãã
- HTTPã䜿çšããå ŽåãGETã¡ãœãããšPOSTã¡ãœããã®äž¡æ¹ããµããŒããããŸãã GETã¯ãããŒã¿ã®åä¿¡ã«ã®ã¿äœ¿çšã§ããŸãã ãµãŒããŒåŽã§ã¯ãäœãå€æŽããªãã§ãã ããã POSTã¯ããããå Žé¢ã§äœ¿çšã§ããŸãã å®éã«ã¯ãéåžžPOSTã®ã¿ã䜿çšãããŸãã
SOAPã®äž»ãªæ¬ ç¹ã¯ãæè»æ§ã«ããè€éãã§ãã ãã1ã€ã®éèŠãªæ¬ ç¹ã¯ãXMLã®ã¿ã§ã®ã³ãŒãã£ã³ã°ã®ãµããŒãã§ãã
SOAPãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®äŸïŒ
HTTP GETïŒ
HTTP POSTïŒ
GET /travelcompany.example.org/reservations?code=FT35ZBQ HTTP/1.1 Host: travelcompany.example.org Accept: text/html;q=0.5, application/soap+xml
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Header> <m:reservation xmlns:m="http://travelcompany.example.org/reservation" env:role="http://www.w3.org/2003/05/soap-envelope/role/next" env:mustUnderstand="true"> <m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference> <m:dateAndTime>2001-11-30T16:25:00.000-05:00</m:dateAndTime> </m:reservation> </env:Header> <env:Body> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:x="http://travelcompany.example.org/vocab#" env:encodingStyle="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <x:ReservationRequest rdf:about="http://travelcompany.example.org/reservations?code=FT35ZBQ"> <x:passenger>Ã
ke Jógvan Ãyvind</x:passenger> <x:outbound> <x:TravelRequest> <x:to>LAX</x:to> <x:from>LGA</x:from> <x:date>2001-12-14</x:date> </x:TravelRequest> </x:outbound> <x:return> <x:TravelRequest> <x:to>JFK</x:to> <x:from>LAX</x:from> <x:date>2001-12-20</x:date> </x:TravelRequest> </x:return> </x:ReservationRequest> </rdf:RDF> </env:Body> </env:Envelope>
HTTP POSTïŒ
POST /Reservations HTTP/1.1 Host: travelcompany.example.org Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > <env:Header> <t:transaction xmlns:t="http://thirdparty.example.org/transaction" env:encodingStyle="http://example.com/encoding" env:mustUnderstand="true" >5</t:transaction> </env:Header> <env:Body> <m:chargeReservation env:encodingStyle="http://www.w3.org/2003/05/soap-encoding" xmlns:m="http://travelcompany.example.org/"> <m:reservation xmlns:m="http://travelcompany.example.org/reservation"> <m:code>FT35ZBQ</m:code> </m:reservation> <o:creditCard xmlns:o="http://mycompany.example.com/financial"> <n:name xmlns:n="http://mycompany.example.com/employees"> Ã
ke Jógvan Ãyvind </n:name> <o:number>123456789099999</o:number> <o:expiration>2005-02</o:expiration> </o:creditCard> </m:chargeReservation </env:Body> </env:Envelope>
HTTP/1.1 200 OK Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn <?xml version='1.0' ?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" > <env:Header> ... ... </env:Header> <env:Body> ... ... </env:Body> </env:Envelope>
REST
RESTã¯ããããæã人æ°ã®ããWebãµãŒãã¹
å®éãRESTã¯ãŸã£ãããããã³ã«ã§ã¯ãªãããŸã£ããæ°ãããã®ã§ããããŸããã RESTã¯ã2000幎代ã«Roy Fieldingã®è«æãArchtectural Styles and the Design of Network-based Software Architecturesã[8]ã§ææ¡ãããã¢ãŒããã¯ãã£ã§ãã ããã«å ç«ã¡ãRESTã¢ãŒããã¯ãã£ã¯IETFããã³W3Cå ã®å€ãã®ãããžã§ã¯ãã§äœ¿çšãããŠããŸããã è«æèªäœã§ã¯ããWebãµãŒãã¹ããŸãã¯SOAãšããçšèªãèŠã€ããããšãã§ããŸããã RESTã¢ãŒããã¯ãã£ã¯ãåæ£ãã€ããŒã¡ãã£ã¢ã·ã¹ãã ã®æ£ããèšèšãã€ãŸããçŸåšã®ã¯ãŒã«ãã¯ã€ããŠã§ããšåŒã°ãããã®ã®ããã«ææ¡ãããŠããŸãã ãã£ãŒã«ãã£ã³ã°ã®è«æãçå£ã«åãæ¢ããããã«ããã€ã¯HTTP 1.1ã®ã¢ãŒããã¯ãã§ãããHTTPãšURIã®ã€ã³ã¿ãŒãããæšæºã®å ±èè ã§ãããšèšããŸã[10]ã äžè¬çã«ãç·ã¯çé¢ç®ã§æåã§ãã
RESTã¢ãŒããã¯ãã£ãŒã«åŸã£ãŠåæ£ã·ã¹ãã ãèšèšããã«ã¯ã次ã®åºæºãæºãããŠããå¿ èŠããããŸãã
- ã¯ã©ã€ã¢ã³ããµãŒã㌠ã·ã¹ãã ã¯ã¯ã©ã€ã¢ã³ããšãµãŒããŒã«åå²ããå¿ èŠããããŸãã
- ã¹ããŒãã¬ã¹ã ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãæ å ±ãä¿åããªãã§ãã ããã ãªã¯ãšã¹ãã«ã¯ããªã¯ãšã¹ãã®åŠçã«å¿ èŠãªãã¹ãŠã®æ å ±ãšãå¿ èŠã«å¿ããŠé¡§å®¢IDãä¿åããå¿ èŠããããŸãã
- ãã£ãã·ã¥ã ãã£ãã·ã¥å¯èœãªãã©ããã«ããããããååçã«ããŒã¯ãä»ããå¿ èŠããããŸãã
- çµ±äžã€ã³ã¿ãŒãã§ãŒã¹ã ã·ã¹ãã ã³ã³ããŒãã³ãéã®ãŠãããŒãµã«ã€ã³ã¿ãŒãã§ã€ã¹ã
ãŠãããŒãµã«ã€ã³ã¿ãŒãã§ã€ã¹ãååŸããã«ã¯ã次ã®å¶éãå°å ¥ãããŸãã
- ãªãœãŒã¹ã®èå¥ã
RESTã§ã¯ãååãä»ããããšãã§ããã®ã¯ãªãœãŒã¹ã ãã§ãã ããšãã°ããŠãŒã¶ãŒãHTMLããã¥ã¡ã³ããç»åãç»é²ãŠãŒã¶ãŒãèµ€ãTã·ã£ããç©ºè ¹ã®ç¬ãçŸåšã®å€©æ°ãªã©ã RESTã®åãªãœãŒã¹ã¯ããªãœãŒã¹ã®ç¶æ ãå€ãã£ãŠãå€ãããªãå®å®ããèå¥åã«ãã£ãŠèå¥ãããå¿ èŠããããŸãã ãã®å ŽåãRESTã®èå¥åã¯URIã§ãã
- è¡šçŸã«ãããªãœãŒã¹ã®æäœã
RESTã®ãã¥ãŒã¯ããªãœãŒã¹ã«å¯ŸããŠã¢ã¯ã·ã§ã³ãå®è¡ããããã«äœ¿çšãããŸãã ãªãœãŒã¹ãã¥ãŒã¯ããªãœãŒã¹ã®çŸåšã®ç¶æ ãŸãã¯æãŸããç¶æ ã§ãã ããšãã°ããªãœãŒã¹ããŠãŒã¶ãŒã§ããå Žåããã¬ãŒã³ããŒã·ã§ã³ã¯ãã®ãŠãŒã¶ãŒã®XMLãŸãã¯HTMLèšè¿°ã§ããå ŽåããããŸãã
- èªå·±èšè¿°çãªã¡ãã»ãŒãžã
èªå·±èšè¿°çãšã¯ãèŠæ±ãšå¿çãåŠçã«å¿ èŠãªãã¹ãŠã®æ å ±ãããèªäœã«ä¿åããå¿ èŠãããããšãæå³ããŸãã åäžã®ãªã¯ãšã¹ããåŠçããããã®è¿œå ã®ã¡ãã»ãŒãžããã£ãã·ã¥ããã£ãŠã¯ãªããŸããã
- HATEOASïŒã¢ããªã±ãŒã·ã§ã³ç¶æ
ã®ãšã³ãžã³ãšããŠã®ãã€ããŒã¡ãã£ã¢ïŒã
ãã®æ®µèœã¯ããã€ããŒããã¹ãã䜿çšããŠAPIãããã²ãŒãããå¿ èŠãããããšãæå³ããŸã[9]ã SOAã®å Žåãããã«ã¯ãµãŒãã¹ã®èª¬æã䜿çšãããããšã«æ³šæããŠãã ããã
ãã®é ç®ãããã«è©³ããæ€èšããŠãã ããã
以äžã®äŸã§ã¯ãæ®é«ã®ãªã¯ãšã¹ããåä¿¡ãããšãã¬ã¹ãã³ã¹ã¯æ®é«ã ãã§ãªããã¢ã«ãŠã³ãã§å®è¡ã§ããã¢ã¯ã·ã§ã³ã瀺ããŸããGET /account/12345 HTTP/1.1 HTTP/1.1 200 OK <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">100.00</balance> <link rel="deposit" href="/account/12345/deposit" /> <link rel="withdraw" href="/account/12345/withdraw" /> <link rel="transfer" href="/account/12345/transfer" /> <link rel="close" href="/account/12345/close" /> </account>
è² ã®ãã©ã³ã¹ã§åãäŸãèããŠã¿ãŸãããïŒGET /account/12345 HTTP/1.1 HTTP/1.1 200 OK <?xml version="1.0"?> <account> <account_number>12345</account_number> <balance currency="usd">-25.00</balance> <link rel="deposit" href="/account/12345/deposit" /> </account>
ã芧ã®ãšããããã®ã¢ã«ãŠã³ãã§ã¯ãããã®ã¢ã¯ã·ã§ã³ã䜿çšã§ããªããããã¬ã¹ãã³ã¹ã«ã¯ãããžãããšééãžã®åç §ãå«ãŸããªããªããŸããã
- ãªãœãŒã¹ã®èå¥ã
- éå±€åã·ã¹ãã ã RESTã§ã¯ãã·ã¹ãã ãã¬ã€ã€ãŒã®éå±€ã«åå²ã§ããŸãããåã³ã³ããŒãã³ãã¯æ¬¡ã®ã¬ã€ã€ãŒã®ã³ã³ããŒãã³ãã®ã¿ã衚瀺ã§ãããšããæ¡ä»¶ããããŸãã ããšãã°ãPayPalãµãŒãã¹ãåŒã³åºãã次ã«åœŒãVisaãµãŒãã¹ãåŒã³åºãå ŽåãVisaãµãŒãã¹ãåŒã³åºãããšã«ã€ããŠäœãç¥ããªãã§ãã ããã
- ã³ãŒããªã³ããã³ãã RESTã䜿çšãããšãã¯ã©ã€ã¢ã³ãåŽã§ã³ãŒããŸãã¯ããã°ã©ã ãèªã¿èŸŒãã§å®è¡ã§ããŸãã
ãããã£ãŠãåæ£ã·ã¹ãã ããªã¹ããããŠãã6ã€ã®ãã€ã³ããã¹ãŠãæºãããŠããå Žåãããã¯RESTã¢ãŒããã¯ãã£ã«åºã¥ããŠãããšèšããŸãããã®å Žåããã®ãããªWebãµãŒãã¹ã¯RESTfulãµãŒãã¹ãšåŒã°ããŸãã
ãããã®æ®µèœã§ãã§ã«æ°ã¥ããããã«ãGETãPUTãPOSTãDELETEãªã¯ãšã¹ããJSONãšã³ã³ãŒãã£ã³ã°ãHTTPãªã©ã«ã€ããŠã¯äœãèšãããŠããŸããã
RESTã¯åãªãã¢ãŒããã¯ãã£ã§ãããã©ã®ãããã³ã«ã«ãé¢é£ä»ããããŠããŸããã
確ãã«ãRESTã¢ãŒããã¯ãã£ã«ã¯é©ãã¹ããã®ãæ°ãããã®ã¯ãªãããšã«ãã§ã«æ°ä»ããŠããŸãã Webã®éçºãå§ãŸã£ãã°ããã®2000幎ã«RESTã§æ°ããè¿œå ãããŸããã RESTãšãã®é¢é£æ§ãããããç解ããã«ã¯ãWebãåãµã€ãããã€ããŒããã¹ãã§ããåæ£ãã€ããŒã¡ãã£ã¢ã·ã¹ãã ã§ãããšæ³åããŠãã ããã
ãããããã¡ããçåãçããŸã-å®éã«ç§ãã¡ãèŠãããããŠããããšã¯äœã§ããïŒ ã€ã³ã¿ãŒãããã§ã¯ãRESTfulãµãŒãã¹ãã©ã®ããã«èŠããã¹ãããã©ã®ããã«èŠããã¹ãã§ãªããã«ã€ããŠå€ãã®è«äºãèŠã€ããããšãã§ããŸãã 䜿çšããHTTPã¡ãœãããšäœ¿çšããªãHTTPã¡ãœããã äžè¬ã«ããã§ã«æãããªããã«ãRESTfulãµãŒãã¹ã«é¢ããä»æ§ã¯ååšããªããããããããã¹ãŠã®è°è«ã«ã¯çè«çæ ¹æ ã¯ãããŸããã ãããããžã§ã¯ãã§ã¯ãPOSTã䜿çšããŠæ°ããã¬ã³ãŒããäœæããå¥ã®ãããžã§ã¯ãã§ã¯æŽæ°ã«äœ¿çšãã3çªç®ã§ã¯åé€ã«äœ¿çšããããšã決å®ã§ããŸãã ãããã®ãœãªã¥ãŒã·ã§ã³ã¯ãRESTã¢ãŒããã¯ãã£ã«æ±ºããŠé¢é£ä»ããããŠããŸããã
RESTïŒRichardsonæç床ã¢ãã«
ããã§ã¯ãRESTã¯WebãµãŒãã¹ã«ã©ã®ããã«é¢é£ããŠããŸããïŒ RESTfulãšã¿ãªãããµãŒãã¹ãšããã§ãªããµãŒãã¹ ãµãŒãã¹ããã¹ãŠã®ãã£ãŒã«ãã£ã³ã°ãã€ã³ããæºããå ŽåãäœãåãåããŸããïŒ ãããã®è³ªåã«é çªã«çããŸãã
- RESTã¢ãŒããã¯ãã£ãŒã¯ãWebã®å®è·µã«ãããŠéå»16幎ã«ããã£ãŠå®èšŒãããŠããŸãã WebãµãŒãã¹ã¯Webã®äžéšã§ãããããå€ãã®äŒæ¥/éçºè
/ç 究è
ã¯ãWebãµãŒãã¹ã®å Žåã«RESTã¢ãŒããã¯ãã£ã䜿çšããããšã決å®ããŸãããããã«ãããã³ã³ããŒãã³ãã®ã¹ã±ãŒã©ããªãã£ãåäžããã»ãã¥ãªãã£ã確ä¿ãããç¬ç«ããå±éãªã©ãè¡ãããŸã
- WebãµãŒãã¹ãFieldingã®ãã¹ãŠã®åºæºãæºãããŠããå ŽåãHTTP DELETEã¡ãœããã䜿çšããŠã¬ã³ãŒããåé€ãããã©ããã«é¢ä¿ãªããRESTfulãšèŠãªãããšãã§ããŸãã ãããWebã«è¿œå ããŸããäžè¬çã«äœ¿çšãããã¡ãœããã¯GETãšPOSTã§ãããWebãµãŒãã¹ãWebã«ã§ããã ã䌌ãŠããå¿
èŠãããå ŽåãPUTãšDELETEã䜿çšããããšãäœããã®åœ¢ã§æ£ãããããŸããã
- ãã£ãŒã«ãã£ã³ã°ã¯ãŠã§ããšåæ£ãã€ããŒããã¹ãã·ã¹ãã ã«ã€ããŠæžããŠããŸããã圌ã®è«æã®äžéšãã³ããŒããŸãã è±èªã§ã¯ãããã¯ãã説åŸåããããŸãã
RESTã¯äžé£ã®ã¢ãŒããã¯ãã£äžã®å¶çŽãæäŸããå šäœãšããŠé©çšãããšãã³ã³ããŒãã³ãã®çžäºäœçšã®ã¹ã±ãŒã©ããªãã£ãã€ã³ã¿ãŒãã§ã€ã¹ã®äžè¬æ§ãã³ã³ããŒãã³ãã®ç¬ç«ããå±éãããã³äžéã³ã³ããŒãã³ãã匷調ããŠãçžäºäœçšã®åŸ ã¡æéãççž®ããã»ãã¥ãªãã£ã匷åãã
ã¬ã¬ã·ãŒã·ã¹ãã ãã«ãã»ã«åããŸãã
ãã¡ããããã¹ãŠãéåžžã«ã¯ãŒã«ã«èãããŸãããWebãµãŒãã¹ãRESTã«åŸã£ãŠèšèšããå¿ èŠããããŸããããããšãåãªããã¬ã³ãã§ããïŒ ã¬ããŒããªãã£ãŒããœã³ã®RMMïŒãªãã£ãŒããœã³æç床ã¢ãã«ïŒãèŠãŠã¿ãŸãããã
æ°çŸã®WebãµãŒãã¹[11]ãåæããåŸãRMMã¢ãã«ãææ¡ãããWebãµãŒãã¹ã®æç床ã®å質ããŸãã¯RichardsonããããåŒãã ããã«è©äŸ¡ããŸããã RMMã¢ãã«ã¯4ã€ã®ã¬ãã«ã§æ§æãããŠããŸãã ãµãŒãã¹ãæåŸã®ã¬ãã«ã«å¯Ÿå¿ããŠããå Žåã¯ãRESTfulãšèŠãªãããšãã§ããŸãã 以äžã«ãèè ã«ãããšã¢ãŒãã³ã»ã·ã¥ã¯ã«ããã¬ããŒãã»ãªãã£ãŒããœã³ãããã³ä»ã®æåãªäººã ã«ãã£ãŠãã§ãã¯ããã[12]ã®äŸãšæ°åã瀺ããŸãã ãã¹ãŠã®äŸã¯ã次ã®ã¹ããŒãªãŒã«åºã¥ããŠããŸããå»åž«ãšäºçŽãåãããã§ãã WebãµãŒãã¹ãããç¹å®ã®æ¥ä»ã®ç¡æã®åä»æéãååŸããŠãããäºçŽãããå¿ èŠããããŸãã ãããã£ãŠããã®äŸã§ã¯ãããã4ã€ã®ã¬ãã«ãã¹ãŠãæ€èšããŸãã
ã¬ãã«0ïŒ1ã€ã®URIã1ã€ã®HTTPã¡ãœããã
ããã§ãHTTPã¯åæ£ã·ã¹ãã ã³ã³ããŒãã³ãã®çžäºäœçšã«ã®ã¿äœ¿çšãããŸãã POSTãªã©ã1ã€ã®ã¡ãœããã®ã¿ã䜿çšãããŸãã ãæ³åã®ãšããããã®ãããªWebãµãŒãã¹ã¯XML-RPCããã³SOAPãããã³ã«ã§ãã

äŸïŒ2010-01-04ã®æ¥ä»ã§mjoneså士ã®ç©ºãæéãååŸããã
POST /appointmentService HTTP/1.1 [various other headers] <openSlotRequest date = "2010-01-04" doctor = "mjones"/>
HTTP/1.1 200 OK [various headers] <openSlotList> <slot start = "1400" end = "1450"> <doctor id = "mjones"/> </slot> <slot start = "1600" end = "1650"> <doctor id = "mjones"/> </slot> </openSlotList>
äŸïŒååŸ2æããååŸ2æ50åãŸã§ã®äºå®ãmjoneså士ã«ç»é²ãã ïŒããã§ã®ãªã¯ãšã¹ãã§ã¯ãããããå¥ã®æ¥ä»ã瀺ãå¿
èŠããããŸãããå
ã®äŸãå€æŽããŸããïŒã
POST /appointmentService HTTP/1.1 [various other headers] <appointmentRequest> <slot doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointmentRequest>
HTTP/1.1 200 OK [various headers] <appointment> <slot doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
ããã§ã¯XMLã¯äŸãšããŠã®ã¿äœ¿çšããã代ããã«JSONãHTMLãªã©ã䜿çšã§ããŸãã WebãµãŒãã¹ã«ã¯ã1ã€ã®URLïŒçžå¯ŸURLïŒã®ã¿ããããŸãïŒ/ pointmentServiceã èŠæ±ãããæ©èœã¯ãèŠæ±æ¬æã«ç€ºãããŠããŸãã
ãµãŒãã¹ãã¬ãã«ââ0ã«å¯Ÿå¿ããå Žåã圌ã¯ãŸã åäŸã§ãã
次ã«ãã¬ãã«1ã®WebãµãŒãã¹ãæäœãããšãã®åãäŸãèŠãŠã¿ãŸãããã
ã¬ãã«1ïŒè€æ°ã®URIã1ã€ã®HTTPã¡ãœããã
ãã®ã¬ãã«ã®ãµãŒãã¹ã¯ããåå²ããŠåŸæããããšããæŠå¿µã䜿çšããŠããŸãã ãªãœãŒã¹ã®æŠå¿µã¯ãµãŒãã¹ã«å°å ¥ããããã®ãªãœãŒã¹ã®URLã¯ç¹å®ã®ãªãœãŒã¹ãæäœããããã«äœ¿çšãããŸãã

äŸïŒ2010-01-04ã®æ¥ä»ã§mjoneså士ã®ç©ºãæéãååŸããã
POST /doctors/mjones HTTP/1.1 [various other headers] <openSlotRequest date = "2010-01-04"/>
HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"/> </openSlotList>
äŸïŒååŸ2æããååŸ2æ50åãŸã§ã®äºå®ãmjoneså士ã«ç»é²ãã
POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
HTTP/1.1 200 OK [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
ãã®ãããå»åž«ãšäœããã®ã¢ã¯ã·ã§ã³ãå®è¡ããå Žåã¯ãçžå¯ŸURL /å»åž«ã䜿çšããå¿ èŠããããã¢ã¯ã·ã§ã³ã蚪åã«é¢é£ä»ããããŠããå Žåã¯URL /ã¹ãããã䜿çšããå¿ èŠããããŸãã æåã®ã¬ãã«ã®ãµãŒãã¹ãšãŒãã¬ãã«ã®ãµãŒãã¹ãæ¯èŒãããšãåŸè ã®å ŽåããªãœãŒã¹ã¯1ã€ã ãã§ããããã®ãªãœãŒã¹ã¯WebãµãŒãã¹ãã®ãã®ã§ãã
ãµãŒãã¹ãã¬ãã«ââ1ã®å Žåã圌ã¯ãã£ãŒã³ãšã€ãžã£ãŒã§ãã
ã¬ãã«2ïŒè€æ°ã®URIãããããç°ãªãHTTPã¡ãœããããµããŒãããŠããŸãïŒHTTPã®é©åãªäœ¿çšïŒã
ãããã£ãŠãã¬ãã«1ã§ã¯ãWebãµãŒãã¹ã®ãã¹ãŠã®ã¡ãœããã¯ãªãœãŒã¹ã䜿çšããŠåé¢ãããŸãããããªãœãŒã¹ã䜿çšããŠäžé£ã®ã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãã ãããã®ã¢ã¯ã·ã§ã³ãäœããã®åœ¢ã§è«ççã«åé¢ãããããã«ãç°ãªãã¡ãœããïŒGETãHEADãPOSTãPUTãDELETEãTRACEãCONECTïŒã§æäœãéåä¿¡ããHTTPæ©èœã䜿çšãããŸãã ããšãã°ãã¡ãœãããèªã¿åãã®å ŽåãPOSTãŸãã¯PUT UTãäœæããå Žåã¯GETã䜿çšã§ããŸã ååçã«ã¯å¯èœã§ããããã®éãå¯èœã§ããããããã®ã¡ãœããã«ã¯HTTPã«ããã€ãã®æŠå¿µãšç¹æ§ãããããããããã®æŠå¿µã¯WebãµãŒãã¹ãšåãã§ããæ¹ãè¯ãã§ããããã§ãªããã°ããªãœãŒã¹ãäœæããããã®ãã£ãã·ã¥ãããã¡ãœãããååŸã§ããŸãã èšãæããã°ãã©ã®æäœã«ã©ã®ã¡ãœããã䜿çšãããã¯ãHTTPãããã³ã«ã®æ£ãã䜿çšæ³ã«ã€ããŠã¯ãã§ã«çåã§ãã

ããããäŸã®ããã®æãæ¥ãŸããïŒ
äŸïŒ2010-01-04ã®æ¥ä»ã§mjoneså士ã®ç©ºãæéãååŸããã
GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1 Host: royalhope.nhs.uk
HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"/> </openSlotList>
äŸïŒååŸ2æããååŸ2æ50åãŸã§ã®äºå®ãmjoneså士ã«ç»é²ãã
POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
HTTP/1.1 201 Created Location: slots/1234/appointment [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> </appointment>
ããŸããŸãªHTTPã¡ãœããã®å°å ¥ã«äŒŽããæ£ããHTTPã¹ããŒã¿ã¹ã³ãŒããè¿ãå¿ èŠæ§ãå°å ¥ãããŠããŸãã ããšãã°ãäŒè°ãäœæãããªã¯ãšã¹ãã®å Žåãäœæãããå Žåã¯ã³ãŒã201ãè¿ãããã¢ã¯ã·ã§ã³äžã«éžæãããæ¥æã«ãã§ã«ç»é²ãããŠããå Žåã¯ã409ã®ç«¶åã³ãŒããè¿ãããŸãã ç¹°ãè¿ããŸããããã€ã³ãã¯HTTPãããã³ã«ã®é©åãªäœ¿çšã§ãã
ãµãŒãã¹ãã¬ãã«ââ2ã«å¯Ÿå¿ããŠããå Žåãããã¯ãã§ã«æ人ç·æ§ã§ãã
ã¬ãã«3ïŒHATEOASã ãªãœãŒã¹èªäœã¯ããã®æ©èœãšé¢ä¿ã説æããŠããŸãã
HATEOASïŒã¢ããªã±ãŒã·ã§ã³ç¶æ ã®ãšã³ãžã³ãšããŠã®ãã€ããŒããã¹ãïŒãç§ã®æèŠã§ã¯ãã€ããŒã¡ãã£ã¢ã«å¿ é ã®èŠä»¶ã§ããããããWebãµãŒãã¹ã«ã©ã®çšåºŠé¢é£ããŠãããã¯ããããŸããã ããã§ããHATEOASã¯ãé¢å¿ã®ãããªãœãŒã¹ã§å®è¡ã§ããURLã®åœ¢åŒã§ã¢ã¯ã·ã§ã³ãè¿ãWebãµãŒãã¹ã®ç¹æ§ã§ãã

HATEOASã«ã€ããŠã¯æ¢ã«äžèšã§èª¬æããã®ã§ãããã§ã¯äŸã瀺ããŸãã
äŸïŒ2010-01-04ã®æ¥ä»ã§mjoneså士ã®ç©ºãæéãååŸããã
GET /doctors/mjones/slots?date=20100104&status=open HTTP/1.1 Host: royalhope.nhs.uk
HTTP/1.1 200 OK [various headers] <openSlotList> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"> <link rel = "/linkrels/slot/book" uri = "/slots/1234"/> </slot> <slot id = "5678" doctor = "mjones" start = "1600" end = "1650"> <link rel = "/linkrels/slot/book" uri = "/slots/5678"/> </slot> </openSlotList>
空ãæéããšã«ã¢ã¯ã·ã§ã³ãå®è¡ããURLããããŸãããã®å Žåããã®æéã®ç»é²ã§ãã
äŸïŒååŸ2æããååŸ2æ50åãŸã§ã®äºå®ãmjoneså士ã«ç»é²ãã
POST /slots/1234 HTTP/1.1 [various other headers] <appointmentRequest> <patient id = "jsmith"/> </appointmentRequest>
HTTP/1.1 201 Created Location: http://royalhope.nhs.uk/slots/1234/appointment [various headers] <appointment> <slot id = "1234" doctor = "mjones" start = "1400" end = "1450"/> <patient id = "jsmith"/> <link rel = "/linkrels/appointment/cancel" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/addTest" uri = "/slots/1234/appointment/tests"/> <link rel = "self" uri = "/slots/1234/appointment"/> <link rel = "/linkrels/appointment/changeTime" uri = "/doctors/mjones/slots?date=20100104@status=open"/> <link rel = "/linkrels/appointment/updateContactInfo" uri = "/patients/jsmith/contactInfo"/> <link rel = "/linkrels/help" uri = "/help/appointment"/> </appointment>
HATEOASã®å©ç¹ã¯ãWebãµãŒãã¹éçºè ãã¯ã©ã€ã¢ã³ããšã¯ç¡é¢ä¿ã«URIãå€æŽã§ããããšã§ãã ããã«ãWebãµãŒãã¹èªäœã¯ãWSDLãªãã§èªèº«ãèšè¿°ããŸãã HATEOASãæ£ããè¡šçŸããã«ã¯ãéçãªããŒãžããWebãµã€ããæ³åããŠãã ããã ã¡ã€ã³ããŒãžãéããšããã§ã«ä»ã®ãã¹ãŠãžã®ãªã³ã¯ããããŸãã Webãµã€ãã«ç§»åããŠããã§äœããèŠã€ããããã«ããã®Webãµã€ãã§APIããã¥ã¡ã³ãã®ãããªããã¥ã¡ã³ããèªãå¿ èŠã¯ãããŸããã ç¹°ãè¿ããŸãããHATEOASããµããŒãããWebãµãŒãã¹ã®å¿ èŠæ§ã«ã€ããŠã®ç§ã®äž»èŠ³çãªæèŠã¯ããªãæ²èŠ³çã§ãã
ãµãŒãã¹ãã¬ãã«ââ3ã«å¯Ÿå¿ããŠããå ŽåããµãŒãã¹ã¯ãã§ã«RESTfulãšåŒã°ãããã¡ãããçµéšè±å¯ãªè人ãšåŒã°ããŸãã
ãããã«
ãããã®è¡ãèªãã å Žåã¯ãèšäºå šäœãèªãã§çµè«ã«éããããæéããªãããã«ã¡ã€ã³ã®èšäºãããã£ãŠçµè«ã ããèªãã ãã®ã©ã¡ããã§ãã
2çªç®ã®ã±ãŒã¹ã¯æåã®ã±ãŒã¹ãããäžè¬çã§ãããããåºæ¬çãªæŠå¿µã瀺ããŸãã
- WebãµãŒãã¹ã¯ãSOAã¢ãŒããã¯ãã£ãå®è£ ããæ¹æ³ã®1ã€ã§ãã
- WebãµãŒãã¹ãããã³ã«ã¯ãWebãµãŒãã¹ã®ç¹å®ã®å®è£ ã§ãïŒXML-RPCãSOAPãJSON-RPCãªã©ïŒã
- RESTã¯ã2000幎ã«ææ¡ãããã¢ãŒããã¯ãã£ã§ãããäžè¬çã«Webã³ã³ããŒãã³ããšåæ£ãã€ããŒã¡ãã£ã¢ã·ã¹ãã ãé©åã«äœæããããã«äœ¿çšãããŸããã
- SOAPãšRESTã®éãã®åé¡ã¯ããã€ãœã³ãšæé£è ã®éããå°ããããšãšã»ãŒåãã§ãã SOAPã¯ä»æ§ãæã€ãããã³ã«ã§ãããRESTã¯HTTPããã³URLã䜿çšããŠWebãµãŒãã¹ãäœæããããã«äœ¿çšã§ããã¢ãŒããã¯ãã£ã§ãã
- Richardson Maturity Modelã¯ãLeonard RichardsonãWebãµãŒãã¹ã®æç床ãè©äŸ¡ããããã«ææ¡ããã¢ãã«ã§ãã «», «», «» «» , RMM.
â . , , RMM, HATEOAS. «» «» . - amazon, , , «». , «», , ( ).
æåŠ
1. www.oasis-open.org/committees/download.php/19679/soa-rm-cs.pdf
2. www.opengroup.org/standards/soa
3. www.w3.org/TR/ws-arch/#whatis
4. en.wikipedia.org/wiki/List_of_web_service_protocols
5. xmlrpc.scripting.com/spec.html
6. www.jsonrpc.org/specification
7. www.w3.org/TR/soap
8. www.ics.uci.edu/~fielding/pubs/dissertation/fielding_dissertation.pdf
9. restcookbook.com/Basics/hateoas
10. roy.gbiv.com/untangled/about
11. www.crummy.com/writing/speaking/2008-QCon/act3.html
12. martinfowler.com/articles/richardsonMaturityModel.html