ç§ã¯æåã«ãã®ãããªéã®èšäºãšITäž»é¡ã翻蚳ããããšããŸãããç§ã¯åãã§ããªãã®ã³ã¡ã³ããšã³ã¡ã³ããèªã¿ãŸãã èšäºèªäœã«é¢ããŠã¯ãå°ãªããšãå®éã«ã¯RESTã... RESTïŒ!!!ïŒã«çœ®ãæããŠããŸããããã¬ãŒã ãå°ãç°ãªããããèè ã«ã¯åæããŸããã ãããããã®èšäºã¯å€ãã®æçœãªããšã瀺ããŠãããšããäºå®ã«ãããããããHabréã«ã€ããŠã®è°è«ã«å€ããããã«æããŸããã
ãã®äººæ°ã®ãããã¯ãããžãŒãåããçç±

RESTful APIã¯çŽ æŽãããã§ãããïŒ
éå»10幎éã«ãŠã§ãéçºè ã®æŠèŠãèªãã å ŽåãRESTful APIã倩ããç§ãã¡ã«éããŠããããçš®ã®ç¥ã®èŽãç©ã§ãããšèããã®ã¯èš±ãããŸããã REST APIã¯ã©ãã§ã䜿çšãããããŒã±ãã£ã³ã°æ åœè ã§ããã管çè ãŸãã¯ã¹ã¿ããå°çšã®è³æã§çµ¶ããèšåããŠããŸãã
ããã§ã¯ãREST APIã®ã¢ã€ãã¢ã¯ã©ãã»ã©è¯ãã®ã§ããããïŒ ãã®åé¡ãæ±ãåã«ãã«ãŒããã©ãã§æé·ããããèŠãŠã¿ãŸããã...
RESTã¯ã©ãããæ¥ãã®ã§ããïŒ
ãã®ãã¯ãããžãŒã¯ã2000幎ã«Roy Fieldingãã 建ç¯ã¹ã¿ã€ã«ãšãããã¯ãŒã¯ããŒã¹ã®ãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®èšèš ããšããå士è«æã§è©³çŽ°ã«èª¬æãã玹ä»ãããšãã«äººæ°ãåããŸããã Royã¯ãç¹ã«HTTPã®Webéçºãžã®è²¢ç®ã§ç¥ãããŠããŸãã
ã§ã¯ãRESTful APIãšã¯äœã§ããïŒ
RESTã¯ãåæ£ãããã¹ã±ãŒã©ãã«ãªWebãµãŒãã¹ãæ§ç¯ããããã®ãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®ã¹ã¿ã€ã«ã§ãã Royã¯ããªã¯ãšã¹ãã«ç¹å®ã®æå³ãäžããããã«æšæºã®HTTPã¡ãœããã䜿çšããããšã䞻匵ããŸããã
ãããã£ãŠããããã®HTTPèŠæ±ã«ã¯ãRESTã§ç°ãªãã»ãã³ãã£ãã¯ããŒãããããŸãã
- ååŸ/ãªããžã§ã¯ã/ãªã¹ã
- POST /ãªããžã§ã¯ã/ãªã¹ã
- PUT /ãªããžã§ã¯ã/ãªã¹ã
äžèšã¯ã¯ãšãªã®ããã€ãã®ã¿ã€ãã§ããããããã®ãªã¹ãå šäœã¯ãCONNECTãDELETEãGETãHEADãOPTIONSãPATCHãPOSTãPUTãTRACEã§ãã ãããã®äžéšã«ã€ããŠèããããšããªãå Žåã§ããã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã§ãµããŒããããããšã¯ã»ãšãã©ãªãã¡ãœããããããããåé¡ã§ã¯ãããŸããã
Royã¯ãŸããHTTPå¿çã³ãŒããå¿çèªäœã®æå³ãå€æããã®ã«åœ¹ç«ã€ãšäž»åŒµããŸããã çŽ38ã®å¿çã³ãŒããããã以äžã«ãããã®ãªã¹ããèŠãããšãã§ããŸãã 䟿å®äžãããã€ãã®ååãççž®ããŸããã

ãããã£ãŠããã®ãããªAPIã®1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯ãå°ãªããšã次ã®ãã®ã§æ§æãããŸãã
- GET ã¡ãœãããªã©ã®ãªã¯ãšã¹ãã¡ãœãã
- ãªã¯ãšã¹ããã¹ ãäŸãã°/ãªããžã§ã¯ã/ãªã¹ã
- ãªã¯ãšã¹ãæ¬æ ãäŸïŒãã©ãŒã
- å¿çã³ãŒã ãããšãã°200 OK
- å¿çæ¬æ ãããšãã°JSONããŒã¿
å€ãã®äººããã®ãã©ãã€ã ã«ç©æ¥µçã«åå¿ããHTTPã䜿çšããWebãµãŒãã¹ã®éçºã«ãã®ãã©ãã€ã ã䜿çšãå§ããŸããã ãããRESTful APIãšåŒã³ãŸã ã
ãšããã§ããã©ã³ã¶ã¯ã·ã§ã³ã¯ããè€éã«ãªãå¯èœæ§ãããããããã®çç±ã«ã€ããŠèª¬æããŸãã ãã ãããããã®åé¡ã¯ä»ã®æè¡ã«é¢é£ããããããããã¯ãŒã¯ãšãã£ãã·ã³ã°ã«é¢é£ããè€éãªèŠçŽ ã¯çç¥ããŸãã
RESTful APIã¯å®éã«ã¯ã²ã©ãã§ã
RESTã¯ãããšãã°ã³ã³ãã³ãã®åä¿¡ãªã©ãå€ãã®ããšãè¡ãããã®åªããã¡ã«ããºã ã§ãããã»ãŒ20幎éå¿ å®ã«åœ¹ç«ã£ãŠããŸããã ããããç®ãéããŠãRESTful APIã®æŠå¿µãWebéçºã§ååšããææªã®ã¢ã€ãã¢ã®1ã€ã§ããããšãèªãããšããæ¥ãŸããã ããããç§ã¯äž»åŒµããŸããããã€ã¯çŽ æŽããã人ã§ããããã¡ããã圌ã¯å€ãã®ã¯ãŒã«ãªã¢ã€ãã¢ãæã£ãŠããŸãã...ããããRESTful APIã圌ãã®ãªã¹ãã«èŒã£ãŠãããã©ããã¯ããããŸããã
APIãæ§ç¯ããããã®ããé©åãªå¥ã®ãœãªã¥ãŒã·ã§ã³ãããã«æ€èšããŸããããããè¡ãåã«ãRESTful APIã®5ã€ã®äž»èŠãªåé¡ãç解ããå¿ èŠããããŸãã ããå§ããŸãããïŒ
åé¡ïŒ1ïŒRESTful APIã«ã€ããŠã¯ãŸã äžè¬çãªåæããããŸããã
ãã®æè¡ããRESTpureãã§ã¯ãªããRESTfulããšåŒã°ããçç±ã«ã€ããŠèããŠãã人ã¯ããªãã§ããããïŒ ïŒ ç¿»èš³è 泚ïŒçŽç²-æ確ã§ãããããã ïŒãããŠããã¹ãŠã®èŠæ±ã¡ãœãããå¿çã³ãŒããæ¬æãªã©ã誰ã§ãããã誰ã決å®ã§ããªãããã§ãã
ããšãã°ã 200 OKã³ãŒãã¯ãã€äœ¿çšããå¿ èŠããããŸããïŒ ã¬ã³ãŒãã®æŽæ°ãæåããããšã確èªããããã«äœ¿çšã§ããŸããããããšã201 Createdã³ãŒãã䜿çšããå¿ èŠããããŸããïŒ ã©ãããã 250ã®æŽæ°ãããã³ãŒãã䜿çšããå¿ èŠããããŸãããååšããŸããã ããã§ãã 417 Expectation failedã³ãŒãã®æå³ã誰ã§ã説æã§ããŸããïŒïŒ ãã¡ããããã€ä»¥å€ã®äººã
HTTPã¡ãœãããšHTTPã³ãŒãã®èŸæžã¯ææ§ã§äžå®å šã§ãããããæçµçã«çµ±äžãããå®çŸ©ã«ãªããŸããã ç§ãééã£ãŠããªããã°ã誰ãåäžã®äžè¬çãªç§©åºãèŠã€ããããã芳å¯ããããã«ä»ã®äººã«ä¿ããããšã¯ãããŸããã ããäŒç€Ÿã§200 OKãæå³ããããšã¯ãå¥ã®äŒç€Ÿã§ã¯ãŸã£ããç°ãªãæ å ±ã瀺ããŠããå¯èœæ§ãããããã®ããè°è«äžã®ãã¯ãããžãŒã¯äºæž¬äžå¯èœã§ãã
ãããå¯äžã®åé¡ã§ããã°ãããããç§ã¯èŸä»»ããä»æ¥ãŸã§RESTful APIãæžãç¶ããŠããã§ãããã ããããç§ãã¡ã®ãªã¹ãã¯æããã«ãããŠããã ãã§ã...
åé¡ïŒ2ïŒRESTèŸæžã¯å®å šã«ã¯ãµããŒããããŠããŸãã
æåã®åé¡ã解決ãããšããŠããå®éã®åé¡ã¯æ¬¡ã®ããã«ãªããŸããã»ãšãã©ã®ã¯ã©ã€ã¢ã³ãããã³ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ã¯ããã¹ãŠã®å¿çã³ãŒããšãå®éã«ã¯HTTPã¡ãœãããæå³ããåè©ããµããŒãããŠããŸããã ããšãã°ãã»ãšãã©ã®ãã©ãŠã¶ã§ã¯ãPUTããã³DELETEã®ãµããŒããå¶éãããŠããŸãã
ããã«ã©ã察åŠããŸããïŒ 1ã€ã®æ¹æ³ã¯ãéä¿¡ãããã©ãŒã ã«ç®çã®ã¡ãœããã瀺ãåè©ãæ¿å ¥ããããšã§ãã ã€ãŸãããã®å Žåããªã¯ãšã¹ãã«ã¯æ¬¡ã®ãã®ãå«ãŸããŸãã
- HTTPãªã¯ãšã¹ãã¡ãœãã ïŒPOSTãªã©ïŒ
- ãªã¯ãšã¹ãã¢ãã¬ã¹ ãäŸãã°/ãªããžã§ã¯ã/ãªã¹ã
- å®éã«æå³ããã¡ãœãã ãããšãã°DELETE
- ãªã¯ãšã¹ãæ¬æ ãããšãã°ãã©ãŒã ããã®ããŒã¿
å¿çã³ãŒãã®ããç¶æ³ã¯ãŸãã§ãã ç°ãªããã©ãŠã¶ïŒããã³ãµãŒããŒã¢ããªã±ãŒã·ã§ã³ãïŒã¯ããããã®ã³ãŒããç°ãªãæ¹æ³ã§ç解ããããšããããããŸãã ããšãã°ã 307äžæãªãã€ã¬ã¯ãã³ãŒããåãåã£ãå Žåã1ã€ã®ãã©ãŠã¶ãŒã§ãŠãŒã¶ãŒã¹ã¯ãªããããã®å¿çã確èªããå®è¡åã«ã¢ã¯ã·ã§ã³ããã£ã³ã»ã«ã§ããå ŽåããããŸãã å¥ã®ãã©ãŠã¶ã¯ãã¹ã¯ãªãããäœãããªãããã«ããã ãã®å ŽåããããŸãã å®éãåŠçãæããŠã¯ãããªãã³ãŒãã¯200 OKãš500 Internal server errorã ãã§ãã æ®ãã®ã±ãŒã¹ã§ã¯ãåçã®ãµããŒãã¯ãããªãè¯ãããããã²ã©ãããŸã§ããŸããŸã§ãã ãããããã°ãã°ç§ãã¡ãå®éã«æå³ããã³ãŒãã§å¿çæ¬äœãè£ããªããã°ãªããªãçç±ã§ãã
äžèšã®ãã¹ãŠã調æŽããã€ã³ã¿ãŒãããã«æ¥ç¶ãããŠãããã¹ãŠãéæ³ã®ããã«ä¿®æ£ã§ããããRESTã«å¯Ÿå¿ããŠããªãå Žåã§ããå¥ã®åé¡ã«çŽé¢ããŸãã
åé¡ïŒ3ïŒRESTãã£ã¯ã·ã§ããªãååã§ã¯ãããŸãã
HTTPã¡ãœãããšå¿çã³ãŒãã®ã¿ã§æ§æãããèŸæžã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§å¿ èŠãªããŸããŸãªæ å ±ã®å¹ççãªéä¿¡ãšåä¿¡ã«ã¯å¶éãããããŠããŸãã ãã¬ã³ããªã³ã°å®äºãå¿çãã¯ã©ã€ã¢ã³ãã«éä¿¡ããã¢ããªã±ãŒã·ã§ã³ãäœæãããšããŸãã æ®å¿µãªãããHTTPã³ãŒãã䜿çšããŠãããè¡ãããšã¯ã§ããŸããããªããªãã ãã®ãããªã³ãŒãã¯ååšããªããã ããããŠæ¬¡ã«ã HTTPãæ¡åŒµå¯èœã§ãªããããäœæã§ããªãããã§ãã 倱æã®ç¬éã çãã®æ¬æã«æå³ãæ¿å ¥ããå¿ èŠããããšæããŸãã
ãŸããåé¡ã¯ãè€æ°ã®èŸæžãããããã®ãã¡ã®3ã€ãããããšã§ãïŒ å¿çã³ãŒãã¯æ°å€ïŒ200ã201ã500ïŒã§ãããèŠæ±ã¡ãœãã ïŒGETãPOSTãPUTãªã©ïŒã®è¡šçŸãšã¯ç°ãªããå¿çæ¬æã¯JSON圢åŒã§ãã RESTãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ããããšã¯ãäžåœã«è±èªã®æçŽãéããããããã¢ãŒã«ã¹ä¿¡å·ããå¿çãåãåããããªãã®ã§ãã ãããã®å°é£ã¯ãã¹ãŠãæ··ä¹±ãšãšã©ãŒã®äž»ãªåå ã§ãã ããã§ã次ã®ã°ããŒãã«ãªåé¡ã§ãããããã°ã«ç§»ããŸããã
åé¡ïŒ4ïŒRESTful APIã¯ãããã°ãéåžžã«é£ãã
REST APIã䜿çšããããšãããå Žåãããããããããããã°ããããšã¯ã»ãŒäžå¯èœã§ããããšããåãã§ãããã ãã©ã³ã¶ã¯ã·ã§ã³äžã«äœãèµ·ããããç解ããã«ã¯ãäžåºŠã«7ã€ã®å Žæã調ã¹ãå¿ èŠããããŸãã
- HTTPãªã¯ãšã¹ãã¡ãœãã ïŒPOSTãªã©ïŒ
- ãªã¯ãšã¹ãã¢ãã¬ã¹ ãäŸãã°/ãªããžã§ã¯ã/ãªã¹ã
- å®éã«æå³ããã¡ãœããïŒãªã¯ãšã¹ãæ¬æå ïŒ ãããšãã°DELETE
- å®éã«ã¯ããªã¯ãšã¹ãæ¬æ ãããšãã°ãã©ãŒã ããã®ããŒã¿
- å¿çã³ãŒã ãããšãã°200 OK
- ïŒå¿çã®æ¬æã§ïŒæå³ããã³ãŒããããšãã°206 Partial Content
- å®éã«ã¯ãå¿çæ¬æ
ãããã£ãŠã2ã€ã®éåžžã«éãããèŸæžã ãã§ãªãããšã©ãŒãååšããå¯èœæ§ã®ãã7ã€ã®ç°ãªããã€ã³ãããããŸãã ããã«ç¶æ³ãæªåãããå¯èœæ§ãããã®ã¯ãRESTãã¯ãããžãŒã1ã€ã®ãããã³ã«ã«å®å šã«çµã³ä»ããããŠãããä»ã®éä¿¡ãã£ãã«ã䜿çšã§ããªãå Žåã§ãã å®éãããã§ããããããç§ãã¡ã®æ¬¡ã®å€§ããªåé¡ã§ãïŒ
åé¡ïŒ5ïŒéåžžãRESTful APIã¯HTTPãããã³ã«ã«ãã€ã³ããããŠããŸãã
RESTful APIã¯ãåªããã³ãã¥ãã±ãŒã·ã§ã³ã®åºæ¬çãªæ³åã®1ã€ãæã¡ç ŽããŸããã¡ãã»ãŒãžã®å 容ã¯ãäŒéãã£ãã«ããå®å šã«ç¬ç«ããŠããå¿ èŠããããŸã ã ããããæ··ããããšã¯æ··ä¹±ãå®å šã«ããæ¹æ³ã§ãã
HTTPãããã³ã«ãšéä¿¡ãããæ å ±ã絶ãéãªãç¹ã亀ããããŠãããããRESTful APIãä»ã®éä¿¡ãã£ãã«ã«è»¢éããå¯èœæ§ãå®å šã«å¥ªãããŠããŸãã RESTfulAPIãHTTPããä»ã®ããŒã¿è»¢éãããã³ã«ã«ç§»æ€ããã«ã¯ãå ã»ã©èª¬æãã7ã€ã®ç°ãªããã€ã³ãããæ å ±ãå®å šã«è§£äœããŠåæ§ç¯ããå¿ èŠããããŸãã
幞ããªããšã«ãRESTful APIã®ãã¹ãŠã®åé¡ãåé¿ãŸãã¯æå°åããåªãããœãªã¥ãŒã·ã§ã³ããããŸãã äŒããŸãããïŒ
ã¹ããããã©ã¯ãŒãïŒJSONçŽç²ãªAPI
JSONã§çŽç²ãªAPIã¯ãå ã»ã©èª¬æããã»ãšãã©ã®åé¡ãåŠçããŸã ã
- ããŒã¿ã®éä¿¡ã«1ã€ã®ã¡ãœããã®ã¿ã䜿çšããŸããéåžžãWebãœã±ããã䜿çšããå Žåã¯HTTPããã³SENDã® POST
- éä¿¡ã¡ã«ããºã ãšãªã¯ãšã¹ãã®å 容ã¯å®å šã«ç¬ç«ããŠããŸãã ãã¹ãŠã®ãšã©ãŒãèŠåãããã³ããŒã¿ã¯ããªã¯ãšã¹ãæ¬æã§JSON圢åŒã§éä¿¡ãããŸã
- æ£åžžãªéä¿¡ã確èªããããã«äœ¿çšãããå¿çã³ãŒãã¯1ã€ã ãã§ãéåžžã¯200 OK
- éä¿¡ã¡ã«ããºã ãšå¿çã®å 容ã¯å®å šã«ç¬ç«ããŠããŸãã ãã¹ãŠã®ãšã©ãŒãèŠåãããã³ããŒã¿ã¯ãå¿çæ¬æã§JSON圢åŒã§éä¿¡ãããŸã
- ãã¹ãŠã®ããŒã¿ãèªã¿ãããJSON圢åŒã§1ãæã«ããããããããã°ãã¯ããã«ç°¡å
- HTTP / SãWebSocketãXMPPãtelnetãSFTPãSCPãSSHãªã©ã®ããããéä¿¡ãã£ãã«ã«ç°¡åã«ç§»è¡
JSON-pure APIã¯ãRESTful APIããã©ãŠã¶ãŒãéçºè èªèº«ã«ãšã£ãŠç¹ã«å奜çã§ã¯ãªããšããäºå®ãéçºè ãèªèããçµæãšããŠç»å ŽããŸããã ã¡ãã»ãŒãžãšéä¿¡æ¹æ³ãåé¢ããããšã§ãJSON-pure APIãé«éã§ä¿¡é Œæ§ãé«ãã䜿ããããã移æ€ããŠãšã©ãŒãæ€åºã§ããŸãã ä»æ¥ãããšãã°Twitter APIã䜿çšããå¿ èŠãããå ŽåãããŸãã¹ãã¯RESTful APIãéžæããŸãã æ®ãã¯JSON-pure APIããŸãã¯ãWeb APIããšãåŒã°ããŸãã
éå»10幎éãJSONçŽç²ã®ä»£ããã«RESTfulã䜿çšããããã«äœåºŠãäŸé ŒãããŸããã RESTful APIãã»ãšãã©ãµããŒãããªããã°ãªããªãã£ãã®ã¯2011幎ã§ããã 幞ããªããšã«ãããã¯ãšã³ãããŒã ã¯ããã¹ãŠã®ã¡ãœãããšã³ãŒããJSONã«è»¢éããã ãã§ãJSONçŽç²ãªAPIãRESTfulãšäžŠè¡ããŠå®è¡ããããšã«åæããŸããã
æ°ãµæåŸã以åRESTfulã䜿çšããŠãããã¹ãŠã®å人ãJSONãã¥ã¢ã«åãæ¿ãããããã¯ããã«äŸ¿å©ã§ããããšãèªèããŸããã
å ã®èšäºïŒ mmikowski.github.io/
æçš¿è ïŒ Michael S. Mikowski