ããã³ããšã³ããšããã¯ãšã³ãã¯ãAPIãä»ããŠå¯Ÿè©±ããŸãã ãããŠãå šäœã®éçºçµæã¯ããããã©ã®APIã§ããããããã¯ãšã³ããšããã³ããšã³ããã©ãã ãè¯ããæªããã«åæãããã«ãã£ãŠç°ãªããŸãã ã¢ããã°ã¬ãŒããè¡ãæ¹æ³ã«ã€ããŠå šå¡ã§è©±ãåãã1æ¥äžäœæ¥ãããçŽããšãããžãã¹ã¿ã¹ã¯ã«å°éã§ããªããªãå¯èœæ§ããããŸãã
å€æ°ã®ååã«ã€ããŠããªããŒã倱éããããç¹æ®ããããããªãããã«ã¯ãé©åãªä»æ§ãå¿ èŠã§ãã 誰ã«ãšã£ãŠã人çã楜ã«ããããã«ã©ãããã¹ããã«ã€ããŠè©±ããŸãããã åæã«ãèªè»¢è»å°å±ã®å°é家ã«ãªããŸãã

é ãããå§ããŸããã-ç§ãã¡ã解決ããããšããŠããåé¡ã§ã
æã1959幎ã«ã ã·ãªã«ããŒãã³ãœã³ ïŒç æ°ãšæ··åããªãã§ãã ããã圌ã¯äœå®¶ã§ããçµæžåŠè ã§ãïŒã¯ããã€ãã®èå³æ·±ãæ³åŸãæãã€ããŸããã ããšãã°ããã®è²»çšã¯åå ¥ãªã©ãšãšãã«å¢å ããŸãã ãããã®1ã€ã¯èªæã®æ³åãšåŒã°ããŸãïŒ
ã¢ã€ãã ã®è°è«ã«è²»ããããæéã¯ãèæ ®ãããéã«åæ¯äŸããŸãã
ããŒãã³ãœã³ã¯çµæžåŠè ã ã£ãã®ã§ã圌ã¯èªåã®æ³åŸãçµæžçãªèŠ³ç¹ãã次ã®ããã«èª¬æããŸããã åç· åœ¹äŒã«æ¥ãŠãåååçºé»æã建èšããããã«1000äžãã«ãå¿ èŠã ãšèšã£ãå Žåããããããã®åé¡ã¯ãåŸæ¥å¡çšã®èªè»¢è»å°å±ã«100ãã³ããå²ãåœãŠããããã¯ããã«å°ãªãè°è«ã«ãªãã§ãããã 誰ããèªè»¢è»å°å±ã®äœãæ¹ãç¥ã£ãŠããããã誰ããèªåã®æèŠãæã¡ã誰ããéèŠã ãšæããåå ããããšæã£ãŠããŸããåååçºé»æã¯æœè±¡çã§é ããã®ã§ããã1000äžäººãèŠãããšããªã-質åã¯ã»ãšãã©ãããŸããã
1999幎ãããŒãã³ãœã³ã®èªæã®æ³åãããã°ã©ãã³ã°ã«ç»å Žãããã®åŸç©æ¥µçã«éçºãããŸããã ããã°ã©ãã³ã°ã§ã¯ããã®æ³åŸã¯äž»ã«è±èªã®æåŠã§çºèŠãããæ¯likeã®ããã«èãããŸããã èªè»¢è»å°å±å¹æ ïŒèªè»¢è»å°å±ã®å¹æ ïŒãšåŒã°ããŠããŸããããæ¬è³ªã¯åãã§ã-èªè»¢è»å°å±ã®æºåãã§ããŠãããçºé»æã®å»ºèšããããã£ãšé·ãéè°è«ããããšæããŸãã
ãã®çšèªã¯ãFreeBSDã®äœæã«é¢äžãããã³ããŒã¯ã®éçºè Poul-Henning Kampã«ãã£ãŠäœæãããŸããã èšèšããã»ã¹äžã«ãããŒã ã¯éåžžã«é·ãéãã¹ãªãŒãæ©èœãã©ã®ããã«æ©èœããããè°è«ããŸããã ããã¯ãPoul-Henning Kampããã®æçŽããã®åŒçšã§ãïŒéçºã¯ãã®åŸãé»åã¡ãŒã«ã§è¡ãããŸããïŒã
ã¹ãªãŒãïŒ1ïŒDTRTã«ãããšããææ¡ã§ããããã®ç¹å®ã®èã®ç«ãæ¶ãéæŽæ°ã®åŒæ°ãäžããããå Žåããã以äžã®ããšã¯èšããªãã§ããããã¹ã¬ããã®é·ããæåŸ ãããã®åé¡ã®ããã€ããããã¯ããã«å€ãã®æ³šæããã§ã«åããŠããŸãã
ãã®æçŽã®äžã§ã圌ã¯ãã£ãšå€ãã®éèŠãªæªè§£æ±ºã®åé¡ããããšèšããŸãããèªè»¢è»å°å±ãåãæ±ããªãã§ãããã«ã€ããŠäœããããŠå ã«é²ã¿ãŸãããïŒã
ãã®ããã1999幎ã«Poul-Henning Kampã¯ãèªè»¢è»æç®ãšããçšèªãè±èªã®æåŠã«å°å ¥ããŸããã
ã³ãŒãã®å€æŽã«ãã£ãŠäœæããããã€ãºã®éã¯ãå€æŽã®è€éãã«åæ¯äŸããŸãã
è¿œå ãŸãã¯å€æŽãåçŽã«ãªãã»ã©ãããã«ã€ããŠå€ãã®æèŠãèãå¿ èŠããããŸãã å€ãã®äººãããã«äŒã£ããšæããŸãã ããšãã°ãå€æ°ã«ååãä»ããæ¹æ³ãªã©ã®ç°¡åãªè³ªåã解決ããå Žåããã·ã³ã«ãšã£ãŠã¯åé¡ã«ãªããŸããããã®è³ªåã¯èšå€§ãªæ°ã®ããªããŒãåŒãèµ·ãããŸãã ããããæ·±å»ã§ãããžãã¹äžã®åé¡ã«ãšã£ãŠæ¬åœã«éèŠãªããšã¯è°è«ããããããã¯ã°ã©ãŠã³ãã§è¡ãããŸãã
ãã£ãšéèŠã ãšæãã®ã¯ãããã¯ãšã³ããšããã³ããšã³ãã®éã§ããåãããæ¹æ³ããŸãã¯ç§ãã¡ãè¡ãããžãã¹ã¿ã¹ã¯ã§ããïŒ èª°ããç°ãªãèããæã£ãŠããŸããããéãããªãã«æã£ãŠæ¥ãããšãæåŸ ããŠãã顧客ã¯ããç§ãã¡ã®ããžãã¹ã¿ã¹ã¯ããããã£ãŠããïŒããšèšããŸããããã¯ãšã³ããšããã³ããšã³ãã®éã§ããŒã¿ã転éããæ¹æ³ã¯éèŠã§ã¯ãããŸããã ãããã圌ã¯ããã¯ãšã³ããšããã³ããšã³ããäœã§ãããããç¥ããªãã§ãããã
å°å ¥ããŸãšãããšã APIã¯èªè»¢è»çœ®ãå Žã§ãã
ãã¬ãŒã³ããŒã·ã§ã³ ãªã³ã¯
è¬æŒè ã«ã€ããŠïŒ Alexey AvdeevïŒAvdeevïŒã¯Neuron.Digital瀟ã§åããŠããŸããNeuron.Digitalã¯ãã¥ãŒãã³ãæ±ãããããã®ã¯ãŒã«ãªããã³ããšã³ããäœæããŠããŸãã ãŸããAlexã¯OpenSourceã«æ³šæãæãããã¹ãŠã®äººã«ã¢ããã€ã¹ããŠããŸãã 圌ã¯é·ãééçºã«æºãã£ãŠããŸã-2002幎以æ¥ã圌ã¯å€ä»£ã®ã€ã³ã¿ãŒããããçºèŠããŸãããã³ã³ãã¥ãŒã¿ãŒã倧ãããã€ã³ã¿ãŒããããå°ãããJSã®æ¬ åŠã¯èª°ãæ°ã«ããŸããã§ããã
èªè»¢è»å°å±ã«å¯ŸåŠããæ¹æ³ã¯ïŒ
å°æ¬ãããã·ãªã«ã»ããŒãã³ãœã³ãäºçŽ°ãªæ³åãæšè«ããåŸã圌ã¯å€ãã®è°è«ããããŸããã ããã§ã¯ãèªè»¢è»å°å±ã®åœ±é¿ãç°¡åã«åé¿ã§ããããšãããããŸãã
- ã¢ããã€ã¹ãèããªãã§ãã ããã ã¢ã€ãã¢ã¯ãŸããŸãã ãšæããŸããã¢ããã€ã¹ã«è³ãåŸããªããã°ãç¹ã«ããã°ã©ãã³ã°ã§ãç¹ã«åå¿è
éçºè
ã§ããã°ããããããããäœãããšãã§ããŸãã
- ããªããæãããã«ããŠãã ããã ãç§ã¯ã¢ãŒãã£ã¹ãã§ããããã§ããïŒã-ãã€ã¯ã·ã§ããå¹æã¯ãããŸãããå¿
èŠãªãã®ã¯ãã¹ãŠå®è¡ãããŸãããåºåã«ã¯éåžžã«å¥åŠãªããšã衚瀺ãããŸãã ããã¯ãã°ãã°ããªãŒã©ã³ã¹ã§èŠãããŸãã 確ãã«ãä»ã®éçºè
ã®ããã«å®äºããªããã°ãªããªãã¿ã¹ã¯ã«åºãããããã®å®è£
ã¯ããªããåœæãããŸããã
- èªåããããšã¯éèŠã§ããïŒ ããã§ãªããã°ãããªãã¯åã«ãããè°è«ããããšã¯ã§ããŸããããããã¯å人çãªæèã®åé¡ã§ãã
- 客芳çãªåºæºã䜿çšããŸãã ãã®ç¹ã«ã€ããŠã¯ã¬ããŒãã§ã話ãããŸãã èªè»¢è»å°å±ã®åœ±é¿ãé¿ããããã«ã客芳çã«ã©ã¡ããè¯ãããå€æããåºæºã䜿çšã§ããŸãã ããããååšããŸãã
- ã¢ããã€ã¹ãèããããªãããšã«ã€ããŠã¯è©±ããªãã§ãã ããã ç§ãã¡ã®äŒç€Ÿã§ã¯ãæåã®ããã¯ãšã³ãéçºè
ã¯å
åçã§ãããããä»ã®äººã«äŒããªããããªããšãããããšããããŸãã ãã®çµæãç§ãã¡ã¯é©ãã«åºäŒããŸãã ãã®æ¹æ³ã¯æ©èœããŸãããããã°ã©ãã³ã°ã§ã¯æé©ãªãªãã·ã§ã³ã§ã¯ãããŸããã
- åé¡ãæ°ã«ããªãå Žåã¯ããã®ãŸãŸã«ããããããªããŒã®éçšã§çããææ¡ããããªãã·ã§ã³ã®ãããããéžæã§ããŸã ã
èªè»¢è»è±èœé²æ¢ããŒã«
èªè»¢è»å°å±ã®åé¡ã解決ããããã®å®¢èŠ³çãªããŒã«ã«ã€ããŠè©±ãããã§ãã èªè»¢è»è±èœé²æ¢ããŒã«ãäœã§ãããã瀺ãããã«ãå°ã話ãããŸãã
åå¿è ã®ããã¯ãšã³ãéçºè ããããšæ³åããŠãã ããã 圌ã¯æè¿å ¥ç€Ÿããå°ããªãµãŒãã¹ïŒããã°ãªã©ïŒã®èšèšãäŸé ŒãããŸããããã®ããã«ã¯RESTãããã³ã«ãäœæããå¿ èŠããããŸãã

åçã§ã¯ã2000幎ã«åœŒã®è«æã建ç¯æ§åŒãšãããã¯ãŒã¯ãœãããŠã§ã¢ã¢ãŒããã¯ãã£ã®èšèšããæè·ããRoy FieldingããRESTãšããçšèªãå°å ¥ããŸããã ããã«ã圌ã¯HTTPãçºæããå®éãã€ã³ã¿ãŒãããã®åµèšè ã®1人ã§ãã
RESTã¯ãRESTãããã³ã«ãREST APIãRESTfulãµãŒãã¹ã®èšèšæ¹æ³ã瀺ãäžé£ã®ã¢ãŒããã¯ãã£ååã§ãã ãããã¯éåžžã«æœè±¡çã§è€éãªã¢ãŒããã¯ãã£ã®ååã§ãã RESTfulã®ãã¹ãŠã®ååã«å®å šã«æºæ ããAPIãèŠãããšã®ãã人ã¯èª°ãããªããšç¢ºä¿¡ããŠããŸãã
RESTã¢ãŒããã¯ãã£ãŒã®èŠä»¶
RESTãããã³ã«ã®ããã€ãã®èŠä»¶ã瀺ããŸãããããã®èŠä»¶ãåç §ãããããã«äŸåããŸãã ãããã®ããªãã®æ°ããããŸããããªãã¯ãŠã£ãããã£ã¢ã§ããã«ã€ããŠãã£ãšèªãããšãã§ããŸãã
1. ã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«ã
RESTã®æãéèŠãªååãã€ãŸãããã¯ãšã³ããšã®å¯Ÿè©±ã RESTã«ããã°ãããã¯ãšã³ãã¯ãµãŒããŒã§ãããããã³ããšã³ãã¯ã¯ã©ã€ã¢ã³ãã§ãããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®åœ¢åŒã§éä¿¡ããŸãã ã¢ãã€ã«ããã€ã¹ãã¯ã©ã€ã¢ã³ãã§ãã æèšãå·èµåº«ããã®ä»ã®ãµãŒãã¹ã®éçºè ãã¯ã©ã€ã¢ã³ãéšåãéçºããŸãã RESTful APIã¯ãã¯ã©ã€ã¢ã³ããã¢ã¯ã»ã¹ãããµãŒããŒã§ãã
2. ç¶æ ã®æ¬ åŠã
ãµãŒããŒã«ã¯ç¶æ ãååšããªãããã«ããå¿ èŠããããŸããã€ãŸããå¿çã«å¿ èŠãªãã®ã¯ãã¹ãŠèŠæ±ã«å«ãŸããŸãã ã»ãã·ã§ã³ããµãŒããŒã«ä¿åããããã®ã»ãã·ã§ã³ã«å¿ããŠç°ãªãåçãæ¥ãå Žåãããã¯RESTã®ååã«éåããŠããŸãã
3. ã€ã³ã¿ãŒãã§ãŒã¹ã®åäžæ§ã
ããã¯ãREST APIãæ§ç¯ããäžã§éèŠãªåºæ¬ååã®1ã€ã§ãã 次ã®ãã®ãå«ãŸããŸãã
- ãªãœãŒã¹ã®èå¥ã¯ãURLãæ§ç¯ããæ¹æ³ã§ãã RESTã§ã¯ãäœããã®ãªãœãŒã¹ããµãŒããŒã«æ±ããŸãã
- ãã¬ãŒã³ããŒã·ã§ã³ã«ãããªãœãŒã¹ã®æäœã ãµãŒããŒã¯ãããŒã¿ããŒã¹ã«ãããã¥ãŒãšã¯ç°ãªããã¥ãŒãè¿ããŸãã æ å ±ãMySQLã«ä¿åãããPostgreSQLã«ä¿åãããã¯åé¡ã§ã¯ãããŸããããã¥ãŒããããŸãã
- ãèªå·±èšè¿°åãã¡ãã»ãŒãž-ã€ãŸããã¡ãã»ãŒãžã«ã¯idããã®ã¡ãã»ãŒãžãå床ååŸã§ãããªã³ã¯ãå«ãŸããŸã-ãã®ãªãœãŒã¹ãå床䜿çšããããã«å¿ èŠãªãã¹ãŠã®ããšã§ãã
- ãã€ããŒã¡ãã£ã¢ã¯ããªãœãŒã¹ã䜿çšãã以äžã®ã¢ã¯ã·ã§ã³ãžã®ãªã³ã¯ã§ãã åäžã®REST APIããããè¡ãããã§ã¯ãªãããã§ãããããã¯Roy Fieldingã«ãã£ãŠèšè¿°ãããŠããŸãã
ç§ã®è©±ã«ã¯éèŠã§ã¯ãªãã®ã§ãåŒçšããªãååã3ã€ãããŸãã
RESTfulããã°
æåã®ããã¯ãšã³ãéçºè ã«æ»ããRESTfulã§ããã°ã®ãµãŒãã¹ãäœæããããäŸé ŒãããŸããã 以äžã¯ãããã¿ã€ãã®äŸã§ãã

ããã¯èšäºããããµã€ãã§ãããªãã¯ãããã«ã³ã¡ã³ãããããšãã§ããŸããèšäºãšã³ã¡ã³ãã«ã¯èè ãããŸã-æšæºçãªç©èªã åå¿è ã®ããã¯ãšã³ãéçºè ã¯ããã®ããã°ã®RESTful APIãå®è¡ããŸãã
CRUDã«åºã¥ããŠãã¹ãŠã®ããã°ããŒã¿ãåŠçããŸãã

ãªãœãŒã¹ãäœæãèªã¿åããæŽæ°ãããã³åé€ã§ããå¿ èŠããããŸãã ããã¯ãšã³ãéçºè ã«ãCRUDã®åçã«åºã¥ããŠRESTful APãæ§ç¯ããããäŸé ŒããŠã¿ãŸãããã ã€ãŸããèšäºãäœæããã¡ãœãããèšäºã®ãªã¹ããŸãã¯åäžã®èšäºãååŸããã¡ãœãããæŽæ°ããã³åé€ããã¡ãœãããèšè¿°ããŸãã
圌ããããã©ããã£ãŠã§ãããèŠãŠã¿ãŸãããã

ããã§ã¯ãRESTã®ãã¹ãŠã®ååã«é¢ããŠãã¹ãŠãééã£ãŠããŸã ã æãèå³æ·±ãã®ã¯ãæ©èœããããšã§ãã å®éã«ãã®ãããªAPIãå ¥æããŸããã 顧客ã«ãšã£ãŠã¯èªè»¢è»çœ®ãå Žã§ãããéçºè ã«ãšã£ãŠã¯å·éã«è°è«ããæ©äŒã§ãããåå¿è ã®éçºè ã«ãšã£ãŠã¯ãæ¯åã€ãŸããã転åããŠé ãæã¡ç ã巚倧ã§åæ¢ãªæ°ããäžçã§ãã 圌ã¯äœåºŠãäœåºŠãããçŽããªããã°ãªããŸããã

ããã¯RESTãªãã·ã§ã³ã§ãã ãªãœãŒã¹ãèå¥ãããšããååã«åºã¥ããŠãç§ãã¡ã¯ãªãœãŒã¹ã䜿çšããèšäºãäœæããRoy Fieldingãææ¡ããHTTPã¡ãœããã䜿çšããŸãã 圌ã¯åœŒã®åã®äœåã次ã®äœåã§äœ¿çšããããåŸãªãã£ãã
èšäºãæŽæ°ããããã«ãå€ãã®äººãPUTã¡ãœããã䜿çšããŠããŸãããã»ãã³ãã£ã¯ã¹ãå°ãç°ãªããŸãã PATCHã¡ãœããã¯æž¡ããããã£ãŒã«ããæŽæ°ããPUTã¯åã«1ã€ã®èšäºãå¥ã®èšäºã«çœ®ãæããŸãã ã»ãã³ãã£ã¯ã¹ã«ãããPATCHã¯ããŒãžã§ãããPUTã¯çœ®æã§ãã
ç§ãã¡ã®åå¿è ããã¯ãšã³ãéçºè ã¯èœã¡ãŠã圌ãã¯ãããæŸãäžããŠèšã£ãïŒããã¹ãŠãé 調ã§ãããããã®ããã«ããŠãã ããããããŠåœŒã¯æ£çŽã«ãããããçŽããã ãããããã®åŸã圌ã¯ãšããä»ããŠå·šå€§ãªé·ãéãèŠã€ããã§ãããã
ãªããããªã«æ£ããã®ã§ããïŒ
- ãã€ã»ãã£ãŒã«ãã£ã³ã°ãããèšã£ãããã§ãã
- RESTã§ããããã
- ãããã¯ç§ãã¡ã®è·æ¥ãçŸåšåºã¥ããŠããã¢ãŒããã¯ãã£ã®ååã ããã§ãã
ãã ããããã¯ãèªè»¢è»çœ®ãå Žãã§ããã以åã®æ¹æ³ã¯æ©èœããŸãã ã³ã³ãã¥ãŒã¿ãŒã¯RESTã®åã«éä¿¡ãããã¹ãŠãæ©èœããŸããã ããããä»ã§ã¯æ¥çã«æšæºãç»å ŽããŠããŸãã
èšäºãåé€ãã
èšäºãåé€ããäŸãèããŠã¿ãŸãããã IDã§èšäºãåé€ããéåžžã®ãªãœãŒã¹ã¡ãœããDELETE / articlesããããšããŸãã HTTPã«ã¯ããããŒãå«ãŸããŸãã AcceptããããŒã¯ãã¯ã©ã€ã¢ã³ããå¿çãšããŠåä¿¡ããããŒã¿ã®ã¿ã€ããåãå ¥ããŸãã ç§ãã¡ã®åŸèŒ©ã¯ã200 OKãContent-TypeïŒapplication / jsonãè¿ãã空ã®ããã£ãæž¡ããµãŒããŒãäœæããŸããã
01. DELETE /articles/ 1 /1.1
02. Accept: application/json
01. HTTP/1.1 200 OK
02. Content-Type: application/json
03. null
ããã§éåžžã«äžè¬çãªééãããããŸãã-空ã®äœ ã ãã¹ãŠãè«ççãªããã§ã-èšäºã¯åé€ããã200 OKãapplication / jsonããããŒã¯ååšããŸãããã¯ã©ã€ã¢ã³ãã¯ããããèœã¡ãŸãã 空ã®ããã£ãæå¹ã§ã¯ãªãããããšã©ãŒãã¹ããŒãããŸãã 空ã®æååã解æããããšããããšããããšãjsonããŒãµãŒãã€ãŸãããŠã¯ã©ãã·ã¥ãããšããäºå®ã«çŽé¢ããŸãã
ãã®ç¶æ³ãä¿®æ£ããã«ã¯ã©ãããã°ããã§ããïŒ ããããæè¯ã®ãªãã·ã§ã³ã¯jsonãæž¡ãããšã§ãã ãæ¿è«ŸãjsonãæäŸããšè¿°ã¹ãå ŽåããµãŒããŒã¯ãContent-TypeãjsonãæäŸããjsonãæäŸããŸãã 空ã®ãªããžã§ã¯ãã空ã®é å-ããã«äœãã眮ã-ããã解決çãšãªããåäœããŸãã
ãŸã 解決çããããŸãã 200 OKã«å ããŠãå¿çã³ãŒã204ããããŸã-ã³ã³ãã³ãã¯ãããŸããã ããã䜿çšãããšãäœãéä¿¡ããããšã¯ã§ããŸããã 誰ããããã«ã€ããŠç¥ã£ãŠããããã§ã¯ãããŸããã
ã ããç§ã¯ã¡ãã£ã¢ã®çš®é¡ã«ã€ãªãã£ãã
MIMEã¿ã€ã
ã¡ãã£ã¢ã¿ã€ãã¯ãã¡ã€ã«æ¡åŒµåã®ãããªãã®ã§ãWebäžã§ã®ã¿äœ¿çšã§ããŸãã ããŒã¿ãéä¿¡ããå Žåãå¿çãšããŠåä¿¡ããã¿ã€ããéç¥ãŸãã¯èŠæ±ããå¿ èŠããããŸãã
- ããã©ã«ãã§ã¯ãããã¯ããã¹ã/ãã¬ãŒã³-åãªãããã¹ãã§ãã
- äœãæå®ãããŠããªãå Žåããã©ãŠã¶ã¯ããããã¢ããªã±ãŒã·ã§ã³/ãªã¯ãããã¹ããªãŒã -åãªããããã¹ããªãŒã ãæå³ããŸãã
ç¹å®ã®ã¿ã€ãã®ã¿ãæå®ã§ããŸãã
- ã¢ããªã±ãŒã·ã§ã³/ pdf;
- ç»å/ PNG;
- ã¢ããªã±ãŒã·ã§ã³/ json;
- ã¢ããªã±ãŒã·ã§ã³/ xml;
- application / vnd.ms-excelã
Content-Typeããã³AcceptããããŒã¯éèŠã§ãããéèŠã§ãã
APIãšã¯ã©ã€ã¢ã³ãã¯ãContent-TypeããããŒãšAcceptããããŒãæž¡ãå¿ èŠããããŸãã
APIãJSONã§æ§ç¯ãããŠããå Žåãåžžã«AcceptïŒapplication / jsonããã³Content-Type application / jsonãæž¡ããŸãã
ãã¡ã€ã«ã¿ã€ãã®äŸã

ã¡ãã£ã¢ã¿ã€ãã¯ãã€ã³ã¿ãŒãããäžã§ã®ã¿ããããã®ã¿ã€ãã®ãã¡ã€ã«ã«äŒŒãŠããŸãã
åçã³ãŒã
ãžã¥ãã¢éçºè ã®åéºã®æ¬¡ã®äŸã¯ãå¿çã³ãŒãã§ãã

æãé¢çœãå¿ççã¯200 OKã§ãã 誰ãã圌ãæããŠããŸã-ããã¯ãã¹ãŠãããŸããã£ãããšãæå³ããŸãã ã±ãŒã¹ãããããŸãã-200 OKãšã©ãŒãåãåããŸããã å®éã«ãµãŒããŒã«äœããèœã¡ããã®å¿çã«å¿ããŠãHTMLãšã©ãŒãã³ã³ãã€ã«ãããHTMLããŒãžãæ¥ãŸãã ã³ãŒã200 OKã®ã¢ããªã±ãŒã·ã§ã³jsonããªã¯ãšã¹ããããããã©ã®ããã«äœ¿çšããããèããŠããŸãããïŒ ããªãã¯å¿çã§è¡ããããšã©ãŒããšããèšèãæ¢ããããã¯ééãã ãšæãã
ããã¯æ©èœããŸãããHTTPã§äœ¿çšã§ããä»ã®å€ãã®ã³ãŒãããããRoy Fieldingã¯RESTã§ãããã䜿çšããããšããå§ãããŸãã ããšãã°ããšã³ãã£ãã£ïŒèšäºïŒã®äœæã«åçã§ããŸãã
- 201 Createdã¯æåããã³ãŒãã§ãã èšäºãäœæãããŸããäœæãããèšäºãè¿ãå¿ èŠããããŸãã
- 202 Acceptedã¯ããªã¯ãšã¹ããåãå ¥ããããããšãæå³ããŸãããçµæã¯åŸã§ãªããŸãã ãããã¯é·æéå®è¡ãããæäœã§ãã æ¿èªããããšãããã£ã¯è¿ãããŸããã ã€ãŸããå¿çã§Content-Typeãæå®ããªãå Žåãæ¬æãæå®ããªãå ŽåããããŸãã ãŸãã¯Content-Typeããã¹ã/ãã¬ãŒã³-ããã ãã§ã質åã¯ãããŸããã 空ã®æååã¯ãæå¹ãªããã¹ã/ãã¬ãŒã³ã§ãã
- 204ã³ã³ãã³ããªã -ããã£ã¯å®å šã«ååšããªãå¯èœæ§ããããŸãã
- 403çŠæ¢ -ãã®èšäºã®äœæã¯èš±å¯ãããŠããŸããã
- 404 Not Found-ããªãã¯ã©ããééã£ããšããã«ç»ã£ããäŸãã°ãã®ãããªæ¹æ³ã¯ãªãã
- 409çŽäºã¯ãã»ãšãã©ã®äººã䜿çšããªã極端ãªã±ãŒã¹ã§ãã ããã¯ãšã³ãã§ã¯ãªãã¯ã©ã€ã¢ã³ãã§IDãçæãããã®æç¹ã§èª°ãããã®èšäºãäœæã§ããå Žåã«å¿ èŠã«ãªãããšããããŸãã ãã®å Žåã競åãæ£è§£ã§ãã
ãšã³ãã£ãã£äœæ
次ã®äŸïŒContent-TypeïŒapplication / jsonãªã©ã®ãšã³ãã£ãã£ãäœæãããã®application / jsonãæž¡ããŸãã ããã«ãããã¯ã©ã€ã¢ã³ããããã³ããšã³ãã«ãªããŸãã ãã®ãŸãã«èšäºãäœæããŸãããïŒ
01. POST /articles /1.1
02. Content-Type: application/json
03. { "id": 1, "title": " JSON API"}
ã³ãŒããå¿çããå ŽåããããŸãã
- 422 Unprocessable Entity-æªåŠçã®ãšã³ãã£ãã£ã ãã¹ãŠãçŽ æŽãããããã§ã-ã»ãã³ãã£ã¯ã¹ãã³ãŒãããããŸãã
- 403çŠæ¢
- 500å éšãµãŒããŒãšã©ãŒã
ããããæ£ç¢ºã«äœãèµ·ãã£ãã®ãã¯çµ¶å¯Ÿã«ç解ã§ããŸãããã©ã®ãããªçš®é¡ã®ãšã³ãã£ãã£ãåŠçãããªãã®ãããªãããã«è¡ããªãã®ãããããŠæçµçã«ãµãŒããŒã«äœãèµ·ãã£ãã®ãïŒ
ãšã©ãŒãè¿ã
å¿çããŠããšã©ãŒãè¿ãããã«ããŠãã ããïŒãããŠãåŸèŒ©ã¯ããã«ã€ããŠç¥ããŸããïŒã ããã¯æå³è«çã§æ£ããã§ãã ã¡ãªã¿ã«ãFieldingã¯ããã«ã€ããŠæžããŠããŸãããã€ãŸããåŸã§çºæãããRESTã®äžã«æ§ç¯ãããŸããã
ããã¯ãšã³ãã¯ãå¿çã§ãšã©ãŒãå«ãé åãè¿ãå ŽåããããŸãããããã€ãããå ŽåããããŸãã
01. HTTP/1.1 422 Unprocessable Entity
02. Content-Type: application/json
03.
04. { "errors": [{
05. "status": "422",
06. "title": "Title already exist",
07. }]}
åãšã©ãŒã«ã¯ãç¬èªã®ã¹ããŒã¿ã¹ãšã¿ã€ãã«ãä»ããããšãã§ããŸãã ããã¯çŽ æŽãããããšã§ãããRESTã«å ããŠæ¢ã«ã³ã³ãã³ã·ã§ã³ã¬ãã«ã§è¡ãããŠããŸãã ããã¯ãè°è«ããããããã«é©åã§é©åãªAPIãäœæããããã®èªè»¢è»è±èœé²æ¢ããŒã«ã«ãªãå¯èœæ§ããããŸãã
ããŒãžããŒã·ã§ã³ãè¿œå
次ã®äŸïŒãã¶ã€ããŒã¯æåã®ããã¯ãšã³ãéçºè ã®ãšããã«æ¥ãŠãããèšããŸãã ãããæããŸãããã

ãã£ãšè©³ããèããŠã¿ãŸãããã ãŸãã336ããŒãžãå°è±¡çã§ãã ãããèŠããšããç§ã¯ãã®æ°åãåŸãæ¹æ³ãèããŸããã èšäºã®ãªã¹ãããªã¯ãšã¹ããããšãèšäºã®ãªã¹ããååŸãããããã336ãååŸããå Žæã ããšãã°ã1äžããããŸããã€ãŸãããã¹ãŠã®èšäºãããŠã³ããŒãããããŒãžæ°ã§å²ã£ãŠãã®æ°ã調ã¹ãå¿ èŠããããŸãã éåžžã«é·ãéããããã®èšäºãèªã¿èŸŒãããã«ããšã³ããªã®æ°ããã°ããååŸããæ¹æ³ãå¿ èŠã§ãã ãã ããAPIããªã¹ããè¿ãå Žåãèšäºã®é åãå¿çããããããã®æ°ã®ã¬ã³ãŒããã©ãã«é 眮ããããæå®ããŸãã ãšã³ããªã®æ°ã¯ã©ãã«ãå ¥ããããŠããªããããåèšäºã«è¿œå ããå¿ èŠããããããåèšäºã«æ¬¡ã®ããã«èšèŒãããŠããããšãããããŸãã
ãã ãããã®åé¡ã解決ããREST APIã®äžã«èŠåããããŸãã
ãªã¹ããªã¯ãšã¹ã
APIãæ¡åŒµå¯èœã«ããããã«ãããŒãžããŒã·ã§ã³ã«GETãã©ã¡ãŒã¿ãããã«äœ¿çšã§ããŸããçŸåšã®ããŒãžã®ãµã€ãºãšãã®çªå·ãããã«ããããªã¯ãšã¹ãããããŒãžã®äžéšãæ£ç¢ºã«è¿ãããŸãã ããã¯äŸ¿å©ã§ãã å¿çãšããŠãããã«é åãæå®ããããšã¯ã§ããŸãããããã¹ããè¿œå ã§ããŸãã ããšãã°ãããŒã¿ããŒã«ã¯é åãèŠæ±ããããŒã¿ãå«ãŸããã¡ã¿ããŒã«ã¯ä»¥åã¯ååšããªãã£ãããåèšãå«ãŸããŸãã
01. GET /articles? page[size]=30&page[number]=2
02. Content-Type: application/json
01. HTTP/1.1 200 OK
02. {
03. "data": [{ "id": 1, "title": "JSONAPI"}, ...],
04. "meta": { "count": 10080 }
05. }
ãã®ããã«ããŠãAPIã¯è¿œå æ å ±ãè¿ãããšãã§ããŸãã ã«ãŠã³ãã«å ããŠãä»ã®æ å ±ããããããããŸãã-ããã¯æ¡åŒµå¯èœã§ãã ä»ãåŸèŒ©ãããã«ãããããªãã£ãå ŽåããããŠåœŒã pajinizationãããããã«é ŒãŸããåŸã«ã ãã圌ã¯äºææ§ã®ãªãå€æŽãæ»ã ãAPIãå£ãããã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¯ãããããçŽããªããã°ãªããŸããã§ãã-éåžžããã¯å€ãã®ããšãçããŸã
ããžããŒãŒã·ã§ã³ã¯ç°ãªããŸãã ç§ã¯ããªãã䜿ãããšãã§ããããã€ãã®ã©ã€ãããã¯ãæäŸããŸãã
[ãªãã»ãã] ... [å¶é]
01. GET /articles? page[offset]=30&page[limit]=30
02. Content-Type: application/json
01. HTTP/1.1 200 OK
02. {
03. "data": [{ "id": 1, "title": "JSONAPI"}, ...],
04. "meta": { "count": 10080 }
05. }
ããŒã¿ããŒã¹ãæ±ã人ã¯ããã§ã«[offset] ... [limit]å¯ç®è³ªãæã£ãŠãããããããŸããã ããŒãž[ãµã€ãº] ...ããŒãž[çªå·]ã®ä»£ããã«äœ¿çšããæ¹ãç°¡åã§ãã ããã¯å°ãç°ãªãã¢ãããŒãã§ãã
ã«ãŒãœã«äœçœ®
01. GET /articles? page[published_at]=1538332156
02. Content-Type: application/json
01. HTTP/1.1 200 OK
02. {
03. "data": [{ "id": 1, "title": "JSONAPI"}, ...],
04. "meta": { "count": 10080 }
05. }
ã«ãŒãœã«äœçœ®ã¯ãã¬ã³ãŒãã®ããŒããéå§ãããšã³ãã£ãã£ãžã®ãã€ã³ã¿ãŒã䜿çšããŸãã ããšãã°ãé »ç¹ã«å€æŽããããªã¹ãã§ããŒãžããŒã·ã§ã³ãŸãã¯ããŒãã䜿çšããå Žåã«éåžžã«äŸ¿å©ã§ãã ç§ãã¡ã®ããã°ã«ã¯åžžã«æ°ããèšäºãæžãããŠãããšããŸãããã çŸåšã3çªç®ã®ããŒãžã¯1ååŸã®3çªç®ã®ããŒãžãšã¯ç°ãªããŸããã4çªç®ã®ããŒãžã«ç§»åãããšããªã¹ãå šäœã移åããããã3çªç®ã®ããŒãžããããã€ãã®ã¬ã³ãŒããååŸãããŸãã
ãã®åé¡ã¯ãã«ãŒãœã«ã®ããŒãžããŒã·ã§ã³ã«ãã£ãŠè§£æ±ºãããŸãã ããã®æç¹ã§å ¬éãããèšäºã®åŸã«æ¥ãèšäºãèªã¿èŸŒã¿ãŸãã-çŽç²ã«æè¡çã«ã¯ãã¯ãã·ããããããšã¯ã§ãããããã¯ã¯ãŒã«ã§ãã
åé¡N +1
ç§ãã¡ã®ãžã¥ãã¢éçºè ãééããªãééãã次ã®åé¡ã¯ãN + 1ã®åé¡ã§ãïŒããã¯ãšã³ããŒã¯ç解ããŸãïŒã 10åã®èšäºã®ãªã¹ãã衚瀺ãããšããŸãã èšäºã®ãªã¹ããã¢ããããŒãããŸããåèšäºã«ã¯èè ããããããããã«ã€ããŠèè ãããŠã³ããŒãããå¿ èŠããããŸãã çºéããŸãïŒ
- 1件ã®èšäºãªã¹ãã®ãªã¯ãšã¹ãã
- åèšäºã®èè ãžã®10件ã®ãªã¯ãšã¹ãã
åèšïŒ11åã®ã¯ãšãªã§å°ããªãªã¹ãã衚瀺ããŸãã
ãªã³ã¯ãè¿œå
ããã¯ãšã³ãã§ã¯ããã®åé¡ã¯ãã¹ãŠã®ORMã§è§£æ±ºãããŠããŸãããã®æ¥ç¶ãå¿ããã«è¿œå ããŠãã ããã ãããã®æ¥ç¶ã¯ãããã³ããšã³ãã§ã䜿çšã§ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
01. GET /articles? include =author
02. Content-Type: application/json
ç¹å¥ãªGETãã©ã¡ãŒã¿ã䜿çšããŠãããã¯ãšã³ãã«ããããã«ãã€ã³ã¯ã«ãŒãããååãä»ããŠãèšäºãšãšãã«ããŒãããå¿ èŠããããªã³ã¯ãæå®ã§ããŸãã èšäºãã¢ããããŒãããããã«èè ãšèšäºãååŸããããšããŸãã çãã¯æ¬¡ã®ããã«ãªããŸãã
01. /1.1 200
02. { "data": [{
03. { attributes: { "id": 1, "title": "JSON API" },
04. { relationships: {
05. "author": { "id": 1, "name": "Avdeev" } }
06. }, ...
07. }]}
ç¬èªã®èšäºå±æ§ãããŒã¿ã«è»¢éãããäž»èŠãªé¢ä¿ãè¿œå ãããŸããã ãã¹ãŠã®æ¥ç¶ããã®ããŒã«å ¥ããŸãã ãããã£ãŠã1ã€ã®ãªã¯ãšã¹ãã§ã以åã«11åã®ãªã¯ãšã¹ããåä¿¡ãããã¹ãŠã®ããŒã¿ãåä¿¡ããŸããã ããã¯ãããã³ããšã³ãã®N + 1ã«é¢ããåé¡ã解決ããã¯ãŒã«ãªã©ã€ãããã¯ã§ãã
ããŒã¿è€è£œã®åé¡
èè ã瀺ã10åã®èšäºã衚瀺ãããšããŸãããã¹ãŠã®èšäºã«ã¯1人ã®èè ãããŸãããèè ã®ãªããžã§ã¯ãã¯éåžžã«å€§ããïŒããšãã°ã1ã¡ã¬ãã€ããããéåžžã«é·ãå§ïŒã 1人ã®èè ãåçã«10åå«ãŸããåçã«åãèè ã10åå«ãããš10 MBããããŸãã
ãã¹ãŠã®ãªããžã§ã¯ããåãã§ããããã1人ã®äœæè ã10åïŒ10 MBïŒå«ãŸããåé¡ã¯ãããŒã¿ããŒã¹ã§äœ¿çšãããæ£èŠåã®å©ããåããŠè§£æ±ºãããŸãã ããã³ããšã³ãã§ã¯ãAPIã®æäœã«æ£èŠåã䜿çšããããšãã§ããŸã-ããã¯éåžžã«äŸ¿å©ã§ãã
01. /1.1 200
02. { "data": [{
03. "id": "1â³, "type": "article",
04. "attributes": { "title": "JSON API" },
05. "relationships": { ... }
06. "author": { "id": 1, "type": "people" } }
07. }, ... ]
08. }
ãã¹ãŠã®ãšã³ãã£ãã£ãäœããã®ã¿ã€ãã§ããŒã¯ããŸãïŒããã¯è¡šçŸã¿ã€ãããªãœãŒã¹ã¿ã€ãã§ãïŒã ãã€ã»ãã£ãŒã«ãã£ã³ã°ã¯ããªãœãŒã¹ã®æŠå¿µãå°å ¥ããŸãããã€ãŸãã圌ãã¯èšäºãèŠæ±ãããèšäºããåãåããŸããã ãªã¬ãŒã·ã§ã³ã·ããã§ã¯ã人ã®ã¿ã€ããžã®ãªã³ã¯ãé 眮ããŸããã€ãŸãããŸã ä»ã®å Žæã«äººã®ãªãœãŒã¹ããããŸãã ãŸããããŒã¿èªäœãšåãã¬ãã«ã«ããå¥ã®çµã¿èŸŒã¿ããŒã«ãªãœãŒã¹èªäœãåã蟌ã¿ãŸãã
01. /1.1 200
02. {
03. "data": [ ... ],
04. "included": [{
05. "id": 1, "type": "people",
06. "attributes": { "name": "Avdeev" }
07. }]
08. }
ãããã£ãŠãåäžã®ã€ã³ã¹ã¿ã³ã¹å ã®ãã¹ãŠã®é¢é£ãšã³ãã£ãã£ã¯ãå«ãŸããç¹å¥ãªããŒã«åé¡ãããŸãã ãªã³ã¯ã®ã¿ãä¿åãããšã³ãã£ãã£èªäœã¯ã€ã³ã¯ã«ãŒãã«ä¿åãããŸãã
èŠæ±ãµã€ãºãæžå°ããŸããã ããã¯ãæåã®ããã¯ãšã³ããç¥ããªãã©ã€ãããã¯ã§ãã 圌ã¯ãåŸã§APIãç Žãå¿ èŠããããšãã«ããããŸãã
ãã¹ãŠã®ãªãœãŒã¹ãã£ãŒã«ããå¿
èŠãšããããã§ã¯ãããŸãã
次ã®ã©ã€ãããã¯ã¯ããã¹ãŠã®ãªãœãŒã¹ãã£ãŒã«ããå¿ èŠãªããã§ã¯ãªãå Žåã«é©çšã§ããŸãã ããã¯ãè¿ãããå±æ§ãã³ã³ãã§åºåã£ãŠãªã¹ãããç¹å¥ãªGETãã©ã¡ãŒã¿ãŒã䜿çšããŠè¡ãããŸãã ããšãã°ãèšäºã倧ãããã³ã³ãã³ããã£ãŒã«ãã«ã¡ã¬ãã€ããããå ŽåããããããããŒã®ãªã¹ãã®ã¿ã衚瀺ããå¿ èŠããããŸã-å¿çã«ã³ã³ãã³ãã¯å¿ èŠãããŸããã
GET /articles ?fields[article]=title /1.1
01. /1.1 200 OK
02. { "data": [{
03. "id": "1â³, "type": "article",
04. "attributes": { "title": " JSON API" },
05. }, ... ]
06. }
ããšãã°ãçºè¡æ¥ãå¿ èŠãªå Žåã¯ãã«ã³ãåºåãã®ãçºè¡æ¥ããèšè¿°ã§ããŸãã ããã«å¿ããŠãå±æ§ã«ã¯2ã€ã®ãã£ãŒã«ãããããŸãã ããã¯èªè»¢è»è±èœé²æ¢ããŒã«ãšããŠäœ¿çšã§ããèŠåã§ãã
èšäºã§æ€çŽ¢
å€ãã®å Žåãæ€çŽ¢ãšãã£ã«ã¿ãŒãå¿ èŠã§ãã ããã«ã¯æ £ç¿ããããŸã-GETãã©ã¡ãŒã¿ãŒã®ç¹å¥ãªãã£ã«ã¿ãŒïŒ
â
GET /articles ?filters[search]=api HTTP/1.1
æ€çŽ¢ã
â
GET /articles ?fiIters[from_date]=1538332156 HTTP/1.1
ç¹å®ã®æ¥ä»ããèšäºãããŠã³ããŒãããŸãã
â
GET /articles ?filters[is_published]=true HTTP/1.1
å ¬éãããã°ããã®èšäºãããŠã³ããŒãããŸãã
â
GET /articles ?fiIters[author]=1 HTTP/1.1
第äžèè ãšèšäºãããŠã³ããŒãããŸãã
èšäºã®äžŠã¹æ¿ã
â
GET /articles ?sort=title /1.1
ã¿ã€ãã«å¥ã
â
GET /articles ?sort=published_at HTTP/1.1
çºè¡æ¥å¥ã
â
GET /articles ?sort=-published_at HTTP/1.1
å ¬éæ¥ã§éæ¹åã«ã
â
GET /articles ?sort=author,-publisbed_at HTTP/1.1
èšäºãåãèè ã®ãã®ã§ããå Žåã¯ãæåã«èè ã次ã«éæ¹åã®çºè¡æ¥ã«ãã£ãŠã
URLãå€æŽããå¿
èŠããããŸã
解決çïŒæ¢ã«è¿°ã¹ããã€ããŒã¡ãã£ã¢ã¯ã次ã®ããã«å®è¡ã§ããŸãã ãªããžã§ã¯ãïŒãªãœãŒã¹ïŒãèªå·±èšè¿°çã«ãããå Žåãã¯ã©ã€ã¢ã³ãã¯ãã€ããŒã¡ãã£ã¢ãéããŠããã§äœãã§ããããç解ã§ãããµãŒããŒã¯ã¯ã©ã€ã¢ã³ããšã¯ç¬ç«ããŠéçºã§ããŸãããã®åŸãç¹å¥ãªãªã³ã¯ããŒã䜿çšããŠèšäºã®ãªã¹ããžã®ãªã³ã¯ãè¿œå ã§ããŸãïŒ
01. GET /articles /1.1
02. {
03. "data": [{
04. ...
05. "links": { "self": "http://localhost/articles/1"
},
06. "relationships": { ... }
07. }],
08. "links": { "self": " http://localhost/articles
" }
09. }
ãŸãã¯ããã®èšäºã«ã³ã¡ã³ããã¢ããããŒãããæ¹æ³ãã¯ã©ã€ã¢ã³ãã«äŒãããå ŽåïŒ
01. ...
02. "relationships": {
03. "comments": {
04. "links": {
05. "self": "http://localhost/articles/l/relationships/comments
",
06. "related": " http://localhost/articles/l/comments
"
07. }
08. }
09. }
ã¯ã©ã€ã¢ã³ãã¯ãªã³ã¯ãããããšã確èªãããªã³ã¯ããã©ã£ãŠã³ã¡ã³ããèªã¿èŸŒã¿ãŸãã ãªã³ã¯ããªãå Žåãã³ã¡ã³ãã¯ãããŸããã ããã¯äŸ¿å©ã§ãããã»ãšãã©ãããŸããã ãã£ãŒã«ãã£ã³ã°ã¯RESTã®ååãæãã€ããŸããããããããã¹ãŠãç§ãã¡ã®æ¥çã«å ¥ã£ãããã§ã¯ãããŸããã äž»ã«2ã€ãŸãã¯3ã€äœ¿çšããŸãã
2013幎ãç§ããäŒããããã¹ãŠã®ã©ã€ãããã¯ãSteve Klabnikã¯JSON APIä»æ§ã«çµ±åãããJSONã®æ°ããã¡ãã£ã¢ã¿ã€ããšããŠç»é²ãããŸããã ããã§ãåŸã ã«é²åãããžã¥ãã¢ããã¯ãšã³ãéçºè ã¯ãJSON APIã䜿çšããŸããã
JSON API
Webãµã€ãhttp://jsonapi.org/implementations/ã§ãã¹ãŠã®è©³çŽ°ã説æãããŠããŸãã32ã®ããã°ã©ãã³ã°èšèªã®ä»æ§ã®170ã®ç°ãªãå®è£ ã®ãªã¹ãããããŸãããããã¯ã«ã¿ãã°ã«ã®ã¿è¿œå ãããŸãã ã©ã€ãã©ãªãããŒãµãŒãã·ãªã¢ã©ã€ã¶ãŒãªã©ã¯ãã§ã«äœæãããŠããŸãã
ãã®ä»æ§ã¯ãªãŒãã³ãœãŒã¹ãªã®ã§ã誰ããããã«æè³ããŠããŸãã ç§èªèº«ãäœããæžããŸããã ãããã人ã¯å€ããšæããŸãã ãã®ãããžã§ã¯ãã«èªåã§åå ã§ããŸãã
JSON APIã®é·æ
JSON APIä»æ§ã¯å€ãã®åé¡ã解決ããŸã- ãã¹ãŠã®äººã«å ±éã®åæã§ã ã äžè¬çãªåæããããããããŒã å ã§è°è«ããããšã¯ãããŸãã ãèªè»¢è»å°å±ã¯ææžåãããŠããŸãã èªè»¢è»ã®å°å±ã®ææãšå¡è£ æ¹æ³ã«ã€ããŠåæããŠããŸãã
éçºè ãäœãééã£ãããšãããŠããããèŠããšããç§ã¯è°è«ãå§ããŸãããããJSON APIã«æºæ ããŠããŸããïŒããšèšã£ãŠãä»æ§ã«ããã瀺ããŸãã 圌ãã¯äŒç€Ÿã§ç§ãå«ã£ãŠããŸãããåŸã ã«ããã«æ £ããŠã誰ããJSON APIã奜ãã«ãªãå§ããŸããã ãã®ä»æ§ã«åŸã£ãŠæ°ããããã©ã«ããµãŒãã¹ãäœæããŸãã æ¥ä»ããŒããããã¡ã¿ãè¿œå ããããŒãå«ããæºåãã§ããŠããŸãã ãã£ã«ã¿ãŒçšã«äºçŽæžã¿ã®GETãã©ã¡ãŒã¿ãŒãã£ã«ã¿ãŒããããŸãã ãã£ã«ã¿ãŒãšåŒã¶ãã®ã«ã€ããŠã¯è°è«ããŸãã-ãã®ä»æ§ã䜿çšããŸãã URLã®äœææ¹æ³ã«ã€ããŠèª¬æããŸãã
ç§ãã¡ã¯è«äºããã®ã§ã¯ãªããããžãã¹ã¿ã¹ã¯ãè¡ãã®ã§ã éçºã®çç£æ§ã¯é«ããªããŸãã ä»æ§ã説æããéçºè ãããã¯ãšã³ããèªã¿ãAPIãäœæããããããã蟌ã¿ãŸãã-顧客ã¯æºè¶³ããŠããŸãã
ããšãã°ãããŒãžããŒã·ã§ã³ãªã©ã®äžè¬çãªåé¡ã¯ãã§ã«è§£æ±ºãããŠããŸã ã ä»æ§ã«ã¯å€ãã®ãã³ãããããŸãã
ããã¯JSONïŒãã®åœ¢åŒã«ã€ããŠã¯Douglas Crockfordã®ãããã§ãïŒã§ãããããXMLãããç°¡æœã§ãéåžžã«èªã¿ããããç解ããããã§ãã
ããããªãŒãã³ãœãŒã¹ã§ãããšããäºå®ã¯ãã©ã¹ãšãã€ãã¹ã®äž¡æ¹ã«ãªãåŸãŸãããç§ã¯ãªãŒãã³ãœãŒã¹ã倧奜ãã§ãã
çæJSON API
ãªããžã§ã¯ãã¯æé·ããŸããïŒæ¥ä»ãå±æ§ãå«ãŸãããªã©ïŒ- ããã³ããšã³ãã¯åçã解æããå¿ èŠããããŸããé åãå埩åŠçãããªããžã§ã¯ããæ©ãåããreduceãã©ã®ããã«æ©èœããããç¥ãããšãã§ããŸãã ãã¹ãŠã®åå¿è éçºè ããããã®è€éãªããšãç¥ã£ãŠããããã§ã¯ãããŸããã ã·ãªã¢ã©ã€ã¶ãŒ/ãã·ãªã¢ã©ã€ã¶ãŒã®ã©ã€ãã©ãªãããããããã䜿çšã§ããŸãã äžè¬ã«ãããã¯ããŒã¿ãæäœããã ãã§ããããªããžã§ã¯ãã¯å€§ãããªããŸãã
ãããŠã ããã¯ãšã³ãã«ã¯çã¿ããããŸãïŒ
- å ¥ãåã®å¶åŸ¡-ã€ã³ã¯ã«ãŒãã¯éåžžã«é ããŸã§ç»ãããšãã§ããŸãã
- ããŒã¿ããŒã¹ã¯ãšãªã®è€éã-ãããã¯æã èªåçã«æ§ç¯ãããéåžžã«é£ããããšãå€æããŸããã
- ã»ãã¥ãªãã£-äœããã®çš®é¡ã®ã©ã€ãã©ãªãæ¥ç¶ããå Žåã¯ç¹ã«ããžã£ã³ã°ã«ã«ç»ãããšãã§ããŸãã
- ä»æ§ã¯èªã¿ã«ããã§ãã 圌女ã¯è±èªã§ãããã¯æããããã®ã§ããããã ãã ã誰ããããã«æ £ããŸããã
- ãã¹ãŠã®ã©ã€ãã©ãªãä»æ§ãé©åã«å®è£ ããŠããããã§ã¯ãããŸãã-ããã¯ãªãŒãã³ãœãŒã¹ã®åé¡ã§ãã
JSON APIã®èœãšãç©Ž
ã¡ãã£ãšããŒãã³ã¢ã
åé¡ã®é¢ä¿ã®æ°ã¯å¶éãããŠããŸããã ã€ã³ã¯ã«ãŒããèšäºã®ãªã¯ãšã¹ããã³ã¡ã³ãã®è¿œå ãè¡ããšãããã«å¿ããŠãã®èšäºã®ãã¹ãŠã®ã³ã¡ã³ããåãåããŸãã 10,000件ã®ã³ã¡ã³ãããããŸã-10,000件ã®ã³ã¡ã³ãããã¹ãŠååŸããŸãã
GET /articles/1?include=comments /1.1
01. ...
02. "relationships": {
03. "comments": {
04. "data": [0 ... â]
05. }
06. }
ãããã£ãŠãå®éã«ã¯5 MBããªã¯ãšã¹ãã«å¿ããŠæ¥ãŸããããä»æ§ã«æžãããŠããŸãããªã¯ãšã¹ããæ£ããåæ§æããå¿ èŠããããŸãã
GET /comments? filters[article]=1& page[size]=30 HTTP/1.1
01. {
02. "data": [0 ... 29]
03. }
èšäºããšã®ãã£ã«ã¿ãŒã䜿çšããŠã³ã¡ã³ããèŠæ±ããã30åããé¡ãããŸãããšèšã£ãŠã30åã®ã³ã¡ã³ããååŸããŸãã ããã¯ãããŸãã§ãã
åãããšãææ§ã«å®åŒåã§ããŸã ïŒ
â
GET /articles/1 ?include=comments HTTP/1.1
ã³ã¡ã³ãä»ãã®èšäºããªã¯ãšã¹ãããŸãã
â
GET /articles/1/comments HTTP/1.1
èšäºã«é¢ããã³ã¡ã³ãããªã¯ãšã¹ãããŸãã
â
GET /comments ?filters[article]=1 HTTP/1.1
ã³ã¡ã³ãããªã¯ãšã¹ãããŸãã
ããã¯ãŸã£ããåããã®ã§ã-ç°ãªãæ¹æ³ã§ååŸãããåãããŒã¿ã«ã¯ãããã€ãã®ãããŸããããããŸãã ãã®èœãšãç©Žã¯ããã«ã¯èŠããŸããã
1察å€ã®ããªã¢ãŒãã£ãã¯æ¥ç¶ã¯ãéåžžã«è¿ éã«RESTã«äŸµå ¥ããŸãã
01. GET /comments?include=commentable /1.1
02.
03. ...
04. "relationships": {
05. "commentable" : {
06. "data": { "type": "article", "id": "1â³ }
07. }
08. }
ããã¯ãšã³ãã«ã¯ã³ã¡ã³ãå¯èœãªããªã¢ãŒãã£ãã¯æ¥ç¶ããããŸã-RESTã«ã¯ããŒã«ããŸãã ãããèµ·ããã¯ãã§ãããããã¯åœè£ ããããšãã§ããŸãã JSON APIã§ãã¹ã¯ããããšã¯ã§ããŸãããå ¬éãããŸãã
é«åºŠãªãªãã·ã§ã³ãåããè€éãªå€å¯Ÿå€ã®é¢ä¿ ã ãŸãããã¹ãŠã®ãªã³ã¯ããŒãã«ã衚瀺ãããŸãã
01. GET /users?include =users_comments /1.1
02.
03. ...
04. "relationships": {
05. "users_comments": {
06. "data": [{ "type": "users_comments", "id": "1â³ }, ...]
07. },
08. }
Swagger
Swaggerã¯ããªã³ã©ã€ã³ããã¥ã¡ã³ãäœæããŒã«ã§ãã
ç§ãã¡ã®ããã¯ãšã³ãéçºè ã圌ã®APIã®ããã¥ã¡ã³ããæžãããã«é ŒãŸãã圌ããããæžãããšããŸãããã APIãåçŽãªå Žåãããã¯ç°¡åã§ãã JSON APIã®å ŽåãSwaggerã¯ããã»ã©ç°¡åã«äœæã§ããŸããã
äŸïŒ Swaggerãããã¹ãã¢ã åã¡ãœãããéãããšãã§ããŸããå¿çãšäŸãåç §ããŠãã ããã

ããã¯ãããã¢ãã«ã®äŸã§ãã ããã«ã¯ãŒã«ãªã€ã³ã¿ãŒãã§ã€ã¹ãããããã¹ãŠãèªã¿ãããã§ãã

ãããŠãããã¯JSON APIã¢ãã«ã®äœæãã©ã®ããã«èŠãããã§ãïŒ

ããã¯ããã»ã©çŽ æŽãããããšã§ã¯ãããŸããã ããŒã¿ãå¿ èŠã§ããé¢ä¿ã®ããããŒã¿ã«ã¯ã5çš®é¡ã®ã¢ãã«ãå«ãŸããŸãã Swaggerãäœæã§ããŸããOpenAPIã¯åŒ·åã§ãããè€éã§ãã
代æ¿æ¡
ODataä»æ§ããããããã¯å°ãåŸ-2015幎ã«ç»å ŽããŸããã å ¬åŒãŠã§ããµã€ããä¿èšŒããããã«ãããã¯ãRESTãžã®æè¯ã®æ¹æ³ãã§ãã 次ã®ããã«ãªããŸãã
01. GET http://services.odata.org/v4/TripRW/People HTTP/1.1
-GETãªã¯ãšã¹ãã
02. OData-Version: 4.0
ä»ãã®ç¹å¥ãªããããŒã
03. OData-MaxVersion: 4.0
çªç®ã®ç¹å¥ããŒãžã§ã³ããããŒ
çãã¯æ¬¡ã®ããã«ãªããŸãã
01. HTTP/1.1 200 OK
02. Content-Type: application/json; odata.metadata=minimal
03. OData-Version: 4.0
04. {
05. '@odata.context': 'http://services.odata.org/V4/
06. '@odata.nextLink' : 'http://services.odata.org/V4/
07. 'value': [{
08. '@odata.etag': 1W/108D1D5BD423E51581â²,
09. 'UserName': 'russellwhyte',
10. ...
ãããæ¡åŒµã¢ããªã±ãŒã·ã§ã³/ jsonãšãªããžã§ã¯ãã§ãã
æåã«ãODataã¯JSON APIãšåãã§ãããã䜿çšããŸããã§ããããODataã¯ç°¡æœã§ã¯ãããŸããã 巚倧ãªãªããžã§ã¯ãããããç§ã«ã¯ãã¹ãŠãã¯ããã«æªãèªãã§ããããã§ãã ODataããªãŒãã³ãœãŒã¹ã§ç»å ŽããŸããããããè€éã§ãã
GraphQLã¯ã©ãã§ããïŒ
åœç¶ãæ°ããAPI圢åŒãæ¢ããŠãããšãã«ããã®èªå€§åºåã«ééããŸããã
â é«ããšã³ããªã®ãããå€ã
ããã³ããšã³ãã®èŠ³ç¹ããèŠããšããã¹ãŠãã¯ãŒã«ã«èŠããŸãããæåã«å匷ããå¿ èŠããããããæ°ããéçºè ã«GraphQLãæžãããããšã¯ã§ããŸããã ããã¯SQLã®ãããªãã®ã§ããSQLãããã«æžãããšã¯ã§ããŸãããå°ãªããšããSQLã®å 容ãèªãã§ããã¥ãŒããªã¢ã«ãå®è¡ããå¿ èŠããããŸããã€ãŸãããšã³ããªã®ãããå€ãé«ããªããŸãã
â ããã°ãã³ã®å¹æã
ãããžã§ã¯ãã«APIããªããGraphQLã®äœ¿çšãéå§ããå Žåã1ãæåŸã«ãããç§ãã¡ã«åããªãããšãããã£ããããæé ãã«ãªããŸãã æŸèæãæžãå¿ èŠããããŸãã JSON APIãŸãã¯ODataã§é²åã§ããŸã-æãåçŽãªRESTfulã§ãåŸã ã«æ¹åãããJSON APIã«å€ãããŸãã
â ããã¯ãšã³ãã®å°çã
GraphQLã¯ã¯ãšãªãå®å šã«å¶åŸ¡ã§ãããããå®å šã«å®è£ ãããJSON APIãšåæ§ã«ãããã¯ãšã³ãã§1察1ã§å°çãåŒã³åºããŸããããã¯ã©ã€ãã©ãªã§ãããå€ãã®è³ªåã解決ããå¿ èŠããããŸãã
- ãã¹ãå¶åŸ¡;
- ååž°
- åšæ³¢æ°å¶é;
- ã¢ã¯ã»ã¹å¶åŸ¡ã
çµè«ã®ä»£ããã«
èªè»¢è»å°å±ã«ã€ããŠè°è«ããã®ããããŠãèªè»¢è»è±èœé²æ¢ããŒã«ãä»æ§ãšããŠæ¡çšããé©åãªä»æ§ã®APIãäœæããããšããå§ãããŸãã
èªè»¢è»å°å±ã®åé¡ã解決ããããã®åºæºãèŠã€ããã«ã¯ã次ã®ãªã³ã¯ãã芧ãã ããã
â http://jsonapi.org
â http://www.odata.org
â https://graphgl.org
â http://xmlrpc.scripting.com
â https://www.jsonrpc.org
: alexey-avdeev.com github .
, Frontend Conf , 27 28 ++ . , .
? ? ? , ? !
, , , , .