ããªãããã£ãã¾ã§èªãã§ããæè¡çã«å½¹ç«ã¤è¨äºã¯ã10å¹´å¾ã使ããã§ããããï¼ã»ã¨ãã©ã®å ´åã§ããã
ã¯ããã«
çæçã«å¹æçãªææ³ãç¥èã¯ãã½ããã¦ã§ã¢éçºã®åéã«ããã¦ãæ¥éã«ä¾¡å¤ã失ãå¾åãããã¾ãããã®ç¾è±¡ã¯ãç§ãã¡ãä½ãéç¹çã«å¦ã¶ã¹ããã示åãã¦ãã¾ããæãéè¦ãªã®ã¯ã第ä¸ã«åºæ¬çãªåçã»ååãããã¦ç¬¬äºã«æ¹æ³è«ã§ããç¹å®ã®ç¶æ³ã«ã®ã¿é©ç¨å¯è½ãªç¥èãå³åº§ã«çµæãåºããã¯ããã¯ã¯ãé·æçã«ã¯æç¨æ§ã失ãå¯è½æ§ãé«ãã§ããããã¯ãæè¡ãææ³ãæéã¨ã¨ãã«é²åããå¤åãã¦ããããã§ãã
ãAPI Design Patternsãã¯ããã®ãããªèãæ¹ãä½ç¾ããæ¸ç±ã§ããããã480 ãã¼ã¸ãããã¾ããæ¬æ¸ã¯åãªãææ³ã®åæã§ã¯ãªããWeb APIãã¶ã¤ã³ã®æ ¹å¹¹ããªãååã¨å²å¦ãæ¢æ±ãã¦ãã¾ããèè ã®JJ Geewaxæ°ã¯ãAPIããã³ã³ãã¥ã¼ã¿ã·ã¹ãã éã®ç¸äºä½ç¨ãå®ç¾©ããç¹å¥ãªç¨®é¡ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¨å®ç¾©ãããã®æ¬è³ªçãªå½¹å²ãæ確ã«ç¤ºãã¦ãã¾ãã
SREã®åéã«ããã¦ããnetmarkjpããã®ãç¾å ´ãããã ãã©ã¯ãã£ã¹ããã¨ã ååã¯ã ããã«ãã¨ããåè¶ããçºè¡¨è³æãããã¾ãããã®è³æã¯ãã®ããã«ååã大äºã«ããªããç¾å ´ããã£ã¦ããã«ã¯ã©ãããã°ãããã®æéã示ãã¦ããã¦ãã¾ãã
ãã®æ¸ç±ã¨ã®éé ãéãã¦ãç§ã®è¦åº§ã¯å¤§ããæ¡ããã¾ãããæ¥ã ç´é¢ããAPIè¨è¨ãå®è£ ãç¶æã®èª²é¡ã«å¯¾ããããæ·±é ãªæ´å¯ã¨é·æçãªå±æãå¾ãããã¨å®æãã¦ãã¾ããç¹ã«å°è±¡çã ã£ãã®ã¯ãèè ã«ããAPIã®å®ç¾©ã§ãããã³ã³ãã¥ã¼ã¿ã·ã¹ãã éã®ç¸äºä½ç¨ãå®ç¾©ããç¹å¥ãªç¨®é¡ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¨ãããã®æ´å¯ã¯ãAPIã®æ¬è³ªçå½¹å²ãé®®æã«ç §ããåºããç§ã®APIè¨è¨ã¸ã®ç解ãåçã«æ·±åããã¾ããã
ãã¯ããã«ãã«ããã¹ãå ¨ä½å
ãAPI Design Patternsãã¯ãAPIã®åºæ¬æ¦å¿µã¨éè¦æ§ããå§ã¾ããè¨è¨ååãåºæ¬çãªæä½ã¨æ©è½ããªã½ã¼ã¹éã®é¢ä¿æ§ã®è¡¨ç¾æ¹æ³ãè¤æ°ãªã½ã¼ã¹ã®ä¸æ¬æä½ãããã¦å®å ¨æ§ã¨ã»ãã¥ãªãã£ã«è³ãã¾ã§ãAPIãã¶ã¤ã³ã®å ¨ä½åãå æ¬çã«æ±ã£ã¦ãããåãã¼ãã§ã¯ãAPIã®å®ç¾©ã¨ç¹æ§ãè¨è¨ååï¼å½åè¦åããªã½ã¼ã¹ã®é層ãªã©ï¼ãåºæ¬çãªæä½ï¼æ¨æºã¡ã½ãããã«ã¹ã¿ã ã¡ã½ãããªã©ï¼ããªã½ã¼ã¹éã®é¢ä¿æ§ï¼ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãããªã¢ã¼ãã£ãºã ãªã©ï¼ãéåçæä½ï¼ãããå¦çããã¼ã¸ãã¼ã·ã§ã³ãªã©ï¼ãããã¦å®å ¨æ§ã¨ã»ãã¥ãªãã£ï¼ãã¼ã¸ã§ãã³ã°ãèªè¨¼ãªã©ï¼ã«ã¤ãã¦è©³ç´°ã«è§£èª¬ãããããã®è¦ç´ ãé©åã«çµã¿åããããã¨ã§ã使ãããããæè»ã§ãå®å ¨ãªAPIãè¨è¨ããããã®ç·åçãªæéãæä¾ãã¦ãã¾ãã
ããããAPIãè¨è¨ããããã®ã¢ã¤ãã¢
æ¬æ¸ãèªã¿é²ããä¸ã§ããã¢ã¤ãã¢ã®ã¤ããæ¹ãã§èª¬æããã¦ããã¢ã¤ãã¢åµåºã®æ ¹å¹¹ããªã2ã¤ã®åçããç§ãã¡ã®APIè¨è¨ã«ãé©ç¨ã§ããã®ã§ã¯ãªããã¨èãã¾ããããããã®åçã¨ã¯ä»¥ä¸ã®éãã§ãã
- ã¢ã¤ãã¢ã¨ã¯æ¢åã®è¦ç´ ã®æ°ããªçµã¿åããã§ãã
- æ¢åã®è¦ç´ ãæ°ããçµã¿åããã¸ã¨å°ãæè½ã¯ãäºç©éã®é¢é£æ§ãè¦åºãè½åã«å¤§ããä¾åãã
ä»å¾ã®APIè¨è¨ã«ããã¦ããããã®åçãæèçã«åãå ¥ããå®è·µãã¦ãããã¨ã§ãããé©æ°çã§ä½¿ããããAPIãçã¿åºããå¯è½æ§ãããã¾ãã
æ¥æ¬èªç
æ¥æ¬èªçã®åºçã¯ãå¤ãã®æ¥æ¬äººã¨ã³ã¸ãã¢ã«ã¨ã£ã¦ãæè¬ã§ããããã¾ãããè±èªç¹æã®ãã¥ã¢ã³ã¹ã®ææ¡ã«è¦å¿ããé¨åããæ¯å½èªã§èªã¿è§£ããã¨ã§ããæ·±ãç解ãå¾ãããæ¬æ¸ã®çé«ãããå¹æçã«å¸åã§ããã¨å®æãã¦ãã¾ãã
ããã³
ãã®æ¸ã¨ã®åºä¼ããéãã¦ãç§ã¯APIãã¶ã¤ã³ã®æ¬è³ªãä½å¾ããæ代ãè¶ ãã¦ä¾¡å¤ãæã¡ç¶ããè¨è¨ã¹ãã«ã磨ããã¨ãã§ããã¨ç¢ºä¿¡ãã¦ãã¾ããæè¡ã®æ½®æµã«å·¦å³ãããªããæ ¹æ¬çãªè¨è¨ååã身ã«ã¤ãããã¨ã§ãã¨ã³ã¸ãã¢ã¨ãã¦ã®èªå·±æé·ã¨ãããåè¶ããã·ã¹ãã è¨è¨ã®å®ç¾ã¸ã®éãéãããã¨æãã¦ãã¾ãã
æ¬ããã°ã§ã¯ããã®èªå¾æã«å ãã¦ãç§ãç¹ã«æ³¨ç®ããç¹ããæ¬æ¸ã®æ¦å¿µãGoè¨èªã§å ·ç¾åããå®è£ ä¾ãªã©ãè¨ãã¦ãã¾ãããããã®è¿½å ã³ã³ãã³ãããæ¬æ¸ã®ç解ãããæ·±ããå®è·µã¸ã®æ¶ãæ©ã¨ãªããã¨ãé¡ã£ã¦ãã¾ãã
ãAPI Design Patternsãã¨ã®éé ã¯ãç§ã®ã¨ã³ã¸ãã¢ã¨ãã¦ã®ãã£ãªã¢ã«æ°ããªå°å¹³ãéãã¦ããã¾ãããæ¬æ¸ããå¾ãç¥è¦ã¨æ´å¯ããä»å¾ã®æ¥åã«ååã«æ´»ããããããªãé«ã¿ãç®æãæåã§ãã
APIã®ä¸çã¸ã®æ·±ãç解ãå¾ãã«ã¯ããã®åå²ãç¥ããã¨ãéè¦ã§ãããã®è¦³ç¹ããããReal World HTTP 第3çâæ´å²ã¨ã³ã¼ãã«å¦ã¶ã¤ã³ã¿ã¼ãããã¨ã¦ã§ãæè¡ããä½µãã¦ãè¦ããã¾ãããã®æ¸ã¯ãAPIã®åºç¤ã¨ãªãHTTPã®æ´å²ã¨æè¡ãæ·±ãæãä¸ãã¦ãããAPIãã¶ã¤ã³ã®æèãããåºãè¦éã§æããã®ã«å½¹ç«ã¡ã¾ãã
å·çããã»ã¹ã¨å»ºè¨çãªå¯¾è©±ã®ãé¡ã
æå¾ã«ããã®ããã°ã®å·çããã»ã¹ã«ããã¦ã大è¦æ¨¡è¨èªã¢ãã«ï¼LLMï¼ãæ´»ç¨ãã¦ãããã¨ããä¼ããã¾ãããã®ãããä¸é¨ã®è¡¨ç¾ã«LLMç¹æã®æä½ãåæ ããã¦ããå¯è½æ§ãããã¾ãããã ããå 容ã®æ ¸å¿ã¨ä¸»å¼µã¯äººéã§ããç§ã®æèã¨å¤æã«åºã¥ãã¦ãã¾ããLLMã¯ä¸»ã«æç« ã®æ§æã表ç¾ã®æ´ç·´åã«å¯ä¸ãã¦ãã¾ãããæ¬è³ªçãªæ´å¯ãåæã¯äººéã®æç£ã§ãããã®ç¹ããç解ããã ããã°å¹¸ãã§ãããããææãã¦æ¦ã«æµ¸ã£ã¦ãã®æé«ã§ãããã¨ãåºæ¬çã«ã¯ç¹ç´°ãªã®ã§ãã£ã¨è°è«ãã§ããæè¦ããã¸ãã£ããªæè¦ãä¸ããã
æ¬æ¸ã®å 容ãç§ã®ææ³æã«ã¤ãã¦ãããã«è©³ããè°è«ãæè¦äº¤æããããæ¹ãããã£ãããã¾ããããXã®ãã¤ã¬ã¯ãã¡ãã»ã¼ã¸ã§ãé£çµ¡ãã ããããããªãã¯ãªå ´æã§ã®ä¸æ¹çãªæ¹å¤ã¯æ´åã«è¿ãã建è¨çãªå¯¾è©±ãéãã¦ãè¨äºãå çä¿®æ£ãããã§ããäºãã®ç解ãããã«æ·±ãããããã¨ã楽ãã¿ã«ãã¦ãã¾ãã
ç®æ¬¡
Xã§ææç´¹ä»ããæ¬ã®ä¸ã«ã¯ãããã1è¡ã§è¦ç¹ãä¼ãããããã®ãããããããããã®æ¬ã®ç§ã«ããã¦ã®ä¾¡å¤ã¯å¿ ããããã®é·ãã§æ¸¬ãããã®ã§ã¯ãªããç´¹ä»ãçãæ¬ãå£ã£ã¦ããããã§ããªããã°ãé·ãæ¬ã常ã«åªãã¦ããããã§ããªããéè¦ãªã®ã¯ããã®æ¬ãèªè ã«ã©ãã ãã®å½±é¿ãä¸ããã©ãã»ã©ã®æèãåèµ·ãããã ã
- ã¯ããã«
- ç®æ¬¡
- Part 1 Introduction
- 1 Introduction to APIs
- Web APIã®ç¹æ§ã¨éè¦æ§
- APIè¨è¨ã¢ããã¼ãã®æ¯è¼
- ãè¯ããAPIã®ç¹æ§
- éç¨å¯è½æ§ã¨SREã®è¦ç¹
- 表ç¾åã¨ä½¿ãããã
- ã·ã³ãã«æ§ã¨æè»æ§ã®ãã©ã³ã¹
- äºæ¸¬å¯è½æ§ã¨ã³ã¼ãä¸è²«æ§
- èè ã®ä¸»å¼µã«å¯¾ããè£å®çè¦ç¹
- ç·æ¬ã¨å®è·µã¸ã®å¿ç¨
- ç¶ç¶çæ¹åã¨é²åã®éè¦æ§
- çµè«
- 2 Introduction to API design patterns
- 1 Introduction to APIs
- Part 2 Design principles
- Part 3 Fundamentals
- Part 4 Resource relationships
- Part 5 Collective operations
- Part 6 Safety and security
- ãããã«
ãã¨ããæ¹æ³è«ã¯ç¢ºãã«éè¦ã§ãããããã¯åãªãããã¦ãã¼ãã§ã¯ããã¾ãããåªããæ¹æ³è«ã¯ãåºæ¬çãªåçã»ååã«åºã¥ãã¦ãããããããå®è·µçãªå½¢ã§å ·ç¾åãããã®ã§ããã¤ã¾ããæ¹æ³è«ãå¦ã¶ãã¨ã¯ããã®èå¾ã«ããåçãç解ãããããæ§ã ãªç¶æ³ã«é©ç¨ããè½åãé¤ããã¨ã«ã¤ãªããã¾ãã
ä¾ãã°ãã¢ã¸ã£ã¤ã«éçºãDevOpsã¨ãã£ãæ¹æ³è«ã¯ãã½ããã¦ã§ã¢éçºã«ãããéè¦ãªèãæ¹ãååãå®è·µçãªãã¬ã¼ã ã¯ã¼ã¯ã¨ãã¦æä¾ãã¦ãã¾ãããããã®æ¹æ³è«ãé©åã«ç解ãé©ç¨ãããã¨ã§ããã¼ã ã®çç£æ§ã製åã®å質ãåä¸ããããã¨ãã§ãã¾ãã
ããããããã§éè¦ãªã®ã¯ããããã®æ¹æ³è«ãåãªãæé ãã«ã¼ã«ã®éåã¨ãã¦æããã®ã§ã¯ãªãããã®æ ¹åºã«ããææ³ãç®çãç解ãããã¨ã§ãããããããã¨ã§ãæ¹æ³è«ãç¶æ³ã«å¿ãã¦æè»ã«é©ç¨ããããå¿ è¦ã«å¿ãã¦æ¹è¯ããããããã¨ãå¯è½ã«ãªãã¾ãã
ã¾ããæ¹æ³è«ã¯æ代ã¨ã¨ãã«é²åãã¾ããæ°ããæè¡ã課é¡ãç»å ´ãããã³ã«ãæ¢åã®æ¹æ³è«ãæ´æ°ãããããæ°ããæ¹æ³è«ãçã¾ããããã¾ãããããã£ã¦ãç¹å®ã®æ¹æ³è«ã«åºå·ããã®ã§ã¯ãªãã常ã«å¦ã³ç¶ããæ°ããç¥èãææ³ãåãå ¥ãã姿å¢ãéè¦ã§ãã
çµå±ã®ã¨ãããåçã»ååã¨æ¹æ³è«ã¯ç¸äºã«è£å®ãåãé¢ä¿ã«ããã¾ããåçã»ååã¯é·æçã«éç¨ããåºç¤ãæä¾ããæ¹æ³è«ã¯ãããå®è·µçã«é©ç¨ããæ段ãæä¾ãã¾ãã両è ããã©ã³ã¹ããå¦ã³ãç解ãããã¨ã§ãããå¹æçãã¤æè»ãªã½ããã¦ã§ã¢éçºãå¯è½ã«ãªãã®ã§ããè¨ããããã¨ã¯è¨ã£ãã®ã§æ¬ç·¨ã©ããï¼
Part 1 Introduction
ãã®ãã¼ãã§ã¯ãAPIã®åºæ¬æ¦å¿µãéè¦æ§ãããã¦ãè¯ããAPIã®ç¹æ§ã«ã¤ãã¦èª¬æãã¦ãã¾ããAPIã¯ãã³ã³ãã¥ã¼ã¿ã·ã¹ãã éã®ç¸äºä½ç¨ãå®ç¾©ããç¹å¥ãªç¨®é¡ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¨å®ç¾©ããããã®éè¦æ§ã強調ããã¦ãã¾ããWeb APIã®ç¹æ§ãRPCæåã¨ãªã½ã¼ã¹æåã®ã¢ããã¼ãã®æ¯è¼ãããã¦éç¨å¯è½æ§ã表ç¾åãã·ã³ãã«æ§ãäºæ¸¬å¯è½æ§ã¨ãã£ããè¯ããAPIã®ç¹æ§ã詳細ã«è§£èª¬ããã¦ãã¾ãã
1 Introduction to APIs
ãAPI Design Patternsãã®ç¬¬1ç« ãIntroduction to APIsãã¯ãAPIã®åºæ¬æ¦å¿µããå§ã¾ãããã®éè¦æ§ãè¨è¨å²å¦ãããã¦ãè¯ããAPIã®ç¹æ§ã«è³ãã¾ã§ãå¹ åºããããã¯ãã«ãã¼ãã¦ãã¾ããèè ã¯ãGoogle Cloud Platformã®ã¨ã³ã¸ãã¢ã¨ãã¦é·å¹´APIã®è¨è¨ã¨å®è£ ã«æºãã£ã¦ããçµé¨ãæ´»ãããçè«ã¨å®è·µã®ä¸¡é¢ããAPIã®æ¬è³ªã«è¿«ã£ã¦ãã¾ãã
ã¾ããAPIã®å®ç¾©ããå§ãã¾ããããèè ã¯ãAPIããã³ã³ãã¥ã¼ã¿ã·ã¹ãã éã®ç¸äºä½ç¨ãå®ç¾©ããç¹å¥ãªç¨®é¡ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãã¨èª¬æãã¦ãã¾ãããã®ä¸è¦ã·ã³ãã«ãªå®ç¾©ã®èå¾ã«ã¯ãGoogle Cloud Platformä¸ã®æ°å¤ãã®APIãè¨è¨ã»å®è£ ãã¦ããèè ã®æ·±ãæ´å¯ãé ãã¦ãã¾ããä¾ãã°ãGoogle Cloud StorageãBigQueryãªã©ã®ãµã¼ãã¹ã®APIã¯ããã®å®ç¾©ãä½ç¾ãã¦ãããè¤éãªã¯ã©ã¦ããªã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãç°¡æ½ãªã¤ã³ã¿ã¼ãã§ã¼ã¹ã§æä¾ãã¦ãã¾ãã
ãã®å®ç¾©ã¯ãé常ã«éè¦ã§ãããªããªããç§ãã¡ã®æ¥ã ã®æ¥åã®å¤ãã¯ãAPIãè¨è¨ããå®è£ ããããã¦ç¶æãããã¨ã«è²»ãããã¦ããããã§ãããAPIã«éã°ããã ãã®æ¥ã ãã¨ãã表ç¾ã¯ãå¤ãã®ã¨ã³ã¸ãã¢ã®å ±æãå¼ã¶ã§ããããããããèè ã®ç¤ºãè¦ç¹ã¯ãAPIãåãªãæè¡çãªæ§æè¦ç´ ã§ã¯ãªããã·ã¹ãã è¨è¨ã®ä¸æ ¸ãæãéè¦ãªæ¦å¿µã¨ãã¦æãç´ããã£ãããä¸ãã¦ããã¾ãã
Googleãæä¾ãã¦ããAPIè¨è¨ã¬ã¤ãããé常ã«åªããAPIã®ä¾ãç´¹ä»ãã¦ãã¾ãããã®ã¬ã¤ãã¯ãèè ãæå±ãã¦ãã Google ã®ã¨ã³ã¸ãã¢ãã¡ãé·å¹´ã®çµé¨ããå¾ãç¥è¦ãã¾ã¨ãããã®ã§ããããAPI Design Patternsãã®å 容ãè£å®ããè²´éãªãªã½ã¼ã¹ã¨ãªã£ã¦ãã¾ãã
ãã®ã¬ã¤ãã¨æ¬æ¸ãä½µãã¦èªããã¨ã§ãAPIã®è¨è¨ã«é¢ããããå æ¬çãªç解ãå¾ããã¾ããä¾ãã°ãã¬ã¤ãã§æ¨å¥¨ããã¦ããå½åè¦åãã¨ã©ã¼å¦çã®æ¹æ³ã¯ãæ¬æ¸ã§èª¬æããã¦ãããè¯ããAPIã®ç¹æ§ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ãã
ãã®ç« ã¯ãAPIã®åºæ¬ãå¦ã¶åå¿è ãããããè¯ãAPIè¨è¨ã模索ããçµé¨è±å¯ãªéçºè ã¾ã§ãå¹ åºãèªè ã«ä¾¡å¤ãæä¾ãã¾ããèè ã®æ´å¯ã¯ãç§ãã¡ãAPIãããæ·±ãç解ããããå¹æçã«è¨è¨ã»å®è£ ããããã®éæ¨ã¨ãªãã§ãããã
Web APIã®ç¹æ§ã¨éè¦æ§
ç¹ã«å°è±¡çã ã£ãã®ã¯ãèè ãWeb APIã®éè¦æ§ã¨ç¹æ§ã強調ãã¦ãããã¨ã§ããWeb APIã¯ããããã¯ã¼ã¯è¶ãã«æ©è½ãå ¬éãããã®å é¨ã®ä»çµã¿ãå¿ è¦ãªè¨ç®è½åãå¤é¨ããè¦ããªãããã«ããã¨ããç¹æ§ãæã£ã¦ãã¾ããããã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããæ´»ç¨ããææ°ã®ã¢ããªã±ã¼ã·ã§ã³ã®è¦³ç¹ããèããã¨ãé常ã«éè¦ãªæ¦å¿µã§ãã
ä¾ãã°ããã¤ã¯ããµã¼ãã¹ã¯ããã®å é¨ã®ä»çµã¿ã®è©³ç´°ãé ãã¤ã¤ãæ確ã«å®ç¾©ããã使ãæ¹ï¼APIï¼ãéãã¦ä»ã®ãµã¼ãã¹ã¨ããåããã¾ããããã«ããããµã¼ãã¹å士ã®ä¾åé¢ä¿ãå°ãªãä¿ã¡ãªãããã·ã¹ãã å ¨ä½ã®æè»æ§ã¨æ¡å¼µæ§ãé«ãããã¨ãã§ãã¾ãã
èè ã¯ãWeb APIã®ç¹å¾´ã¨ãã¦ãAPIæä¾è ã大ããªå¶å¾¡åãæã¤ä¸æ¹ã§ãå©ç¨è ã®å¶å¾¡åã¯éããã¦ãããã¨ãææãã¦ãã¾ããããã¯å®åã«ããã¦éè¦ãªèæ ®ç¹ã§ããä¾ãã°ãAPIã®å¤æ´ãå©ç¨è ã«ä¸ããå½±é¿ãæ éã«ç®¡çããå¿ è¦ãããã¾ããAPIã®ãã¼ã¸ã§ã³ç®¡çã段éçãªå°å ¥ãªã©ã®æè¡ãé©åã«æ´»ç¨ãããã¨ã§ãAPIã®é²åã¨å©ç¨è ã®ã·ã¹ãã ã®å®å®æ§ã®ãã©ã³ã¹ãåããã¨ãæ±ãããã¾ãã
APIè¨è¨ã¢ããã¼ãã®æ¯è¼
èè ã¯ãAPIã®è¨è¨ã¢ããã¼ãã¨ãã¦ãRPC (Remote Procedure Call) æåã¨ãªã½ã¼ã¹æåã®2ã¤ãæ¯è¼ãã¦ãã¾ãããã®æ¯è¼ã¯é常ã«èå³æ·±ããå®éã®éçºç¾å ´ã§ã®è°è«ãæ³èµ·ããã¾ããä¾ãã°ãgRPCã¯RPCæåã®APIãæä¾ããé«æ§è½ãªéä¿¡ãå®ç¾ãã¾ããä¸æ¹ã§ãREST APIã¯ãªã½ã¼ã¹æåã®ã¢ããã¼ããåããHTTPãããã³ã«ã®ç¹æ§ãæ´»ãããè¨è¨ãå¯è½ã§ãã
èè ãæå±ãããªã½ã¼ã¹æåAPIã®å©ç¹ãç¹ã«æ¨æºåãããæä½ï¼CRUDæä½ï¼ã¨ãªã½ã¼ã¹ã®çµã¿åããã«ããå¦ç¿æ²ç·ã®ç·©åã¯ãå®éã®éçºç¾å ´ã§ãæããç¹ã§ããä¾ãã°ãæ°ãããã¤ã¯ããµã¼ãã¹ããã¼ã ã«å°å ¥ããéããªã½ã¼ã¹æåã®APIã§ããã°ãéçºè ã¯æ¢åã®ç¥èï¼æ¨æºçãªHTTPã¡ã½ããã®ä½¿ãæ¹ãªã©ï¼ãæ´»ããã¤ã¤ãæ°ãããªã½ã¼ã¹ã®æ¦å¿µãå¦ã¶ã ãã§ç´ æ©ãé©å¿ã§ãã¾ãã
ãè¯ããAPIã®ç¹æ§
ãè¯ããAPIã®ç¹æ§ã«é¢ããèè ã®è¦è§£ã¯ãç¹ã«éè¦ã§ããèè ã¯ãè¯ãAPIã®ç¹æ§ã¨ãã¦ä»¥ä¸ã®4ç¹ãæãã¦ãã¾ãã
- éç¨å¯è½æ§ï¼Operationalï¼
- 表ç¾åï¼Expressiveï¼
- ã·ã³ãã«æ§ï¼Simpleï¼
- äºæ¸¬å¯è½æ§ï¼Predictableï¼
ãããã®ç¹æ§ã¯ãç¾ä»£ã®ã½ããã¦ã§ã¢éçºã«ããã¦é常ã«éè¦ã§ãã
éç¨å¯è½æ§ã¨SREã®è¦ç¹
éç¨å¯è½æ§ã«é¢ãã¦ã¯ãAPIãæ©è½çã«æ£ããã ãã§ãªããããã©ã¼ãã³ã¹ãã¹ã±ã¼ã©ããªãã£ãä¿¡é ¼æ§ãªã©ã®éæ©è½è¦ä»¶ãæºãããã¨ããå®éã®éç¨ç°å¢ã§ã¯æ¥µãã¦éè¦ã§ããä¾ãã°ã並è¡å¦çæ©è½ãæ´»ç¨ãã¦é«æ§è½ãªAPIãå®è£ ããOpenTelemetryãPrometheusãªã©ã®ã¢ãã¿ãªã³ã°ãã¼ã«ã¨é£æºãã¦ã¡ããªã¯ã¹ãåéãããã¨ã§ãéç¨å¯è½æ§ã®é«ãAPIãå®ç¾ã§ãã¾ãã
表ç¾åã¨ä½¿ãããã
表ç¾åã«é¢ããèè
ã®è°è«ã¯ãAPIè¨è¨ã®æ ¸å¿ãçªãã¦ãã¾ããAPIã¯åã«æ©è½ãæä¾ããã ãã§ãªãããã®æ©è½ãæ確ãã¤ç´æçã«è¡¨ç¾ããå¿
è¦ãããã¾ããä¾ãã°ãè¨èªæ¤åºæ©è½ãæä¾ããå ´åãTranslateText
ã¡ã½ããã使ã£ã¦éæ¥çã«è¨èªãæ¤åºããã®ã§ã¯ãªããDetectLanguage
ã¨ããå°ç¨ã®ã¡ã½ãããæä¾ãããã¨ã§ãAPIã®æå³ãããæ確ã«ãªãã¾ãã
ãã®ç¹ã¯ãç¹ã«ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦éè¦ã§ããåãµã¼ãã¹ã®APIãæ確ã§è¡¨ç¾åè±ãã§ããã°ããµã¼ãã¹éã®çµ±åãã¹ã ã¼ãºã«ãªããã·ã¹ãã å ¨ä½ã®ç解ã¨ä¿å®ã容æã«ãªãã¾ãã
ã·ã³ãã«æ§ã¨æè»æ§ã®ãã©ã³ã¹
èè ãææ¡ãããå ±éã®ã±ã¼ã¹ãç´ æ´ããããé«åº¦ãªã±ã¼ã¹ãå¯è½ã«ãããã¨ããã¢ããã¼ãã¯ãå®éã®APIè¨è¨ã§å¸¸ã«æèãã¹ãç¹ã§ããä¾ãã°ã翻訳APIã®è¨è¨ã«ããã¦ãåç´ãªè¨èªé翻訳ã¨ãç¹å®ã®æ©æ¢°å¦ç¿ã¢ãã«ãæå®ããé«åº¦ãªç¿»è¨³ã®ä¸¡æ¹ããµãã¼ãããæ¹æ³ã示ããã¦ãã¾ãã
ãã®ã¢ããã¼ãã¯ãAPIã®ä½¿ããããã¨æè»æ§ã®ãã©ã³ã¹ãåãä¸ã§é常ã«æç¨ã§ãããã®ãããªãã¶ã¤ã³ã¯éç¨ã®è¤éãã軽æ¸ããã¨ã©ã¼ã®å¯è½æ§ãæ¸ãããã¨ãã§ãã¾ãããã®è¾ºã¯ã¨ã¦ãè¯ãã®ã§æ¸ç±ãã確èªä¸ããã
äºæ¸¬å¯è½æ§ã¨ã³ã¼ãä¸è²«æ§
äºæ¸¬å¯è½æ§ã«é¢ããèè ã®ä¸»å¼µã¯ãç¹ã«å ±æã§ããç¹ã§ããAPIã®ä¸è²«æ§ãç¹ã«ãã£ã¼ã«ãåãã¡ã½ããåã®å½åè¦åã®çµ±ä¸ã¯ãéçºè ã®çç£æ§ã«ç´æ¥å½±é¿ãã¾ããå¤ãã®éçºãã¼ã ã§ã¯ãã³ã¼ãã¹ã¿ã¤ã«ã®ä¸è²«æ§ãä¿ã¤æåãæ ¹ä»ãã¦ãã¾ããããã¯ãAPIã®è¨è¨ã«ãåæ§ã«é©ç¨ãããã¹ãèãæ¹ã§ãã
äºæ¸¬å¯è½ãªAPIã¯ãå¦ç¿ã³ã¹ããä½æ¸ãã誤ç¨ã®å¯è½æ§ãæ¸ããã¾ããããã¯ã大è¦æ¨¡ãªã·ã¹ãã ããã¤ã¯ããµã¼ãã¹ç°å¢ã§ç¹ã«éè¦ã§ããä¸è²«ãããã¿ã¼ã³ãæã¤APIã¯ãæ°ãããµã¼ãã¹ã®çµ±åãæ¢åãµã¼ãã¹ã®æ¡å¼µã容æã«ãã¾ãã
èè ã®ä¸»å¼µã«å¯¾ããè£å®çè¦ç¹
ããããèè ã®ä¸»å¼µã«å¯¾ãã¦ãããã¤ãã®çåãè£å®çãªè¦ç¹ãèãããã¾ããä¾ãã°ããªã½ã¼ã¹æåAPIã常ã«æé©è§£ã§ãããã©ããã¯ãè°è«ã®ä½å°ãããã¾ããç¹ã«ããªã¢ã«ã¿ã¤ã æ§ãæ±ããããå ´åããè¤éãªãã¸ãã¹ãã¸ãã¯ãæ±ãå ´åãªã©ãRPCæåã®ã¢ããã¼ããé©ãã¦ããå ´åãããã¾ããgRPCã使ç¨ããã¹ããªã¼ãã³ã°APIãªã©ããªã½ã¼ã¹æåã¨RPCæåã®ãã¤ããªãããªã¢ããã¼ããæå¹ãªé¸æè¢ã¨ãªãããã§ãããã
ã¾ããèè ã¯APIè¨è¨ã®æè¡çå´é¢ã«ç¦ç¹ãå½ã¦ã¦ãã¾ãããçµç¹çãªå´é¢ã«ã¤ãã¦ãè¨åãããã°è¯ãã£ãã¨æãã¾ããä¾ãã°ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ãç°ãªããã¼ã ã管çããè¤æ°ã®ãµã¼ãã¹éã§APIã®ä¸è²«æ§ãä¿ã¤ããã«ã¯ãæè¡çãªè¨è¨ãã¿ã¼ã³ã ãã§ãªããçµç¹çãªã¬ããã³ã¹ãè¨è¨ã¬ãã¥ã¼ã®ããã»ã¹ãéè¦ã§ãã
ããã«ãAPIã®ãã¼ã¸ã§ãã³ã°ãå¾æ¹äºææ§ã®ç¶æã«é¢ãã詳細ãªè°è«ãããã°ãããå®è·µçãªå 容ã«ãªã£ãããããã¾ããããããã®ç¹ã¯ãã·ã¹ãã ã®å®å®æ§ã¨é²åã®ãã©ã³ã¹ãåãä¸ã§æ¥µãã¦éè¦ã§ãã
ç·æ¬ã¨å®è·µã¸ã®å¿ç¨
ç·æ¬ããã¨ããã®ç« ã¯APIã®åºæ¬æ¦å¿µã¨è¨è¨ååã«é¢ããåªããå°å ¥ãæä¾ãã¦ãã¾ããèè ã®ä¸»å¼µã¯ãæ¥ã ã®å®è·µã«ç´æ¥é©ç¨ã§ããæ´å¯ã«æºã¡ã¦ãã¾ãã
ç¹ã«ããè¯ããAPIã®ç¹æ§ã«é¢ããè°è«ã¯ãAPIè¨è¨ã®æéã¨ãã¦é常ã«æç¨ã§ãããããã®ååãæèããªããè¨è¨ãããã¨ã§ã使ãããããæ¡å¼µæ§ããããéç¨ããããAPIãå®ç¾ã§ããã§ãããã
ã¾ãããªã½ã¼ã¹æåAPIã®å©ç¹ã«é¢ããèè ã®ä¸»å¼µã¯ãRESTful APIã®è¨è¨ã«ããã¦ç¹ã«åèã«ãªãã¾ããå¤ãã®ç¾ä»£çãªWebãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ãã¦RESTful APIãå®è£ ãããã¨ãä¸è¬çã§ããããããã®ãã¬ã¼ã ã¯ã¼ã¯ã使ç¨ããéããèè ãæå±ãããªã½ã¼ã¹æåã®ååãæèãããã¨ã§ãããä¸è²«æ§ã®ããè¨è¨ãå¯è½ã«ãªãã¾ãã
ããããå®éã®éçºç¾å ´ã§ã¯ããããã®ååãæ©æ¢°çã«é©ç¨ããã ãã§ãªããå ·ä½çãªã¦ã¼ã¹ã±ã¼ã¹ãè¦ä»¶ã«å¿ãã¦é©åãªãã¬ã¼ããªããå¤æãããã¨ãéè¦ã§ããä¾ãã°ãããã©ã¼ãã³ã¹ã極ãã¦éè¦ãªå ´åã¯ãRESTful APIãããgRPCãé¸æãããªã©ãç¶æ³ã«å¿ããæè»ãªå¤æãæ±ãããã¾ãã
ããã«ãAPIã®è¨è¨ã¯æè¡çãªå´é¢ã ãã§ãªãããã¸ãã¹è¦ä»¶ãã¦ã¼ã¶ã¼ã®ãã¼ãºã¨ãå¯æ¥ã«é¢é£ãã¦ãã¾ãããããã£ã¦ãAPIè¨è¨ã®ããã»ã¹ã«ã¯ãæè¡ãã¼ã ã ãã§ãªãããããã¯ãããã¼ã¸ã£ã¼ãã¦ã¼ã¶ã¼ä½é¨ï¼UXï¼ã®å°é家ãªã©ãå¤æ§ãªã¹ãã¼ã¯ãã«ãã¼ãå·»ãè¾¼ããã¨ãéè¦ã§ãã
ç¶ç¶çæ¹åã¨é²åã®éè¦æ§
æå¾ã«ãAPIã®è¨è¨ã¯ä¸åº¦ã§å®æãããã®ã§ã¯ãªããç¶ç¶çãªæ¹åã¨é²åã®ããã»ã¹ã§ãããã¨ã強調ãããã¨æãã¾ããAPIã®æ§è½ã¢ãã¿ãªã³ã°ãã¨ã©ã¼ã¬ã¼ãåæã使ç¨ãã¿ã¼ã³ã®è¦³å¯ãªã©ãéãã¦ã常ã«APIã®å質ã¨æå¹æ§ãè©ä¾¡ããå¿ è¦ã«å¿ãã¦æ¹åãå ãã¦ãããã¨ãéè¦ã§ãã
ãã®ç« ã§å¦ãã ååã¨æ¦å¿µããåãªãçè«ã§ã¯ãªããå®éã®éçºãã©ã¯ãã£ã¹ã«çµ±åãã¦ãããã¨ãã次ã®ã¹ãããã¨ãªãã§ããããä¾ãã°ãAPIãã¶ã¤ã³ã¬ãã¥ã¼ã®ãã§ãã¯ãªã¹ããä½æãããã¼ã å ã§å ±æãããã¨ããAPIã®ã¹ã¿ã¤ã«ã¬ã¤ããä½æããä¸è²«æ§ã®ããè¨è¨ãä¿é²ãããã¨ãªã©ãèãããã¾ãã
ã¾ãããã®ç« ã®å 容ãè¸ã¾ãã¦ãæ¢åã®APIãè©ä¾¡ããæ¹åã®ä½å°ããªãããæ¤è¨ãããã¨ãæç¨ã§ããç¹ã«ãäºæ¸¬å¯è½æ§ãã·ã³ãã«æ§ã®è¦³ç¹ãããç¾å¨ã®APIãæé©åããã¦ããããè¦ç´ããã¨ã§ã大ããªæ¹åã«ã¤ãªããå¯è½æ§ãããã¾ãã
çµè«
çµè«ã¨ãã¦ããã®ç« ã¯APIãã¶ã¤ã³ã®åºæ¬ååãç解ããå®è·µããããã®åªããåºçºç¹ãæä¾ãã¦ãã¾ããããã§å¦ãã æ¦å¿µãå®è·µã«é©ç¨ãããã¨ã§ãããå ç¢ã§ä½¿ãããããããã¦éç¨ããããAPIãè¨è¨ã»å®è£ ãããã¨ãã§ããã§ããããããã¦ããããã®ååãæ¥ã ã®éçºãã©ã¯ãã£ã¹ã«çµã¿è¾¼ããã¨ã§ãé·æçã«ã¯ãããã¯ãã®å質åä¸ã¨ãã¼ã ã®çç£æ§åä¸ã«ã¤ãªããã¨ç¢ºä¿¡ãã¦ãã¾ãã
ãã®ç« ã®å 容ã¯ãåã«APIã®è¨è¨ã ãã§ãªããã½ããã¦ã§ã¢ã¢ã¼ããã¯ãã£å ¨ä½ã«é©ç¨ã§ããéè¦ãªååãæä¾ãã¦ãã¾ããã·ã¹ãã ã®ç¸äºéç¨æ§ãä¿å®æ§ãã¹ã±ã¼ã©ããªãã£ãåä¸ãããããã«ããããã®ååãåºãé©ç¨ãããã¨ãå¯è½ã§ãã
2 Introduction to API design patterns
ãAPI Design Patternsãã®ç¬¬2ç« ãIntroduction to API design patternsãã¯ãAPIè¨è¨ãã¿ã¼ã³ã®åºæ¬æ¦å¿µããå§ã¾ãããã®éè¦æ§ãæ§é ãããã¦å®éã®é©ç¨ã«è³ãã¾ã§ãå¹ åºããããã¯ãã«ãã¼ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯APIè¨è¨ãã¿ã¼ã³ã®æ¬è³ªã¨ããããã½ããã¦ã§ã¢éçºã«ããã¦ã©ã®ãããªå½¹å²ãæããããæ確ã«ç¤ºãã¦ãã¾ãã
APIè¨è¨ãã¿ã¼ã³ã®å®ç¾©ã¨éè¦æ§
APIè¨è¨ãã¿ã¼ã³ã¯ãã½ããã¦ã§ã¢è¨è¨ãã¿ã¼ã³ã®ä¸ç¨®ã§ãããAPIã®è¨è¨ã¨æ§é åã«é¢ããåå©ç¨å¯è½ãªè§£æ±ºçãæä¾ãã¾ããèè ã¯ããããã®ãã¿ã¼ã³ããé©å¿å¯è½ãªè¨è¨å³ãã¨å·§ã¿ã«è¡¨ç¾ãã¦ãã¾ãããã®æ¯å©ã¯ãAPIè¨è¨ãã¿ã¼ã³ã®æ¬è³ªãé常ã«ããæãã¦ãã¾ãã建ç¯ã®è¨è¨å³ã建ç©ã®æ§é ãå®ç¾©ããããã«ãAPIè¨è¨ãã¿ã¼ã³ã¯APIã®æ§é ã¨ã¤ã³ã¿ã¼ãã§ã¼ã¹ãå®ç¾©ãã¾ããããããéè¦ãªéãã¯ãAPIè¨è¨ãã¿ã¼ã³ãåºå®çã§ã¯ãªããæ§ã ãªç¶æ³ã«é©å¿å¯è½ã§ããã¨ããç¹ã§ãã
èè ã¯ãAPIè¨è¨ãã¿ã¼ã³ã®éè¦æ§ãAPIã®ç¡¬ç´æ§ã¨ãã観ç¹ãã説æãã¦ãã¾ããããã¯é常ã«éè¦ãªææã§ããAPIã¯ä¸åº¦å ¬éãããã¨ãå¤æ´ãå°é£ã«ãªãã¾ããããã¯ãAPIã®æ¶è²»è ï¼ã¯ã©ã¤ã¢ã³ãã¢ããªã±ã¼ã·ã§ã³ãªã©ï¼ãæ¢åã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã«ä¾åãã¦ããããã§ãããã®ç¡¬ç´æ§ã¯ãã·ã¹ãã ã®é²åãæ°æ©è½ã®è¿½å ãå°é£ã«ããå¯è½æ§ãããã¾ãã
ãã®åé¡ãèããã¨ãAPIã®ç¡¬ç´æ§ã¯ã·ã¹ãã ã®éç¨æ§ã¨ä¿¡é ¼æ§ã«ç´æ¥å½±é¿ãä¸ãã¾ããä¾ãã°ãä¸é©åã«è¨è¨ãããAPIã¯ãå°æ¥çãªã¹ã±ã¼ãªã³ã°ãæ§è½æé©åãå°é£ã«ããå¯è½æ§ãããã¾ããã¾ããAPIã®å¤æ´ãå¿ è¦ã«ãªã£ãå ´åãæ¢åã®ã¯ã©ã¤ã¢ã³ãã¨ã®äºææ§ãç¶æããªããå¤æ´ãè¡ãå¿ è¦ããããããã¯éç¨ä¸ã®å¤§ããªèª²é¡ã¨ãªãã¾ãã
ãã®åé¡ã«å¯¾å¦ãããããèè ã¯è¨è¨ãã¿ã¼ã³ãåæ段éããæ¡ç¨ãããã¨ã®éè¦æ§ã強調ãã¦ãã¾ããããã¯ãå°æ¥ã®å¤æ´ãæ¡å¼µã容æã«ããã·ã¹ãã ã®é·æçãªä¿å®æ§ãåä¸ãããä¸ã§é常ã«éè¦ã§ãããã®ã¢ããã¼ãã¯ã·ã¹ãã ã®å®å®æ§ã¨ä¿¡é ¼æ§ãé·æçã«ç¢ºä¿ããããã®éè¦ãªæ¦ç¥ã§ãã
APIè¨è¨ãã¿ã¼ã³ã®æ§é
èè ã¯ãAPIè¨è¨ãã¿ã¼ã³ã®æ§é ã詳細ã«èª¬æãã¦ãã¾ããç¹ã«èå³æ·±ãã®ã¯ããã¿ã¼ã³ã®è¨è¿°ã«å«ã¾ããè¦ç´ ã§ãã
- ååã¨ã·ããã·ã¹
- åæ©
- æ¦è¦
- å®è£
- ãã¬ã¼ããªã
ãã®æ§é ã¯ããã¿ã¼ã³ãç解ãé©ç¨ããä¸ã§é常ã«æç¨ã§ããç¹ã«ããã¬ã¼ããªãã®é ç®ã¯éè¦ã§ããã½ããã¦ã§ã¢å·¥å¦ã«ããã¦ããã¹ã¦ã®æ±ºå®ã«ã¯ãã¬ã¼ããªããä¼´ãã¾ãããã¿ã¼ã³ãé©ç¨ããéãä¾å¤ã§ã¯ããã¾ãããè±ç·ãã¾ããã¢ã¼ããã¯ãã£ã®ãã¬ã¼ããªãã«ã¤ãã¦ã¯ãã¡ãããªã¹ã¹ã¡ã§ãã
ãã¬ã¼ããªãã®ç解ã¯ãªã¹ã¯ç®¡çã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããä¾ãã°ããããã¿ã¼ã³ãæ¡ç¨ãããã¨ã§ãã·ã¹ãã ã®æè»æ§ãåä¸ããä¸æ¹ã§ãè¤éæ§ãå¢å ããããããã¾ããããã®ãã¬ã¼ããªããç解ããé©åã«ç®¡çãããã¨ã¯ãã·ã¹ãã ã®ä¿¡é ¼æ§ã¨ããã©ã¼ãã³ã¹ãæé©åããä¸ã§éè¦ã§ãã
å®è·µçãªé©ç¨ï¼Twapiã®äºä¾ç 究
èè ã¯ãTwitter風ã®APIã§ããTwapiãçèªããã¦ä¾ã«åããAPIè¨è¨ãã¿ã¼ã³ã®å®è·µçãªé©ç¨ã示ãã¦ãã¾ãããã®äºä¾ç 究ã¯ãçè«ãå®è·µã«ç§»ãä¸ã§é常ã«æç¨ã§ãã
ç¹ã«èå³æ·±ãã®ã¯ãã¡ãã»ã¼ã¸ã®ãªã¹ãåã¨ã¨ã¯ã¹ãã¼ãã®2ã¤ã®æ©è½ã«ç¦ç¹ãå½ã¦ã¦ããç¹ã§ãããããã®æ©è½ã¯ãå¤ãã®APIã§å ±éãã¦å¿ è¦ã¨ããããã®ã§ãããå®éã®éçºã·ã¼ã³ã§ãé »ç¹ã«ééãã課é¡ã§ãã
ã¡ãã»ã¼ã¸ã®ãªã¹ãå
èè ã¯ãã¾ããã¿ã¼ã³ãé©ç¨ããã«ã¡ãã»ã¼ã¸ããªã¹ãåããæ©è½ãå®è£ ãããã®å¾ã«ãã¼ã¸ãã¼ã·ã§ã³ãã¿ã¼ã³ãé©ç¨ããå®è£ ã示ãã¦ãã¾ãããã®ã³ã³ãã©ã¹ãã¯é常ã«æè²çã§ãã
ãã¿ã¼ã³ãé©ç¨ããªãåæã®å®è£ ã¯ã以ä¸ã®ããã«ãªã£ã¦ãã¾ãã
interface ListMessagesResponse { results: Message[]; }
ãã®å®è£ ã¯ä¸è¦ã·ã³ãã«ã§ãããèè ãææããããã«ããã¼ã¿éãå¢å ããå ´åã«åé¡ãçºçãã¾ããä¾ãã°ãæ°åä¸ä»¶ã®ã¡ãã»ã¼ã¸ãä¸åº¦ã«è¿ããã¨ããã¨ãã¬ã¹ãã³ã¹ã®ãµã¤ãºã巨大ã«ãªãããããã¯ã¼ã¯ã®å¸¯åå¹ ãå§è¿«ããã¯ã©ã¤ã¢ã³ãå´ã§ã®å¦çãå°é£ã«ãªãã¾ãã
ããã«å¯¾ãããã¼ã¸ãã¼ã·ã§ã³ãã¿ã¼ã³ãé©ç¨ããå®è£ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
interface ListMessagesRequest { parent: string; pageToken: string; maxPageSize?: number; } interface ListMessagesResponse { results: Message[]; nextPageToken: string; }
ãã®å®è£
ã§ã¯ãã¯ã©ã¤ã¢ã³ãã¯pageToken
ã¨maxPageSize
ãæå®ãããã¨ã§ãå¿
è¦ãªéã®ãã¼ã¿ã段éçã«åå¾ã§ãã¾ããããã«ããã大éã®ãã¼ã¿ãå¹ççã«æ±ããã¨ãå¯è½ã«ãªãã¾ãã
ãã®ãã¿ã¼ã³ã®é©ç¨ã¯ã·ã¹ãã ã®å®å®æ§ã¨ã¹ã±ã¼ã©ããªãã£ã«å¤§ããè²¢ç®ãã¾ãã大éã®ãã¼ã¿ãä¸åº¦ã«éä¿¡ããå¿ è¦ããªããªãããããããã¯ã¼ã¯è² è·ã軽æ¸ããããµã¼ãã¼ã®ãªã½ã¼ã¹æ¶è²»ãæãããã¾ããã¾ããã¯ã©ã¤ã¢ã³ãå´ã§ãå¦çãããã¼ã¿éãå¶å¾¡å¯è½ã«ãªããããã¢ããªã±ã¼ã·ã§ã³ã®ããã©ã¼ãã³ã¹ã¨å®å®æ§ãåä¸ãã¾ãã
ãã¼ã¿ã®ã¨ã¯ã¹ãã¼ã
ãã¼ã¿ã®ã¨ã¯ã¹ãã¼ãæ©è½ã«é¢ãã¦ããèè ã¯åæ§ã®ã¢ããã¼ããåã£ã¦ãã¾ããã¾ããã¿ã¼ã³ãé©ç¨ããªãå®è£ ã示ãããã®å¾ã«Import/Exportãã¿ã¼ã³ãé©ç¨ããå®è£ ãæ示ãã¦ãã¾ãã
ãã¿ã¼ã³ãé©ç¨ããªãåæã®å®è£ ã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãã
interface ExportMessagesResponse { exportDownloadUri: string; }
ãã®å®è£ ã¯ãã¨ã¯ã¹ãã¼ãããããã¼ã¿ã®ãã¦ã³ãã¼ãURLãè¿ãã ãã®åç´ãªãã®ã§ããããããèè ãææããããã«ããã®æ¹æ³ã«ã¯å¹¾ã¤ãã®å¶éãããã¾ããä¾ãã°ãã¨ã¯ã¹ãã¼ãå¦çã®é²æç¶æ³ã確èªã§ããªããã¨ã¯ã¹ãã¼ãå ãæè»ã«æå®ã§ããªãããã¼ã¿ã®å§ç¸®ãæå·åãªãã·ã§ã³ãæå®ã§ããªããªã©ã®åé¡ãããã¾ãã
ããã«å¯¾ããImport/Exportãã¿ã¼ã³ãé©ç¨ããå®è£ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
interface ExportMessagesRequest { parent: string; outputConfig: MessageOutputConfig; } interface MessageOutputConfig { destination: Destination; compressionConfig?: CompressionConfig; encryptionConfig?: EncryptionConfig; } interface ExportMessagesResponse { outputConfig: MessageOutputConfig; }
ãã®å®è£ ã§ã¯ãã¨ã¯ã¹ãã¼ãå ããã¼ã¿ã®å¦çæ¹æ³ãæè»ã«æå®ã§ããããã«ãªã£ã¦ãã¾ããããã«ãèè ã¯é·æéå®è¡æä½ãã¿ã¼ã³ãçµã¿åããããã¨ã§ãã¨ã¯ã¹ãã¼ãå¦çã®é²æç¶æ³ã追跡ããæ¹æ³ãæ示ãã¦ãã¾ãã
ãã®ãã¿ã¼ã³ã®é©ç¨ã¯ã·ã¹ãã ã®éç¨æ§ã¨å¯è¦³æ¸¬æ§ãå¤§å¹ ã«åä¸ããã¾ããã¨ã¯ã¹ãã¼ãå¦çã®é²æã追跡ã§ããããã«ãªããã¨ã§ãåé¡ãçºçããéã®è¿ éãªå¯¾å¿ãå¯è½ã«ãªãã¾ããã¾ããã¨ã¯ã¹ãã¼ãè¨å®ã®æè»æ§ãå¢ããã¨ã§ãæ§ã ãªã¦ã¼ã¹ã±ã¼ã¹ã«å¯¾å¿ã§ããããã«ãªããã·ã¹ãã ã®å©ç¨å¯è½æ§ãåä¸ãã¾ãã
APIè¨è¨ãã¿ã¼ã³ã®é©ç¨ï¼æ©ææ¡ç¨ã®éè¦æ§
èè ã¯ãAPIè¨è¨ãã¿ã¼ã³ã®æ©ææ¡ç¨ã®éè¦æ§ã強調ãã¦ãã¾ããããã¯é常ã«éè¦ãªææã§ããAPIãå¾ããå¤æ´ãããã¨ã¯å°é£ã§ãããå¤ãã®å ´åãç ´å£çãªå¤æ´ãä¼´ãã¾ãã
ä¾ãã°ããã¼ã¸ãã¼ã·ã§ã³ãã¿ã¼ã³ãå¾ããå°å ¥ãããã¨ããå ´åãæ¢åã®ã¯ã©ã¤ã¢ã³ãã¯å ¨ã¦ã®ãã¼ã¿ãä¸åº¦ã«è¿ã£ã¦ãããã¨ãæå¾ ãã¦ãããããæ°ããã¤ã³ã¿ã¼ãã§ã¼ã¹ã«å¯¾å¿ã§ãã¾ãããããã¯ãå¾æ¹äºææ§ã®åé¡ãå¼ãèµ·ããã¾ãã
ãã®åé¡ã¯ã·ã¹ãã ã®å®å®æ§ã¨ä¿¡é ¼æ§ã«ç´æ¥å½±é¿ãã¾ããAPIã®ç ´å£çå¤æ´ã¯ãä¾åããã·ã¹ãã ããµã¼ãã¹ã®æ©è½åæ¢ãå¼ãèµ·ããå¯è½æ§ãããã¾ããããã¯ããµã¼ãã¹ã¬ãã«ç®æ¨ï¼SLOï¼ã®éåã«ã¤ãªããå¯è½æ§ãããã¾ãã
ãããã£ã¦ãAPIè¨è¨ãã¿ã¼ã³ã®æ©ææ¡ç¨ã¯ãé·æçãªè¦ç¹ã§ã·ã¹ãã ã®å®å®æ§ã¨é²åå¯è½æ§ã確ä¿ããããã®éè¦ãªæ¦ç¥ã¨è¨ãã¾ããããã¯ããè¨è¨è² åµããæå°éã«æããå°æ¥ã®æ¡å¼µæ§ã確ä¿ãããã¨ã«ã¤ãªããã¾ãã
çµè«
æ¬ç« ã¯ãAPIè¨è¨ãã¿ã¼ã³ã®åºæ¬çãªæ¦å¿µã¨éè¦æ§ãæ確ã«ç¤ºãã¦ãã¾ããç¹ã«ãAPIã®ç¡¬ç´æ§ã¨ããç¹æ§ã«ç¦ç¹ãå½ã¦ãè¨è¨ãã¿ã¼ã³ã®æ©ææ¡ç¨ãããã«éè¦ã§ãããã強調ãã¦ããç¹ã¯é常ã«éè¦ã§ãã
ãã®ç« ã§å¦ãã å 容ã¯ãã·ã¹ãã ã®é·æçãªä¿¡é ¼æ§ãå¯ç¨æ§ãä¿å®æ§ã確ä¿ããä¸ã§é常ã«éè¦ã§ããAPIè¨è¨ãã¿ã¼ã³ãé©åã«é©ç¨ãããã¨ã§ãã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ãéç¨æ§ãå¯è¦³æ¸¬æ§ãåä¸ããããã¨ãã§ãã¾ãã
ãããããã¿ã¼ã³ã®é©ç¨ã«å½ãã£ã¦ã¯ã常ã«ãã¬ã¼ããªããèæ ®ããå¿ è¦ãããã¾ãããã¿ã¼ã³ãé©ç¨ãããã¨ã§è¤éæ§ãå¢ãå¯è½æ§ããããããã·ã¹ãã ã®è¦ä»¶ãå¶ç´ãååã«ç解ããä¸ã§ãé©åãªãã¿ã¼ã³ãé¸æãããã¨ãéè¦ã§ãã
APIè¨è¨ã¯åãªãæè¡çãªåé¡ã§ã¯ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ãéçºããã»ã¹ãéç¨å®è·µã«æ·±ãé¢ããåé¡ã§ãããã¨ãèªèãããã¨ãéè¦ã§ãã
Part 2 Design principles
ããã§ã¯ãAPIãã¶ã¤ã³ã®æ ¸å¿ã¨ãªãååãè°è«ããã¦ãã¾ããå½åè¦åããªã½ã¼ã¹ã®ã¹ã³ã¼ãã¨é層ããã¼ã¿åã¨ããã©ã«ãå¤ããªã½ã¼ã¹ã®èå¥åãæ¨æºã¡ã½ãããé¨åçãªæ´æ°ã¨åå¾ãã«ã¹ã¿ã ã¡ã½ãããªã©ã®éè¦ãªãããã¯ãåãä¸ãããã¦ãã¾ãããããã®ååã¯ãä¸è²«æ§ãããã使ãããããæ¡å¼µæ§ã®ããAPIãè¨è¨ããä¸ã§ä¸å¯æ¬ ã§ãã
3 Naming
ãAPI Design Patternsãã®ç¬¬3ç« ãNamingãã¯ãAPIè¨è¨ã«ãããå½åã®éè¦æ§ãè¯ãååã®ç¹æ§ãè¨èªã»ææ³ã»æ§æã®é¸æãã³ã³ããã¹ãã®å½±é¿ããã¼ã¿åã¨åä½ã®æ±ããããã¦ä¸é©åãªå½åãããããçµæã«ã¤ãã¦å¹ åºãè«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯å½åãåãªã表é¢çãªåé¡ã§ã¯ãªããAPIã®ä½¿ãããããä¿å®æ§ãããã¦é·æçãªæåã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
å½åã®éè¦æ§
èè ã¯ãå½åãã½ããã¦ã§ã¢éçºã«ããã¦é¿ããããªããããã¦æ¥µãã¦éè¦ãªå´é¢ã§ãããã¨ããè°è«ãå§ãã¦ãã¾ããç¹ã«APIã®æèã§ã¯ãé¸æãããååã¯APIã®å©ç¨è ãç´æ¥ç®ã«ããç¸äºä½ç¨ããé¨åã§ããããããã®éè¦æ§ã¯åå¢ãã¾ãããã«ã¼ã«ãºã»ãªãã»ããã°ã©ãã³ã°ãã§ã¯"åªããååããæé«ã®ããã¥ã¡ã³ãã§ãã"ã¨è¿°ã¹ããã¦ãã¾ãããã¾ãã«ãã®éãã ã¨è¨ããã§ãããã
ãã®ç¹ã¯ãç¹ã«ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãéçºã®æèã§éè¦ã§ãããããã®ç°å¢ã§ã¯ãå¤æ°ã®ãµã¼ãã¹ãã³ã³ãã¼ãã³ããç¸äºã«éä¿¡ããããããã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãéãã¦æ©è½ãæä¾ãã¾ããé©åãªå½åã¯ããããã®ãµã¼ãã¹éã®é¢ä¿ãæ確ã«ããã·ã¹ãã å ¨ä½ã®ç解ãä¿é²ãã¾ãã
ä¾ãã°ãKubernetesç°å¢ã§åä½ãããã¤ã¯ããµã¼ãã¹ãèãã¦ã¿ã¾ãããããµã¼ãã¹åãã¨ã³ããã¤ã³ãåããã©ã¡ã¼ã¿åãªã©ã®å½åãé©åã§ããã°ãéçºè ã¯ã·ã¹ãã ã®å ¨ä½åãææ¡ãããããªããæ°ããæ©è½ã®è¿½å ãæ¢åæ©è½ã®ä¿®æ£ãã¹ã ã¼ãºã«è¡ãã¾ããéã«ãå½åãä¸é©åã§ããã°ããµã¼ãã¹éã®ä¾åé¢ä¿ã®ç解ãå°é£ã«ãªããã·ã¹ãã ã®è¤éæ§ãä¸å¿ è¦ã«å¢å¤§ããå¯è½æ§ãããã¾ãã
èè ã¯ãAPIã®ååãå¤æ´ãããã¨ã®å°é£ãã«ã¤ãã¦ãè¨åãã¦ãã¾ããããã¯ãå¾æ¹äºææ§ã®ç¶æã¨ãã観ç¹ããé常ã«éè¦ãªææã§ããä¸åº¦å ¬éãããAPIã®ååãå¤æ´ãããã¨ã¯ããã®APIã«ä¾åããå ¨ã¦ã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ããããã¯ãã·ã¹ãã ã®å®å®æ§ã¨ä¿¡é ¼æ§ã«ç´æ¥é¢ããåé¡ã§ãã
ãã®ç¹ã¯ãç¹ã«ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããä¾ãã°ãã»ãã³ãã£ãã¯ãã¼ã¸ã§ãã³ã°ãæ¡ç¨ãã¦ããå ´åãååã®å¤æ´ã¯é常ã¡ã¸ã£ã¼ãã¼ã¸ã§ã³ã®æ´æ°ãå¿ è¦ã¨ãã¾ããããã¯ããã®å¤æ´ãå¾æ¹äºææ§ãç ´å£ããå¯è½æ§ããããã¨ãæå³ãã¾ãããããã£ã¦ãåæã®æ®µéã§é©åãªå½åãè¡ããã¨ã¯ãå°æ¥çãªãã¼ã¸ã§ã³ç®¡çã®è¤éãã軽æ¸ããã·ã¹ãã ã®é·æçãªä¿å®æ§ãåä¸ãããä¸ã§æ¥µãã¦éè¦ã§ãã
è¯ãååã®ç¹æ§
èè ã¯ãè¯ãååã®ç¹æ§ã¨ãã¦ã表ç¾åããã·ã³ãã«ãããäºæ¸¬å¯è½æ§ãã®3ã¤ãæãã¦ãã¾ãããããã®ç¹æ§ã¯ãAPIã®è¨è¨å ¨ä½ã«ãé©ç¨ã§ããéè¦ãªååã§ãã
表ç¾åã¯ãååã表ãæ¦å¿µãæ©è½ãæ確ã«ä¼ããè½åãæãã¾ããä¾ãã°ãCreateAccount
ã¨ããååã¯ãã¢ã«ã¦ã³ããä½æããã¨ããæ©è½ãæ確ã«è¡¨ç¾ãã¦ãã¾ãããã®è¡¨ç¾åã¯ãAPIã®èªå·±ææ¸åã«ã¤ãªãããéçºè
ãAPIãç´æçã«ç解ãã使ç¨ãããã¨ãå¯è½ã«ãã¾ãã
ã·ã³ãã«ãã¯ãä¸å¿
è¦ãªè¤éããé¿ããæ¬è³ªçãªæå³ãç°¡æ½ã«ä¼ããè½åã§ããèè
ã¯UserPreferences
ã¨ããä¾ãæãã¦ãã¾ãããããã¯UserSpecifiedPreferences
ãããã·ã³ãã«ã§ãããªãããååã«æå³ãä¼ãã¦ãã¾ããã·ã³ãã«ãªååã¯ãã³ã¼ãã®å¯èªæ§ãé«ããAPIã®å¦ç¿æ²ç·ãç·©ããã«ãã¾ãã
äºæ¸¬å¯è½æ§ã¯ãAPIã®ä¸è²«æ§ã«é¢ããéè¦ãªç¹æ§ã§ããèè ã¯ãåãæ¦å¿µã«ã¯åãååããç°ãªãæ¦å¿µã«ã¯ç°ãªãååã使ç¨ãããã¨ã®éè¦æ§ã強調ãã¦ãã¾ããããã¯ãAPIã®å¦ç¿å¯è½æ§ã¨ä½¿ããããã«ç´æ¥å½±é¿ãã¾ãã
ãããã®ç¹æ§ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ç¹ã«éè¦ã§ããå¤æ°ã®ãµã¼ãã¹ãåå¨ããç°å¢ã§ã¯ãåãµã¼ãã¹ã®APIãä¸è²«ããå½åè¦åã«å¾ã£ã¦ãããã¨ããã·ã¹ãã å
¨ä½ã®ç解ã¨ä¿å®ã容æã«ãã¾ããä¾ãã°ãå
¨ã¦ã®ãµã¼ãã¹ã§ããªã½ã¼ã¹ã®ä½æã«Create
ãæ´æ°ã«Update
ãåé¤ã«Delete
ã¨ãããã¬ãã£ãã¯ã¹ã使ç¨ããã¨ãã£ãä¸è²«æ§ã¯ãéçºè
ã®çç£æ§ã大ããåä¸ããã¾ãã
Golangã®æèã§ã¯ããããã®ååã¯ç¹ã«éè¦ã§ããGoã®è¨è¨å²å¦ã¯ãã·ã³ãã«ãã¨æ確ããéè¦ãã¦ãããããã¯APIè¨è¨ã«ãåæ ãããã¹ãã§ããä¾ãã°ãGoã®æ¨æºã©ã¤ãã©ãªã§ã¯ãhttp.ListenAndServe
ãjson.Marshal
ã®ãããªãåè©+åè©ã®å½¢å¼ã§ç°¡æ½ãã¤è¡¨ç¾åè±ããªååãå¤ç¨ããã¦ãã¾ãããããã®ååã¯ããã®æ©è½ãæ確ã«è¡¨ç¾ããªããããä¸å¿
è¦ã«é·ããªããªãããé
æ
®ããã¦ãã¾ãã
è¨èªãææ³ãæ§æã®é¸æ
èè ã¯ãAPIè¨è¨ã«ãããè¨èªãææ³ãæ§æã®é¸æã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ããç¹ã«èå³æ·±ãã®ã¯ãã¢ã¡ãªã«è±èªãæ¨æºã¨ãã¦ä½¿ç¨ãããã¨ã®æ¨å¥¨ã§ããããã¯ãã°ãã¼ãã«ãªç¸äºéç¨æ§ãæ大åããããã®å®ç¨çãªé¸æã¨ãã¦æ示ããã¦ãã¾ãã
ãã®é¸æã¯ãå½éçãªãã¼ã ãååããã¢ãã³ãªéçºç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãå¤å½ç±ä¼æ¥ã®ãã¤ã¯ããµã¼ãã¹ç°å¢ã§ã¯ãåãµã¼ãã¹ã®APIãä¸è²«ããè¨èªã§è¨è¨ããã¦ãããã¨ãããã¼ã éã®ã³ãã¥ãã±ã¼ã·ã§ã³ã¨çµ±åãåæ»ã«ãã¾ãã
ææ³ã«é¢ãã¦ã¯ãèè
ã¯åè©ã®ä½¿ç¨æ³ãç¹ã«å½ä»¤æ³ã®éè¦æ§ã強調ãã¦ãã¾ããä¾ãã°ãCreateBook
ãDeleteWeatherReading
ã®ãããªååã¯ãã¢ã¯ã·ã§ã³ã®ç®çãæ確ã«ç¤ºãã¾ããããã¯ãRESTful APIã®è¨è¨ååã¨ãæ´åãã¦ãããHTTPåè©ã¨ãªã½ã¼ã¹åã®çµã¿åããã«ããç´æçãªAPIãã¶ã¤ã³ãä¿é²ãã¾ãã
æ§æã«é¢ãã¦ã¯ãä¸è²«ããã±ã¼ã¹ï¼camelCase, snake_case, kebab-caseï¼ã®ä½¿ç¨ãæ¨å¥¨ããã¦ãã¾ããããã¯ãAPIã®ä¸è²«æ§ã¨äºæ¸¬å¯è½æ§ãé«ããããã«éè¦ã§ããä¾ãã°ãGolangã§ã¯é常ãå ¬éãããé¢æ°ãã¡ã½ããã«ã¯ PascalCase ããéå ¬éã®ãã®ã«ã¯ camelCase ã使ç¨ãã¾ãããã®è¦åã API è¨è¨ã«ãé©ç¨ãããã¨ã§ãGo éçºè ã«ã¨ã£ã¦é¦´æã¿ããã API ãä½æã§ãã¾ãã
type UserService interface { CreateUser(ctx context.Context, user *User) error GetUserByID(ctx context.Context, id string) (*User, error) UpdateUserProfile(ctx context.Context, id string, profile *UserProfile) error }
ãã®ãããªä¸è²«ããå½åè¦åã¯ãAPI ã®ä½¿ç¨è ãæ°ããã¨ã³ããã¤ã³ããæ©è½ã容æã«äºæ¸¬ããç解ãããã¨ãå¯è½ã«ãã¾ãã
ã³ã³ããã¹ãã¨å½å
èè ã¯ãå½åã«ãããã³ã³ããã¹ãã®éè¦æ§ã強調ãã¦ãã¾ããåãååã§ããç°ãªãã³ã³ããã¹ãã§å ¨ãç°ãªãæå³ãæã¤å¯è½æ§ãããã¨ããææã¯ãç¹ã«ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦éè¦ã§ãã
ä¾ãã°ãUser
ã¨ããååã¯ãèªè¨¼ãµã¼ãã¹ã§ã¯èªè¨¼æ
å ±ãæã¤ã¨ã³ãã£ãã£ãæãå¯è½æ§ãããã¾ããã注æ管çãµã¼ãã¹ã§ã¯é¡§å®¢æ
å ±ãæãå¯è½æ§ãããã¾ãããã®ãããªå ´åãã³ã³ããã¹ããæ確ã«ããããã«ãAuthUser
ãCustomerUser
ã®ããã«ãããå
·ä½çãªååã使ç¨ãããã¨ãæã¾ããã§ãããã
ããã¯ããã¡ã¤ã³é§åè¨è¨ï¼DDDï¼ã®æ¦å¿µã¨ãå¯æ¥ã«é¢é£ãã¦ãã¾ããDDDã§ã¯ãåãã¡ã¤ã³ï¼ã¾ãã¯ãã¦ã³ãããã³ã³ããã¹ãï¼å ã§ä¸è²«ããç¨èªã使ç¨ãããã¨ãæ¨å¥¨ããã¾ããAPIè¨è¨ã«ããã¦ãããã®ååãé©ç¨ããåãµã¼ãã¹ãã¢ã¸ã¥ã¼ã«ã®ãã¡ã¤ã³ã«é©ããååãé¸æãããã¨ãéè¦ã§ãã
ä¾ãã°ãEã³ãã¼ã¹ã·ã¹ãã ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãèãã¦ã¿ã¾ãããï¼
- 注æãµã¼ãã¹:
Order
,OrderItem
,PlaceOrder
- å¨åº«ãµã¼ãã¹:
InventoryItem
,StockLevel
,ReserveStock
- æ¯æãµã¼ãã¹:
Payment
,Transaction
,ProcessPayment
åãµã¼ãã¹ã¯ããã®ãã¡ã¤ã³ã«ç¹åããç¨èªã使ç¨ãã¦ãã¾ããããã«ãããåãµã¼ãã¹ã®è²¬ä»»ç¯å²ãæ確ã«ãªããä»ã®ãµã¼ãã¹ã¨ã®å¢çãæ確ã«ãªãã¾ãã
ãã¼ã¿åã¨åä½
èè ã¯ããã¼ã¿åã¨åä½ã®æ±ãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ããç¹ã«ãåä½ãååã«å«ãããã¨ã®éè¦æ§ã強調ããã¦ãã¾ããããã¯ãAPI ã®æ確ãã¨å®å ¨æ§ãé«ããä¸ã§é常ã«éè¦ã§ãã
ä¾ãã°ããµã¤ãºã表ããã£ã¼ã«ããåã« size
ã¨ããã®ã§ã¯ãªããsizeBytes
ã sizeMegapixels
ã®ããã«åä½ãæ示ãããã¨ã§ããã®ãã£ã¼ã«ãã®æå³ã¨ä½¿ç¨æ¹æ³ãæ確ã«ãªãã¾ããããã¯ãç¹ã«ç°ãªãã·ã¹ãã éã§æ
å ±ãããåãããéã«éè¦ã§ãã
èè ãæãã¦ããç«ææ°åè»éè¹ã®ä¾ã¯ãåä½ã®ä¸ä¸è´ãããããé大ãªçµæã示ã極端ãªä¾ã§ãããæ¥å¸¸çãªéçºã«ããã¦ãåæ§ã®åé¡ã¯èµ·ãããã¾ããä¾ãã°ããããµã¼ãã¹ãç§åä½ã§æéãæ±ããå¥ã®ãµã¼ããããªç§åä½ã§æ±ã£ã¦ããå ´åãåä½ãæ示ããã¦ããªãã¨æ·±å»ãªãã°ã®åå ã¨ãªãå¯è½æ§ãããã¾ãã
Golangã«ããã¦ããã®ãããªåé¡ã«å¯¾å¦ããããã®ä¸ã¤ã®æ¹æ³ã¯ãã«ã¹ã¿ã åã使ç¨ãããã¨ã§ããä¾ãã°ï¼
type Bytes int64 type Megapixels float64 type Image struct { Content []byte SizeBytes Bytes Dimensions struct { Width Megapixels Height Megapixels } }
ãã®ãããªã¢ããã¼ãã¯ãåå®å ¨æ§ãé«ããåä½ã®èª¤ç¨ãé²ãã®ã«å½¹ç«ã¡ã¾ããããã«ããããã®åã«ç¹å®ã®ã¡ã½ããã追å ãããã¨ã§ãåä½å¤æãå¤ã®æ¤è¨¼ã容æã«è¡ããã¨ãã§ãã¾ãã
çµè«
èè ã¯ãè¯ãå½åã®éè¦æ§ã¨ããããAPIã®åè³ªå ¨ä½ã«ä¸ããå½±é¿ãæ確ã«ç¤ºãã¦ãã¾ããè¯ãååã¯ãåã«ã³ã¼ããèªã¿ãããããã ãã§ãªããAPIã®ä½¿ãããããä¿å®æ§ãããã¦é·æçãªé²åå¯è½æ§ã«ç´æ¥å½±é¿ãä¸ãã¾ãã
ç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã¯ãé©åãªå½åãã·ã¹ãã å ¨ä½ã®ç解ã¨ç®¡çã容æã«ããéµã¨ãªãã¾ããä¸è²«æ§ã®ããã表ç¾åè±ãã§ããã¤ã·ã³ãã«ãªååãé¸æãããã¨ã§ãéçºè ã¯APIãç´æçã«ç解ããå¹ççã«ä½¿ç¨ãããã¨ãã§ãã¾ãã
ã¾ããåä½ããã¼ã¿åãæ確ã«ç¤ºãååã使ç¨ãããã¨ã¯ãã·ã¹ãã ã®å®å ¨æ§ã¨ä¿¡é ¼æ§ãé«ããä¸ã§éè¦ã§ããããã¯ãç¹ã«ç°ãªãã·ã¹ãã ããã¼ã éã§ãã¼ã¿ãããåãããéã«ã誤解ã誤ç¨ãé²ãå¹æçãªæ段ã¨ãªãã¾ãã
Golangã®æèã§ã¯ãè¨èªã®è¨è¨å²å¦ã§ããã·ã³ãã«ãã¨æ確ããåæ ããAPIè¨è¨ãéè¦ã§ããæ¨æºã©ã¤ãã©ãªã®å½åè¦åã«å£ããç°¡æ½ã§ãã¤è¡¨ç¾åè±ããªååãé¸æãããã¨ã§ãGoéçºè ã«ã¨ã£ã¦è¦ªåæ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ãã
æå¾ã«ãå½åã¯æè¡çãªåé¡ã§ããã¨åæã«ãã³ãã¥ãã±ã¼ã·ã§ã³ã®åé¡ã§ãããã¾ããé©åãªå½åã¯ãéçºè éããã¼ã éãããã«ã¯çµç¹éã®ã³ãã¥ãã±ã¼ã·ã§ã³ãä¿é²ããããã¸ã§ã¯ãã®æåã«å¤§ããå¯ä¸ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯å½åã«ååãªæéã¨æ³¨æãæããé·æçãªè¦ç¹ã§ãã®å½±é¿ãèæ ®ããå¿ è¦ãããã¾ãã
4 Resource scope and hierarchy
ãAPI Design Patternsãã®ç¬¬4ç« ãResource scope and hierarchyãã¯ãAPIã«ããããªã½ã¼ã¹ã®ã¹ã³ã¼ãã¨é層æ§é ã«ç¦ç¹ãå½ã¦ããªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®æ¦å¿µããªã½ã¼ã¹éã®é¢ä¿æ§ã®ç¨®é¡ãã¨ã³ãã£ãã£é¢ä¿å³ã®æ´»ç¨æ¹æ³ãé©åãªãªã½ã¼ã¹é¢ä¿ã®é¸æåºæºãããã¦ãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®ã¢ã³ããã¿ã¼ã³ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã½ã¼ã¹ä¸å¿ã®APIè¨è¨ã®éè¦æ§ã¨ããããã·ã¹ãã ã®æ¡å¼µæ§ãä¿å®æ§ãããã¦å ¨ä½çãªã¢ã¼ããã¯ãã£ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®éè¦æ§
èè ã¯ãAPIãã¶ã¤ã³ã«ããã¦ãªã½ã¼ã¹ã«ç¦ç¹ãå½ã¦ããã¨ã®éè¦æ§ããè°è«ãå§ãã¦ãã¾ããããã¯ãRESTful APIã®è¨è¨ååã¨å¯æ¥ã«é¢é£ãã¦ãããã¢ã¯ã·ã§ã³ããããªã½ã¼ã¹ãä¸å¿ã«èãããã¨ã§ãAPIå ¨ä½ã®ä¸è²«æ§ã¨ç解ãããããåä¸ãããã¨ã強調ãã¦ãã¾ãã
ãã®èãæ¹ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãéçºã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ãæ±ããªã½ã¼ã¹ã¨ãã®é¢ä¿æ§ãæ確ã«å®ç¾©ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®è¤éæ§ã管çãããããªãã¾ãã
èè ãæ示ãããªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®æ¦å¿µã¯ãåã«ãã¼ã¿ãã¼ã¹ã¹ãã¼ããè¨è¨ããã®ã¨ã¯ç°ãªãã¾ããAPIã®ãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã¯ãã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼éã®å¥ç´ã§ãããã·ã¹ãã ã®æ¯ãèããæ©è½ãå®ç¾©ããéè¦ãªè¦ç´ ã¨ãªãã¾ãããã®ç¹ã§ããªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã¯ã·ã¹ãã ã®å¤é¨ã¤ã³ã¿ã¼ãã§ã¼ã¹ãå½¢ä½ãéè¦ãªè¦ç´ ã§ãããæ éã«è¨è¨ããå¿ è¦ãããã¾ãã
ãªã½ã¼ã¹éã®é¢ä¿æ§
èè ã¯ããªã½ã¼ã¹éã®é¢ä¿æ§ã詳細ã«åé¡ããããããã®ç¹æ§ã¨é©ç¨å ´é¢ã«ã¤ãã¦è«ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãã¯ä»¥ä¸ã®ç¹ã§ãã
åç §é¢ä¿: æãåºæ¬çãªé¢ä¿æ§ã§ããããªã½ã¼ã¹ãä»ã®ãªã½ã¼ã¹ãåç §ããå½¢å¼ã§ããä¾ãã°ãã¡ãã»ã¼ã¸ãªã½ã¼ã¹ãèè ã¦ã¼ã¶ã¼ãåç §ããå ´åãªã©ã該å½ãã¾ãã
å¤å¯¾å¤é¢ä¿: è¤æ°ã®ãªã½ã¼ã¹ãäºãã«é¢é£ããè¤éãªé¢ä¿æ§ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ã¨ãã£ããã«ã¼ã ã®é¢ä¿ãªã©ãæãããã¾ãã
èªå·±åç §é¢ä¿: åãã¿ã¤ãã®ãªã½ã¼ã¹ãäºãã«åç §ãåãé¢ä¿æ§ã§ããé層æ§é ã社ä¼çãªãããã¯ã¼ã¯ã®è¡¨ç¾ã«é©ãã¦ãã¾ãã
é層é¢ä¿: 親åé¢ä¿ã表ç¾ããç¹æ®ãªé¢ä¿æ§ã§ãææ権ãå å«é¢ä¿ã示ãã¾ãã
ãããã®é¢ä¿æ§ã®ç解ã¨é©åãªé©ç¨ã¯ãAPIã®è¨è¨ã«ããã¦æ¥µãã¦éè¦ã§ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ã¯ããµã¼ãã¹éã®å¢çãå®ç¾©ããéã«ãããã®é¢ä¿æ§ãæ éã«èæ ®ããå¿ è¦ãããã¾ãã
ä¾ãã°ãGolangãç¨ãã¦ãã¤ã¯ããµã¼ãã¹ãå®è£ ããå ´åããããã®é¢ä¿æ§ãé©åã«è¡¨ç¾ãããã¨ãéè¦ã§ãã以ä¸ã¯ããã£ããã¢ããªã±ã¼ã·ã§ã³ã«ãããã¡ãã»ã¼ã¸ã¨ã¦ã¼ã¶ã¼ã®é¢ä¿ã表ç¾ããç°¡åãªä¾ã§ãã
type Message struct { ID string `json:"id"` Content string `json:"content"` AuthorID string `json:"author_id"` Timestamp time.Time `json:"timestamp"` } type User struct { ID string `json:"id"` Username string `json:"username"` Email string `json:"email"` } type ChatRoom struct { ID string `json:"id"` Name string `json:"name"` UserIDs []string `json:"user_ids"` }
ãã®ä¾ã§ã¯ãMessage
ãUser
ãåç
§ããé¢ä¿æ§ã¨ãChatRoom
ã¨User
ã®å¤å¯¾å¤é¢ä¿ã表ç¾ãã¦ãã¾ãã
ã¨ã³ãã£ãã£é¢ä¿å³ã®æ´»ç¨
èè ã¯ãã¨ã³ãã£ãã£é¢ä¿å³ï¼ERDï¼ã®éè¦æ§ã¨ãã®èªã¿æ¹ã«ã¤ãã¦è©³ãã説æãã¦ãã¾ããERDã¯ããªã½ã¼ã¹éã®é¢ä¿æ§ãè¦è¦çã«è¡¨ç¾ããå¼·åãªãã¼ã«ã§ããç¹ã«ãã«ã¼ãã£ããªãã£ï¼ä¸å¯¾ä¸ãä¸å¯¾å¤ãå¤å¯¾å¤ãªã©ï¼ãæ確ã«ç¤ºããã¨ãã§ããç¹ãéè¦ã§ãã
ERDã®æ´»ç¨ã¯ãAPIã®è¨è¨ãã§ã¼ãºã ãã§ãªããããã¥ã¡ã³ãã¼ã·ã§ã³ãéçºè éã®ã³ãã¥ãã±ã¼ã·ã§ã³ã«ããã¦ãé常ã«æå¹ã§ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã®ãããªè¤éãªã·ã¹ãã ã§ã¯ãåãµã¼ãã¹ãæ±ããªã½ã¼ã¹ã¨ãã®é¢ä¿æ§ãè¦è¦çã«ç解ãããã¨ããå ¨ä½åã®ææ¡ã«å½¹ç«ã¡ã¾ãã
é©åãªé¢ä¿æ§ã®é¸æ
èè ã¯ããªã½ã¼ã¹éã®é©åãªé¢ä¿æ§ãé¸æããéã®èæ ®ç¹ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ããç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
é¢ä¿æ§ã®å¿ è¦æ§: ãã¹ã¦ã®ãªã½ã¼ã¹éã«é¢ä¿æ§ãæãããå¿ è¦ã¯ããã¾ãããå¿ è¦æå°éã®é¢ä¿æ§ã«çãããã¨ã§ãAPIã®è¤éæ§ãæå¶ã§ãã¾ãã
ã¤ã³ã©ã¤ã³å vs åç §: ãªã½ã¼ã¹ã®æ å ±ãã¤ã³ã©ã¤ã³åããããåç §ã¨ãã¦æ±ããã®é¸æã¯ãããã©ã¼ãã³ã¹ã¨ãã¼ã¿ã®ä¸è²«æ§ã®ãã¬ã¼ããªããèæ ®ãã¦æ±ºå®ããå¿ è¦ãããã¾ãã
é層é¢ä¿ã®é©åãªä½¿ç¨: é層é¢ä¿ã¯å¼·åã§ãããé度ã«æ·±ãé層ã¯é¿ããã¹ãã§ãã
ãããã®é¸æã¯ãã·ã¹ãã ã®æ¡å¼µæ§ã¨ä¿å®æ§ã«å¤§ããªå½±é¿ãä¸ãã¾ããä¾ãã°ãä¸å¿ è¦ã«å¤ãã®é¢ä¿æ§ãæã¤APIã¯ãå°æ¥çãªå¤æ´ãå°é£ã«ãªãå¯è½æ§ãããã¾ããä¸æ¹ã§ãé©åã«è¨è¨ãããé¢ä¿æ§ã¯ãã·ã¹ãã ã®ç解ã容æã«ããæ°æ©è½ã®è¿½å ãã¹ã±ã¼ãªã³ã°ãåæ»ã«è¡ããã¨ãã§ãã¾ãã
ã¢ã³ããã¿ã¼ã³ã®åé¿
èè ã¯ããªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã«ãããä¸è¬çãªã¢ã³ããã¿ã¼ã³ã¨ãã®åé¿æ¹æ³ã«ã¤ãã¦èª¬æãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãã¢ã³ããã¿ã¼ã³ã¯ä»¥ä¸ã®éãã§ãã
å ¨ã¦ããªã½ã¼ã¹åãã: å°ããªæ¦å¿µã¾ã§ãã¹ã¦ããªã½ã¼ã¹åãããã¨ã¯ãAPIãä¸å¿ è¦ã«è¤éã«ããå¯è½æ§ãããã¾ãã
æ·±ãããé層: é度ã«æ·±ãé層æ§é ã¯ãAPIã®ä½¿ç¨ã¨ç解ãå°é£ã«ãã¾ãã
å ¨ã¦ãã¤ã³ã©ã¤ã³åãã: ãã¼ã¿ã®éè¤ãä¸è²«æ§ã®åé¡ãå¼ãèµ·ããå¯è½æ§ãããã¾ãã
ãããã®ã¢ã³ããã¿ã¼ã³ãåé¿ãããã¨ã§ããã使ãããããä¿å®æ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããä¾ãã°ãæ·±ãããé層æ§é ãé¿ãããã¨ã§ãAPIã®ã¨ã³ããã¤ã³ããã·ã³ãã«ã«ãªããã¯ã©ã¤ã¢ã³ãå´ã®å®è£ ã容æã«ãªãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã®å¿ç¨ãèããã¨ã以ä¸ã®ãããªç¹ãéè¦ã«ãªãã¾ãã
ãµã¼ãã¹å¢çã®å®ç¾©: ãªã½ã¼ã¹ã®é¢ä¿æ§ãé©åã«è¨è¨ãããã¨ã§ããã¤ã¯ããµã¼ãã¹éã®å¢çãæ確ã«å®ç¾©ã§ãã¾ããããã¯ãã·ã¹ãã ã®æ¡å¼µæ§ã¨ä¿å®æ§ã«ç´æ¥çãªå½±é¿ãä¸ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: ã¤ã³ã©ã¤ã³åã¨åç §ã®é©åãªé¸æã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ã«å¤§ããå½±é¿ãã¾ããä¾ãã°ãé »ç¹ã«ä¸ç·ã«ã¢ã¯ã»ã¹ããããã¼ã¿ãã¤ã³ã©ã¤ã³åãããã¨ã§ãä¸å¿ è¦ãªãããã¯ã¼ã¯å¼ã³åºããæ¸ãããã¨ãã§ãã¾ãã
é²åå¯è½æ§: é©åã«ãªã½ã¼ã¹ã¨é¢ä¿æ§ãè¨è¨ãããã¨ã§ãå°æ¥çãªAPIã®æ¡å¼µãå¤æ´ã容æã«ãªãã¾ããããã¯ãé·æçãªã·ã¹ãã éç¨ã«ããã¦é常ã«éè¦ã§ãã
ä¸è²«æ§ã¨äºæ¸¬å¯è½æ§: ãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®ä¸è²«ããã¢ããã¼ãã¯ãAPIã®å¦ç¿æ²ç·ãç·©ããã«ããéçºè ã®çç£æ§ãåä¸ããã¾ãã
éç¨ã®ç°¡ç´ å: é©åã«è¨è¨ããããªã½ã¼ã¹é層ã¯ãã¢ã¯ã»ã¹å¶å¾¡ããã°åæãªã©ã®éç¨ã¿ã¹ã¯ãç°¡ç´ åãã¾ãã
Golangã®æèã§ã¯ããããã®è¨è¨ååãåæ ããAPIã®å®è£ ãéè¦ã«ãªãã¾ããä¾ãã°ãGoã®æ§é ä½ãã¤ã³ã¿ã¼ãã§ã¼ã¹ã使ç¨ãã¦ããªã½ã¼ã¹éã®é¢ä¿æ§ãæ確ã«è¡¨ç¾ãããã¨ãã§ãã¾ããã¾ããGoã®å¼·åãªåã·ã¹ãã ãæ´»ç¨ãããã¨ã§ãAPIã®ä¸è²«æ§ã¨åå®å ¨æ§ã確ä¿ãããã¨ãã§ãã¾ãã
çµè«
第4ç« ãResource scope and hierarchyãã¯ãAPIãã¶ã¤ã³ã«ããããªã½ã¼ã¹ã®ã¹ã³ã¼ãã¨é層æ§é ã®éè¦æ§ãæ確ã«ç¤ºãã¦ãã¾ããé©åãªãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®è¨è¨ã¯ãAPIã®ä½¿ãããããæ¡å¼µæ§ãä¿å®æ§ã«ç´æ¥çãªå½±é¿ãä¸ãã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
- ãªã½ã¼ã¹éã®é¢ä¿æ§ãæ éã«è¨è¨ããå¿ è¦æå°éã®é¢ä¿æ§ã«çãããã¨ã
- ã¤ã³ã©ã¤ã³åã¨åç §ã®ãã¬ã¼ããªããç解ããé©åã«é¸æãããã¨ã
- é層é¢ä¿ãå¹æçã«ä½¿ç¨ãã¤ã¤ãé度ã«æ·±ãé層ã¯é¿ãããã¨ã
- ä¸è¬çãªã¢ã³ããã¿ã¼ã³ãèªèããåé¿ãããã¨ã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãAPIã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªãªã½ã¼ã¹ã¬ã¤ã¢ã¦ãã®è¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æ¡å¼µæ§ãä¿å®æ§ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
5 Data types and defaults
ãAPI Design Patternsãã®ç¬¬5ç« ãData types and defaultsãã¯ãAPIã«ããããã¼ã¿åã¨ããã©ã«ãå¤ã®éè¦æ§ãåãã¼ã¿åã®ç¹æ§ã¨ä½¿ç¨ä¸ã®æ³¨æç¹ãããã¦ã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ã®èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯APIã®è¨è¨ã«ããã¦é©åãªãã¼ã¿åã®é¸æã¨ããã©ã«ãå¤ã®æ±ãããAPIã®ä½¿ãããããä¿¡é ¼æ§ãããã¦é·æçãªä¿å®æ§ã«ã©ã®ããã«å½±é¿ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãã¼ã¿åã®éè¦æ§ã¨èª²é¡
èè ã¯ãAPIã«ããããã¼ã¿åã®éè¦æ§ããè°è«ãå§ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãã¯ãããã°ã©ãã³ã°è¨èªåºæã®ãã¼ã¿åã«ä¾åãããã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ãã©ã¼ãããï¼ä¸»ã«JSONï¼ãä»ãã¦ç°ãªãè¨èªéã§äºææ§ã®ãããã¼ã¿è¡¨ç¾ãå®ç¾ãããã¨ã®éè¦æ§ã§ãããã®åé¡ã¯æ ¹æ·±ããã¦ä¸ã¤ã®è§£æ±ºçã¨ãã¦éçºè¨èªãæããã¾ã§ãã¦ãçµç¹ããã
ãã®æ¦å¿µãè¦è¦çã«è¡¨ç¾ããããã«ãèè ã¯ä»¥ä¸ã®å³ãæ示ãã¦ãã¾ãã
ãã®å³ã¯ãAPIãµã¼ãã¼ããã¯ã©ã¤ã¢ã³ãã¸ã®ãã¼ã¿ã®æµãã示ãã¦ãã¾ãããµã¼ãã¼å´ã§ã®ããã°ã©ãã³ã°è¨èªåºæã®è¡¨ç¾ãã·ãªã¢ã©ã¤ãºãããè¨èªéä¾åã®å½¢å¼ï¼å¤ãã®å ´åJSONï¼ã«å¤æããããããã¯ã¼ã¯ãä»ãã¦éä¿¡ããã¾ããã¯ã©ã¤ã¢ã³ãå´ã§ã¯ããã®ãã¼ã¿ããã·ãªã¢ã©ã¤ãºãããåã³ã¯ã©ã¤ã¢ã³ãã®è¨èªåºæã®è¡¨ç¾ã«å¤æããã¾ãã
ãã®éç¨ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããç°ãªãè¨èªããã¬ã¼ã ã¯ã¼ã¯ã§å®è£ ãããè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ããã®ãããªãã¼ã¿ã®å¤æã¨ä¼éãé »ç¹ã«è¡ãããããããã¼ã¿åã®ä¸è²«æ§ã¨äºææ§ãä¸å¯æ¬ ã§ããä¾ãã°ããããµã¼ãã¹ã64ãããæ´æ°ã使ç¨ããå¥ã®ãµã¼ãã¹ãããã32ãããæ´æ°ã¨ãã¦è§£éãã¦ãã¾ãã¨ãæ·±å»ãªãã°ãä¸æ´åãçºçããå¯è½æ§ãããã¾ãã
èè ãææãããnullãå¤ã¨ãmissingãå¤ã®åºå¥ãéè¦ãªè«ç¹ã§ããããã¯ããªãã·ã§ãã«ãªå¤ã®æ±ãã«ããã¦ç¹ã«éè¦ã§ãAPIã®è¨è¨è ã¯ãã®éããæ確ã«æèããé©åã«å¦çããå¿ è¦ãããã¾ããä¾ãã°ãGolangã«ããã¦ã¯ã以ä¸ã®ããã«æ§é ä½ã®ãã£ã¼ã«ãããã¤ã³ã¿åã«ãããã¨ã§ããã®åºå¥ã表ç¾ã§ãã¾ãã
type User struct { ID string `json:"id"` Name string `json:"name"` Age *int `json:"age,omitempty"` IsActive *bool `json:"is_active,omitempty"` }
ãã®è¨è¨ã«ãããAge
ãIsActive
ãã£ã¼ã«ããçç¥ãããå ´åï¼missingï¼ã¨ãæ示çã«null
ãè¨å®ãããå ´åãåºå¥ã§ãã¾ãããã®ãããªç´°ããéãã«æ³¨æãæããã¨ã§ãAPIã®æè»æ§ã¨è¡¨ç¾åãé«ãããã¨ãã§ãã¾ãã
ããªããã£ããã¼ã¿åã®æ±ã
èè ã¯ããã¼ã«å¤ãæ°å¤ãæååã¨ãã£ãããªããã£ããã¼ã¿åã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãã¯ããããã®ãã¼ã¿åã®é©åãªä½¿ç¨æ³ã¨ãã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³æã®æ³¨æç¹ã§ãã
ãã¼ã«å¤ã«é¢ãã¦ã¯ããã£ã¼ã«ãåã®é¸æãéè¦ã§ããã¨ææãã¦ãã¾ããä¾ãã°ãdisallowChatbots
ãããallowChatbots
ã使ç¨ãããã¨ã§ãäºéå¦å®ãé¿ããAPIã®ç解ãããããåä¸ããããã¨ãã§ãã¾ãã
æ°å¤ã«é¢ãã¦ã¯ã大ããªæ´æ°ãæµ®åå°æ°ç¹æ°ã®æ±ãã«æ³¨æãå¿ è¦ã§ããèè ã¯ããããã®å¤ãæååã¨ãã¦ã·ãªã¢ã©ã¤ãºãããã¨ãææ¡ãã¦ãã¾ããããã¯ç¹ã«éè¦ãªææã§ãä¾ãã°JavaScriptã§ã¯64ãããæ´æ°ãæ£ç¢ºã«æ±ããªãã¨ããåé¡ãããã¾ããGolangã§ãããå®è£ ããå ´åã以ä¸ã®ãããªã¢ããã¼ããèãããã¾ãã
type LargeNumber struct { Value string `json:"value"` } func (ln *LargeNumber) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } // ããã§æååãé©åãªæ°å¤åã«å¤æ // ã¨ã©ã¼ãã§ãã¯ãè¡ã return nil }
æååã«é¢ãã¦ã¯ãUTF-8ã¨ã³ã³ã¼ãã£ã³ã°ã®ä½¿ç¨ã¨ãæ£è¦åå½¢å¼ï¼ç¹ã«NFCï¼ã®éè¦æ§ã強調ããã¦ãã¾ããããã¯ç¹ã«èå¥åã¨ãã¦ä½¿ç¨ãããæååã«éè¦ã§ãä¸è²«æ§ã®ããæ¯è¼ãä¿è¨¼ãã¾ãã
ã³ã¬ã¯ã·ã§ã³ã¨æ§é ä½
èè ã¯ããªã¹ãï¼é åï¼ã¨ãããï¼ãªãã¸ã§ã¯ãï¼ã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãããããã®ãã¼ã¿åã¯ãè¤éãªãã¼ã¿æ§é ã表ç¾ããä¸ã§ä¸å¯æ¬ ã§ãããé©åã«ä½¿ç¨ããªãã¨åé¡ãå¼ãèµ·ããå¯è½æ§ãããã¾ãã
ãªã¹ãã«é¢ãã¦ã¯ãè¦ç´ ã®åã®ä¸è²«æ§ã¨ããµã¤ãºã®å¶éã®éè¦æ§ãææããã¦ãã¾ããããã¯ãAPI ã®å®å®æ§ã¨ããã©ã¼ãã³ã¹ã«ç´æ¥å½±é¿ãã¾ããä¾ãã°ããªã¹ãã®ãµã¤ãºãç¡å¶éã«å¤§ãããªããã¨ã許å¯ããã¨ãã¡ã¢ãªä½¿ç¨éã®å¢å¤§ãã¬ã¹ãã³ã¹æéã®é 延ã«ã¤ãªããå¯è½æ§ãããã¾ãã
ãããã«é¢ãã¦ã¯ãåçãªãã¼ã»ããªã¥ã¼ãã¢ã®æ ¼ç´ã«é©ãã¦ãã¾ãããã¹ãã¼ãã¬ã¹ãªæ§è³ªããã«æ éã«ä½¿ç¨ããå¿ è¦ãããã¾ããèè ã¯ããããã®ãã¼ã¨å¤ã®ãµã¤ãºã«å¶éãè¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ãAPIã®äºæ¸¬å¯è½æ§ã¨å®å®æ§ã確ä¿ããä¸ã§éè¦ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã®å¿ç¨ãèããã¨ã以ä¸ã®ãããªç¹ãéè¦ã«ãªãã¾ãã
ãã¼ã¿ã®ä¸è²«æ§: ç°ãªããµã¼ãã¹éã§ãã¼ã¿åã®ä¸è²«æ§ãä¿ã¤ãã¨ã¯ãã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ã¨ä¿å®æ§ã«ç´çµãã¾ããä¾ãã°ãå ¨ã¦ã®ãµã¼ãã¹ã§æ¥æãISO 8601å½¢å¼ã®æååã¨ãã¦æ±ãã¨ãã£ãçµ±ä¸è¦åãè¨ãããã¨ãæå¹ã§ãã
ãã¼ã¸ã§ãã³ã°ã¨ã®é¢ä¿: ãã¼ã¿åã®å¤æ´ã¯ãã°ãã°APIã®ç ´å£çå¤æ´ã«ã¤ãªããã¾ããé©åãªãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨çµã¿åããããã¨ã§ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã¸ã®å½±é¿ãæå°éã«æãã¤ã¤ãAPIãé²åããããã¨ãã§ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: 大ããªæ°å¤ãæååã¨ãã¦æ±ããã¨ããã³ã¬ã¯ã·ã§ã³ã®ãµã¤ãºãå¶éãããã¨ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ã«ç´æ¥å½±é¿ãã¾ãããããã®æ±ºå®ã¯ãã·ã¹ãã ã®æé·ã«ä¼´ã課é¡ãäºé²ããä¸ã§éè¦ã§ãã
ã¨ã©ã¼ãã³ããªã³ã°: ä¸é©åãªãã¼ã¿åããµã¤ãºã®å ¥åãé©åã«å¦çããæ確ãªã¨ã©ã¼ã¡ãã»ã¼ã¸ãè¿ããã¨ã¯ãAPIã®ä½¿ããããã¨ä¿¡é ¼æ§ãåä¸ããã¾ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³: ãã¼ã¿åãç¹ã«å¶ç´ï¼ä¾ï¼æååã®æ大é·ãæ°å¤ã®ç¯å²ï¼ãæ確ã«ããã¥ã¡ã³ãåãããã¨ã¯ãAPIå©ç¨è ã®ç解ãå©ãã誤ç¨ãé²ãã¾ãã
Golangã®æèã§ã¯ããããã®è¨è¨ååãåæ ããAPIã®å®è£
ãéè¦ã«ãªãã¾ããä¾ãã°ãã«ã¹ã¿ã ã®UnmarshalJSON
ã¡ã½ããã使ç¨ãã¦ãæååã¨ãã¦åãåã£ã大ããªæ°å¤ãé©åã«å¦çãããã¨ãã§ãã¾ããã¾ããGoã®å¼·åãªåã·ã¹ãã ãæ´»ç¨ãããã¨ã§ãAPIã®åå®å
¨æ§ãé«ãããã¨ãã§ãã¾ãã
type SafeInt64 int64 func (si *SafeInt64) UnmarshalJSON(data []byte) error { var s string if err := json.Unmarshal(data, &s); err != nil { return err } i, err := strconv.ParseInt(s, 10, 64) if err != nil { return err } *si = SafeInt64(i) return nil }
çµè«
第5ç« ãData types and defaultsãã¯ãAPIãã¶ã¤ã³ã«ããããã¼ã¿åã¨ããã©ã«ãå¤ã®éè¦æ§ãæ確ã«ç¤ºãã¦ãã¾ããé©åãªãã¼ã¿åã®é¸æã¨ããããã®ä¸è²«ãã使ç¨ã¯ãAPIã®ä½¿ãããããä¿¡é ¼æ§ãããã¦é·æçãªä¿å®æ§ã«ç´æ¥çãªå½±é¿ãä¸ãã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
- ããã°ã©ãã³ã°è¨èªã«ä¾åããªããä¸è²«ãããã¼ã¿è¡¨ç¾ã®éè¦æ§ã
null
å¤ã¨missing
å¤ã®åºå¥ãããã³ãããã®é©åãªå¦çã- 大ããªæ°å¤ãæµ®åå°æ°ç¹æ°ã®å®å ¨ãªåãæ±ãã
- æååã®ã¨ã³ã³ã¼ãã£ã³ã°ã¨æ£è¦åã®éè¦æ§ã
- ã³ã¬ã¯ã·ã§ã³ï¼ãªã¹ãã¨ãããï¼ã®é©åãªä½¿ç¨ã¨ãµã¤ãºå¶éã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãAPIã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªãã¼ã¿åã®é¸æã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãããã©ã¼ãã³ã¹ãããã¦æ¡å¼µæ§ã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããé©åãªãã¼ã¿åã®é¸æã¨ä¸è²«ãã使ç¨ã¯ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããäºæãã¬ãã°ãäºææ§ã®åé¡ãé²ãä¸ã§ä¸å¯æ¬ ã§ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
Part 3 Fundamentals
ãã®ãã¼ãã§ã¯ãAPIã®åºæ¬çãªæä½ã¨æ©è½ã«ã¤ãã¦æ·±ãæãä¸ãã¦ãã¾ããæ¨æºã¡ã½ããï¼GETãPOSTãPUTãDELETEçï¼ã®é©åãªä½¿ç¨æ³ãé¨åçãªæ´æ°ã¨åå¾ãã«ã¹ã¿ã ã¡ã½ããã®è¨è¨ãé·æéå®è¡æä½ã®æ±ãæ¹ãªã©ã説æããã¦ãã¾ãããããã®åºæ¬çãªè¦ç´ ãé©åã«è¨è¨ãããã¨ã§ãAPIã®ä½¿ããããã¨æ©è½æ§ã大ããåä¸ãã¾ãã
6 Resource identification
ãAPI Design Patternsãã®ç¬¬6ç« ãResource identificationãã¯ãAPIã«ããããªã½ã¼ã¹èå¥åã®éè¦æ§ãè¯ãèå¥åã®ç¹æ§ããã®å®è£ æ¹æ³ãããã¦UUIDã¨ã®é¢ä¿ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã½ã¼ã¹èå¥åãåãªãæè¡çãªè©³ç´°ã§ã¯ãªããAPIã®ä½¿ãããããä¿¡é ¼æ§ãããã¦é·æçãªä¿å®æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
èå¥åã®éè¦æ§ã¨ç¹æ§
èè ã¯ãèå¥åã®éè¦æ§ããè°è«ãå§ãã¦ãã¾ããAPIã«ããã¦ãèå¥åã¯ãªã½ã¼ã¹ãä¸æã«ç¹å®ããããã®æ段ã§ããããã®è¨è¨ã¯æ éã«è¡ãå¿ è¦ãããã¾ããè¯ãèå¥åã®ç¹æ§ã¨ãã¦ãèè ã¯ä»¥ä¸ã®ç¹ãæãã¦ãã¾ãã
- 使ãããã
- ä¸ææ§
- æ°¸ç¶æ§
- çæã®éãã¨å®¹æã
- äºæ¸¬ä¸å¯è½æ§
- èªã¿ããããå ±æã®ãããããæ¤è¨¼å¯è½æ§
- æ å ±å¯åº¦ã®é«ã
ãããã®ç¹æ§ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãæ°¸ç¶æ§ã¨ä¸ææ§ã¯ãåæ£ã·ã¹ãã ã«ããããã¼ã¿ã®ä¸è²«æ§ã¨æ´åæ§ã確ä¿ããä¸ã§ä¸å¯æ¬ ã§ããã¾ããäºæ¸¬ä¸å¯è½æ§ã¯ã»ãã¥ãªãã£ã®è¦³ç¹ããéè¦ã§ããªã½ã¼ã¹ã®æ¨æ¸¬ãä¸æ£ã¢ã¯ã»ã¹ãé²ãå½¹å²ãæããã¾ãã
èè ãææ¡ããèå¥åã®å½¢å¼ã¯ãCrockford's Base32ã¨ã³ã³ã¼ãã£ã³ã°ã使ç¨ãããã®ã§ãããã®é¸æã«ã¯å¤ãã®å©ç¹ãããã¾ãã
- é«ãæ å ±å¯åº¦ï¼ASCIIãã£ã©ã¯ã¿ããã5ãããï¼
- 人éãèªã¿ããããå£é ã§ãä¼ãããã
- 大æåå°æåãåºå¥ããªãæè»æ§
- ãã§ãã¯ãµã æåã«ããæ¤è¨¼å¯è½æ§
ãããã®ç¹æ§ã¯ãå®éã®éç¨ç°å¢ã§é常ã«æç¨ã§ããä¾ãã°ãèå¥åã®èªã¿ä¸ããã¿ã¤ããã¹ã®æ¤åºã容æã«ãªãããµãã¼ããé害対å¿ã®å¹çãåä¸ãã¾ãã
å®è£ ã®è©³ç´°
èè ã¯ãèå¥åã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
ãµã¤ãºã®é¸æ: èè ã¯ãç¨éã«å¿ãã¦64ãããã¾ãã¯128ãããã®èå¥åãæ¨å¥¨ãã¦ãã¾ããããã¯ãå¤ãã®ã¦ã¼ã¹ã±ã¼ã¹ã§ååãªä¸ææ§ãæä¾ãã¤ã¤ãå¹ççãªã¹ãã¬ã¼ã¸ã¨å¦çãå¯è½ã«ãã¾ãã
çææ¹æ³: æå·å¦çã«å®å ¨ãªä¹±æ°çæå¨ã®ä½¿ç¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ãèå¥åã®äºæ¸¬ä¸å¯è½æ§ã¨ä¸ææ§ã確ä¿ããä¸ã§éè¦ã§ãã
ãã§ãã¯ãµã ã®è¨ç®: èå¥åã®æ¤è¨¼ã容æã«ããããã®ãã§ãã¯ãµã æåã®è¿½å æ¹æ³ã詳細ã«èª¬æãã¦ãã¾ãã
ãã¼ã¿ãã¼ã¹ã§ã®ä¿å: æååããã¤ãåãæ´æ°å¤ã¨ãã¦ã®ä¿åæ¹æ³ãæ¯è¼ããããããã®å©ç¹ã¨æ¬ ç¹ãåæãã¦ãã¾ãã
ãããã®å®è£ 詳細ã¯ãå®éã®ã·ã¹ãã è¨è¨ã«ããã¦é常ã«æç¨ã§ããä¾ãã°ãGolangã§ã®å®è£ ãèããã¨ã以ä¸ã®ãããªã³ã¼ããèãããã¾ãã
package main import ( "crypto/rand" "encoding/base32" "fmt" ) func GenerateID() (string, error) { bytes := make([]byte, 16) // 128ãããã®èå¥å _, err := rand.Read(bytes) if err != nil { return "", err } encoded := base32.StdEncoding.WithPadding(base32.NoPadding).EncodeToString(bytes) checksum := calculateChecksum(bytes) return fmt.Sprintf("%s%c", encoded, checksumChar(checksum)), nil } func calculateChecksum(bytes []byte) int { sum := 0 for _, b := range bytes { sum += int(b) } return sum % 32 } func checksumChar(checksum int) rune { return rune('A' + checksum) } func main() { id, err := GenerateID() if err != nil { fmt.Printf("Error generating ID: %v\n", err) return } fmt.Printf("Generated ID: %s\n", id) }
ãã®ãããªå®è£ ã¯ãå®å ¨ã§å¹ççãªèå¥åçæãå¯è½ã«ããã·ã¹ãã ã®ä¿¡é ¼æ§ã¨æ¡å¼µæ§ãåä¸ããã¾ãã
èå¥åã®é層ã¨ä¸ææ§ã®ã¹ã³ã¼ã
èè ã¯ãèå¥åã®é層æ§é ã¨ä¸ææ§ã®ã¹ã³ã¼ãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ããããã¯ããªã½ã¼ã¹éã®é¢ä¿æ§ãã©ã®ããã«è¡¨ç¾ãããã¨ããéè¦ãªåé¡ã«é¢ãã£ã¦ãã¾ãã
èè
ã¯ãé層çãªèå¥åï¼ä¾ï¼books/1234/pages/5678
ï¼ã®ä½¿ç¨ããçã®ãææ権ãé¢ä¿ãããå ´åã«éå®ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ããªã½ã¼ã¹ã®ç§»åãé¢ä¿ã®å¤æ´ãé »ç¹ã«èµ·ããå¯è½æ§ãããå ´åãèå¥åã®æ°¸ç¶æ§ãç¶æãããã¨ãå°é£ã«ãªãããã§ãã
ãã®èãæ¹ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ç¹ã«éè¦ã§ãããµã¼ãã¹éã®å¢çãæ確ã«å®ç¾©ããä¸å¿
è¦ãªä¾åé¢ä¿ãé¿ããããã«ã¯ãèå¥åã®è¨è¨ãéè¦ãªå½¹å²ãæããã¾ããä¾ãã°ãæ¸ç±ã¨èè
ã®é¢ä¿ãèããã¨ãauthors/1234/books/5678
ãããbooks/5678
ï¼èè
æ
å ±ã¯æ¸ç±ã®ããããã£ã¨ãã¦ä¿æï¼ã®æ¹ãããµã¼ãã¹éã®çµå度ãä½ãä¿ã¤ãã¨ãã§ãã¾ãã
UUIDã¨ã®æ¯è¼
èè ã¯ãææ¡ããèå¥åå½¢å¼ã¨UUIDãæ¯è¼ãã¦ãã¾ããUUIDã®å©ç¹ï¼åºãæ¡ç¨ããã¦ãããè¡çªã®å¯è½æ§ã極ãã¦ä½ããªã©ï¼ãèªãã¤ã¤ã以ä¸ã®ç¹ã§èè ã®ææ¡ããå½¢å¼ãåªãã¦ããã¨ä¸»å¼µãã¦ãã¾ãã
- ããçãã人éãèªã¿ããã
- æ å ±å¯åº¦ãé«ãï¼Base32 vs Base16ï¼
- ãã§ãã¯ãµã æ©è½ãçµã¿è¾¼ã¾ãã¦ãã
ãã®æ¯è¼ã¯éè¦ã§ãã·ã¹ãã ã®è¦ä»¶ã«å¿ãã¦é©åãªèå¥åå½¢å¼ãé¸æããå¿ è¦æ§ã示ãã¦ãã¾ããä¾ãã°ãé«åº¦ã«åæ£åãããã·ã¹ãã ã§ã¯UUIDã®ä½¿ç¨ãé©ãã¦ããä¸æ¹ã人éã®ä»å ¥ãé »ç¹ã«å¿ è¦ãªã·ã¹ãã ã§ã¯èè ã®ææ¡ããå½¢å¼ãæç¨ããããã¾ããã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨æ§è½: é©åãªèå¥åã®è¨è¨ã¯ãã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã¨æ§è½ã«ç´æ¥å½±é¿ãã¾ããä¾ãã°ã128ãããã®èå¥åã使ç¨ãããã¨ã§ãå°æ¥çãªæé·ã«å¯¾å¿ãã¤ã¤ãå¹ççãªã¤ã³ããã¯ã¹ã®ä½æãå¯è½ã«ãªãã¾ãã
ã»ãã¥ãªãã£: äºæ¸¬ä¸å¯è½ãªèå¥åã®ä½¿ç¨ã¯ããªã½ã¼ã¹ã®æ¨æ¸¬ãä¸æ£ã¢ã¯ã»ã¹ãé²ãä¸ã§éè¦ã§ããããã¯ãç¹ã«å ¬éAPIã«ããã¦éè¦ãªèæ ®äºé ã§ãã
éç¨æ§: 人éãèªã¿ããããæ¤è¨¼å¯è½ãªèå¥åã¯ããããã°ããã©ãã«ã·ã¥ã¼ãã£ã³ã°ã容æã«ãã¾ããããã¯ã大è¦æ¨¡ãªã·ã¹ãã ã®éç¨ã«ããã¦é常ã«æç¨ã§ãã
ãã¼ã¸ã§ãã³ã°ã¨ã®é¢ä¿: èå¥åã®è¨è¨ã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããæ°¸ç¶çã§ä¸æãªèå¥åã¯ãç°ãªããã¼ã¸ã§ã³éã§ã®ãªã½ã¼ã¹ã®ä¸è²«æ§ãç¶æããã®ã«å½¹ç«ã¡ã¾ãã
ãã¼ã¿ãã¼ã¹è¨è¨: èå¥åã®å½¢å¼ã¨ä¿åæ¹æ³ã®é¸æã¯ããã¼ã¿ãã¼ã¹ã®æ§è½ã¨æ¡å¼µæ§ã«å¤§ããªå½±é¿ãä¸ãã¾ããèè ã®ææ¡ããå½¢å¼ã¯ãå¤ãã®ãã¼ã¿ãã¼ã¹ã·ã¹ãã ã§å¹ççã«æ±ããã¨ãã§ãã¾ãã
çµè«
第6ç« ãResource identificationãã¯ãAPIã«ããããªã½ã¼ã¹èå¥åã®éè¦æ§ã¨ããã®é©åãªè¨è¨ã®å¿ è¦æ§ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããèå¥åå½¢å¼ã¯ã使ãããããå®å ¨æ§ãå¹çæ§ã®ãã©ã³ã¹ãåãã¦ãããå¤ãã®ã¦ã¼ã¹ã±ã¼ã¹ã§æç¨ã§ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
- èå¥åã¯åãªãæè¡ç詳細ã§ã¯ãªããAPIã®ä½¿ããããã¨ä¿¡é ¼æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ããã
- è¯ãèå¥åã¯ãä¸ææ§ãæ°¸ç¶æ§ãäºæ¸¬ä¸å¯è½æ§ãèªã¿ããããªã©ãè¤æ°ã®éè¦ãªç¹æ§ãå ¼ãåãã¦ããå¿ è¦ãããã
- Crockford's Base32ã¨ã³ã³ã¼ãã£ã³ã°ã®ä½¿ç¨ã¯ãå¤ãã®å©ç¹ãããããã
- èå¥åã®é層æ§é ã¯æ éã«è¨è¨ããå¿ è¦ããããçã®ãææ権ãé¢ä¿ãããå ´åã«ã®ã¿ä½¿ç¨ãã¹ãã§ããã
- UUIDã¯åºãæ¡ç¨ããã¦ããããç¹å®ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯èè ã®ææ¡ããå½¢å¼ã®æ¹ãé©ãã¦ããå ´åãããã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ããªã½ã¼ã¹èå¥åã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªèå¥åã®è¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãããã©ã¼ãã³ã¹ãããã¦æ¡å¼µæ§ã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããé©åãªèå¥åã®è¨è¨ã¯ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããäºæãã¬ãã°ãäºææ§ã®åé¡ãé²ãä¸ã§ä¸å¯æ¬ ã§ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
7 Standard methods
ãAPI Design Patternsãã®ç¬¬7ç« ãStandard methodsãã¯ãAPIã«ãããæ¨æºã¡ã½ããã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯æ¨æºã¡ã½ãããåãªãæ £ç¿ã§ã¯ãªããAPIã®ä¸è²«æ§ãäºæ¸¬å¯è½æ§ãããã¦ä½¿ããããã大ããåä¸ãããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
æ¨æºã¡ã½ããã®éè¦æ§ã¨æ¦è¦
èè ã¯ãæ¨æºã¡ã½ããã®éè¦æ§ããè°è«ãå§ãã¦ãã¾ããAPIã®äºæ¸¬å¯è½æ§ãé«ããããã«ããªã½ã¼ã¹ãã¨ã«ç°ãªãæä½ãå®ç¾©ããã®ã§ã¯ãªããä¸è²«ããæ¨æºã¡ã½ããã®ã»ãããå®ç¾©ãããã¨ã®å©ç¹ã強調ãã¦ãã¾ããå ·ä½çã«ã¯ã以ä¸ã®æ¨æºã¡ã½ãããç´¹ä»ããã¦ãã¾ãã
- Getï¼æ¢åã®ãªã½ã¼ã¹ãåå¾
- Listï¼ãªã½ã¼ã¹ã®ã³ã¬ã¯ã·ã§ã³ããªã¹ãå
- Createï¼æ°ãããªã½ã¼ã¹ãä½æ
- Updateï¼æ¢åã®ãªã½ã¼ã¹ãæ´æ°
- Deleteï¼æ¢åã®ãªã½ã¼ã¹ãåé¤
- Replaceï¼ãªã½ã¼ã¹å ¨ä½ãç½®ãæã
HTTP ã«ã¯ä»ã«ãããã¤ãã®ã¡ã½ãããç¨æããã¦ãã
ãããã®æ¨æºã¡ã½ããã¯ãRESTful APIã®è¨è¨ååã«åºã¥ãã¦ãããå¤ãã®éçºè ã«ã¨ã£ã¦é¦´æã¿ã®ããæ¦å¿µã§ããããããèè ã¯ãããã®ã¡ã½ããã®å®è£ ã«é¢ãã詳細ãªæéãæä¾ãããã¨ã§ãåãªãæ £ç¿ãè¶ ãããä¸è²«æ§ã®ããå¼·åãªAPIãã¶ã¤ã³ãã¿ã¼ã³ãæ示ãã¦ãã¾ãã
ãã®æ¨æºåãããã¢ããã¼ãã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ãä¸è²«ãã¦ãããã¨ããã·ã¹ãã å ¨ä½ã®ç解ã¨ä¿å®ã容æã«ãã¾ããä¾ãã°ãå ¨ã¦ã®ãµã¼ãã¹ã§åãæ¨æºã¡ã½ããã使ç¨ãããã¨ã§ãéçºè ã¯ãµã¼ãã¹éã®ç¸äºä½ç¨ãããç´æçã«ç解ããæ°ãããµã¼ãã¹ã®çµ±åãæ¢åã®ãµã¼ãã¹ã®ä¿®æ£ãã¹ã ã¼ãºã«è¡ããã¨ãã§ãã¾ãã
å®è£ ã®è©³ç´°ã¨ãã¹ããã©ã¯ãã£ã¹
èè ã¯ãåæ¨æºã¡ã½ããã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
ã¹ãçæ§ã¨ãµã¤ãã¨ãã§ã¯ã: èè ã¯ãæ¨æºã¡ã½ããã®ã¹ãçæ§ï¼åããªã¯ã¨ã¹ããè¤æ°åå®è¡ãã¦ãçµæãå¤ãããªãæ§è³ªï¼ã¨ãµã¤ãã¨ãã§ã¯ãã®éè¦æ§ã強調ãã¦ãã¾ããç¹ã«ãGetããªã¹ãã®ãããªèªã¿åãå°ç¨ã®ã¡ã½ããã¯ãå®å ¨ã«ã¹ãçã§ããã¹ãã§ãã·ã¹ãã ã®ç¶æ ãå¤æ´ãããµã¤ãã¨ãã§ã¯ããæã¤ã¹ãã§ã¯ããã¾ãããããã¯ãã·ã¹ãã ã®äºæ¸¬å¯è½æ§ã¨ä¿¡é ¼æ§ãé«ããä¸ã§éè¦ã§ãã
ä¸è²«æ§: èè ã¯ãç¹ã«Createæä½ã«ããã¦å¼·ãä¸è²«æ§ãç¶æãããã¨ã®éè¦æ§ãææãã¦ãã¾ãããªã½ã¼ã¹ãä½æãããããå³åº§ã«ä»ã®æ¨æºã¡ã½ããï¼GetãListãUpdateãDeleteï¼ãéãã¦ã¢ã¯ã»ã¹å¯è½ã§ããã¹ãã§ããããã¯ãåæ£ã·ã¹ãã ã«ããã課é¡ã§ãããAPIã®ä¿¡é ¼æ§ã¨ä½¿ããããã«ã¨ã£ã¦æ¥µãã¦éè¦ã§ãã
é¨åæ´æ° vs å ¨ä½ç½®æ: Updateã¡ã½ããã¨Replaceã¡ã½ããã®éãã«ã¤ãã¦è©³ç´°ã«èª¬æãã¦ãã¾ããUpdateã¯é¨åçãªæ´æ°ï¼HTTP PATCHã使ç¨ï¼ãè¡ããReplaceã¯å ¨ä½ã®ç½®æï¼HTTP PUTã使ç¨ï¼ãè¡ãã¾ãããã®åºå¥ã¯ãAPIã®æè»æ§ã¨ä½¿ãããããåä¸ãããä¸ã§éè¦ã§ãã
ã¹ãçæ§ã¨åé¤æä½: èè ã¯ãDeleteæä½ãã¹ãçã§ããã¹ããå¦ãã«ã¤ãã¦èå³æ·±ãè°è«ãå±éãã¦ãã¾ããæçµçã«ãDeleteã¯ã¹ãçã§ãªãæ¹ãè¯ãã¨çµè«ä»ãã¦ãã¾ãããããã¯APIã®è¨è¨è ã«ã¨ã£ã¦éè¦ãªèæ ®ç¹ã§ãã
ãããã®å®è£ 詳細ã¯ãå®éã®ã·ã¹ãã è¨è¨ã«ããã¦é常ã«æç¨ã§ããä¾ãã°ãGolangã§ã®å®è£ ãèããã¨ã以ä¸ã®ãããªã¤ã³ã¿ã¼ãã§ã¼ã¹ãèãããã¾ãã
type ResourceService interface { Get(ctx context.Context, id string) (*Resource, error) List(ctx context.Context, filter string) ([]*Resource, error) Create(ctx context.Context, resource *Resource) (*Resource, error) Update(ctx context.Context, id string, updates map[string]interface{}) (*Resource, error) Replace(ctx context.Context, id string, resource *Resource) (*Resource, error) Delete(ctx context.Context, id string) error }
ãã®ãããªã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ãæ¨æºã¡ã½ããã®ä¸è²«ããå®è£ ãä¿é²ããAPIã®ä½¿ããããã¨ä¿å®æ§ãåä¸ããã¾ãã
æ¨æºã¡ã½ããã®é©ç¨ã¨èª²é¡
èè ã¯ãæ¨æºã¡ã½ããã®é©ç¨ã«é¢ããéè¦ãªèæ ®ç¹ãæ示ãã¦ãã¾ãã
ã¡ã½ããã®é¸æ: å ¨ã¦ã®ãªã½ã¼ã¹ãå ¨ã¦ã®æ¨æºã¡ã½ããããµãã¼ãããå¿ è¦ã¯ããã¾ããããªã½ã¼ã¹ã®æ§è³ªã«å¿ãã¦ãé©åãªã¡ã½ããã®ã¿ãå®è£ ãã¹ãã§ãã
ã¢ã¯ã»ã¹å¶å¾¡: ç¹ã«Listã¡ã½ããã«ããã¦ãç°ãªãã¦ã¼ã¶ã¼ãç°ãªãã¢ã¯ã»ã¹æ¨©ãæã¤å ´åã®æåã«ã¤ãã¦è©³ç´°ã«èª¬æãã¦ãã¾ããããã¯ãã»ãã¥ãªãã£ã¨ä½¿ããããã®ãã©ã³ã¹ãåãä¸ã§éè¦ãªèæ ®ç¹ã§ãã
çµæã®ã«ã¦ã³ãã¨ã½ã¼ã: èè ã¯ãListã¡ã½ããã§ã®ã«ã¦ã³ããã½ã¼ãã®ãµãã¼ããé¿ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ããã§ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ã®åé¡ãé²ãããã®éè¦ãªæéã§ãã
ãã£ã«ã¿ãªã³ã°: Listã¡ã½ããã«ããããã£ã«ã¿ãªã³ã°ã®éè¦æ§ã¨ããã®å®è£ æ¹æ³ã«ã¤ãã¦èª¬æãã¦ãã¾ããèè ã¯ãåºå®ã®ãã£ã«ã¿ãªã³ã°æ§é ã§ã¯ãªããæè»ãªæååãã¼ã¹ã®ãã£ã«ã¿ãªã³ã°ãæ¨å¥¨ãã¦ãã¾ãã
ãããã®èæ ®ç¹ã¯ãç¹ã«å¤§è¦æ¨¡ãªã·ã¹ãã ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦éè¦ã§ããä¾ãã°ãListã¡ã½ããã§ã®ã«ã¦ã³ããã½ã¼ãã®å¶éã¯ãã·ã¹ãã ã®æ°´å¹³ã¹ã±ã¼ãªã³ã°è½åãç¶æããä¸ã§éè¦ã§ããåæ§ã«ãæè»ãªãã£ã«ã¿ãªã³ã°ã®å®è£ ã¯ãAPIã®é·æçãªé²åã¨æ¡å¼µæ§ã確ä¿ãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ä¸è²«æ§ã¨äºæ¸¬å¯è½æ§: æ¨æºã¡ã½ãããä¸è²«ãã¦é©ç¨ãããã¨ã§ãAPIã®å¦ç¿æ²ç·ãç·©ããã«ãªããéçºè ã®çç£æ§ãåä¸ãã¾ããããã¯ãç¹ã«å¤§è¦æ¨¡ãªã·ã¹ãã ãå¤ãã®ãã¤ã¯ããµã¼ãã¹ãæã¤ç°å¢ã§éè¦ã§ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: èè ã®æ¨å¥¨äºé ï¼ä¾ï¼Listã¡ã½ããã§ã®ã«ã¦ã³ããã½ã¼ãã®å¶éï¼ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ãç¶æããä¸ã§éè¦ã§ãããããã®ååãé©ç¨ãããã¨ã§ãã·ã¹ãã ã®æé·ã«ä¼´ã課é¡ãäºé²ã§ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã¨ã®é¢ä¿: æ¨æºã¡ã½ããã®ä¸è²«ããå®è£ ã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨ãå¯æ¥ã«é¢é£ãã¾ããæ°ãããã¼ã¸ã§ã³ãå°å ¥ããéãããããã®æ¨æºã¡ã½ããã®æåãç¶æãããã¨ã§ãå¾æ¹äºææ§ã確ä¿ãããããªãã¾ãã
ã»ãã¥ãªãã£ã®èæ ®: æ¨æºã¡ã½ããã®å®è£ ã«ããã¦ãé©åãªã¢ã¯ã»ã¹å¶å¾¡ãã¨ã©ã¼ãã³ããªã³ã°ãè¡ããã¨ã¯ãAPIã®ã»ãã¥ãªãã£ã確ä¿ããä¸ã§éè¦ã§ãã
éç¨æ§: æ¨æºã¡ã½ããã®ä¸è²«ããå®è£ ã¯ãç£è¦ããã°è¨é²ããããã°ãªã©ã®éç¨ã¿ã¹ã¯ãç°¡ç´ åãã¾ããããã«ãããåé¡ã®è¿ éãªç¹å®ã¨è§£æ±ºãå¯è½ã«ãªãã¾ãã
çµè«
第7ç« ãStandard methodsãã¯ãAPIã«ãããæ¨æºã¡ã½ããã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®ä¸è²«æ§ãäºæ¸¬å¯è½æ§ã使ããããã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
æ¨æºã¡ã½ããï¼GetãListãCreateãUpdateãDeleteãReplaceï¼ã®ä¸è²«ããå®è£ ã¯ãAPIã®å¦ç¿æ§ã¨ä½¿ãããããå¤§å¹ ã«åä¸ããã¾ãã
ã¹ãçæ§ã¨ãµã¤ãã¨ãã§ã¯ãã®èæ ®ã¯ãAPIã®ä¿¡é ¼æ§ã¨äºæ¸¬å¯è½æ§ã確ä¿ããä¸ã§éè¦ã§ãã
å¼·ãä¸è²«æ§ã®ç¶æãç¹ã«Createæä½å¾ã®å³æã¢ã¯ã»ã¹å¯è½æ§ã¯ãAPIã®ä¿¡é ¼æ§ãé«ãã¾ãã
æ¨æºã¡ã½ããã®é©åãªé¸æã¨å®è£ ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ãã¹ã±ã¼ã©ããªãã£ãã»ãã¥ãªãã£ã«ç´æ¥å½±é¿ãã¾ãã
æ¨æºã¡ã½ããã®ä¸è²«ããå®è£ ã¯ãã·ã¹ãã ã®éç¨æ§ã¨é·æçãªä¿å®æ§ãåä¸ããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãæ¨æºã¡ã½ããã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªæ¨æºã¡ã½ããã®è¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãããã©ã¼ãã³ã¹ãããã¦æ¡å¼µæ§ã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããæ¨æºã¡ã½ããã®é©åãªå®è£ ã¯ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããäºæãã¬ãã°ãäºææ§ã®åé¡ãé²ãä¸ã§ä¸å¯æ¬ ã§ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
8 Partial updates and retrievals
ãAPI Design Patternsãã®ç¬¬8ç« ãPartial updates and retrievalsãã¯ãAPIã«ãããé¨åçãªæ´æ°ã¨åå¾ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯é¨åçãªæ´æ°ã¨åå¾ãåãªãæ©è½ã®è¿½å ã§ã¯ãªããAPIã®æè»æ§ãå¹çæ§ãããã¦é·æçãªä½¿ããããã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
é¨åçãªæ´æ°ã¨åå¾ã®åæ©
èè ã¯ãé¨åçãªæ´æ°ã¨åå¾ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããç¹ã«ã大è¦æ¨¡ãªãªã½ã¼ã¹ãå¶éã®ããã¯ã©ã¤ã¢ã³ãç°å¢ã§ã®éè¦æ§ã強調ãã¦ãã¾ããä¾ãã°ãIoTããã¤ã¹ã®ãããªå¶éãããç°å¢ã§ã¯ãå¿ è¦æå°éã®ãã¼ã¿ã®ã¿ãåå¾ãããã¨ãéè¦ã§ããã¾ãã大è¦æ¨¡ãªãªã½ã¼ã¹ã®ä¸é¨ã®ã¿ãæ´æ°ããå¿ è¦ãããå ´åãå ¨ä½ãç½®ãæããã®ã§ã¯ãªããç¹å®ã®ãã£ã¼ã«ãã®ã¿ãæ´æ°ããè½åãéè¦ã«ãªãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ãå¿ è¦ã¨ãããã¼ã¿ã®ã¿ãå¹ççã«åå¾ããæ´æ°ãããã¨ããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ãåä¸ããã¾ãã
èè ã¯ãé¨åçãªæ´æ°ã¨åå¾ãå®ç¾ããããã®ãã¼ã«ã¨ãã¦ãã£ã¼ã«ããã¹ã¯ã®æ¦å¿µãå°å ¥ãã¦ãã¾ãããã£ã¼ã«ããã¹ã¯ã¯ãã¯ã©ã¤ã¢ã³ããé¢å¿ã®ãããã£ã¼ã«ããæå®ããããã®åç´ãã¤å¼·åãªã¡ã«ããºã ã§ããããã«ãããAPIã¯å¿ è¦ãªãã¼ã¿ã®ã¿ãè¿ãããæå®ããããã£ã¼ã«ãã®ã¿ãæ´æ°ãããã¨ãã§ãã¾ãã
ãã£ã¼ã«ããã¹ã¯ã®å®è£
èè ã¯ããã£ã¼ã«ããã¹ã¯ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã©ã³ã¹ãã¼ã: ãã£ã¼ã«ããã¹ã¯ãã©ã®ããã«APIãªã¯ã¨ã¹ãã«å«ãããã«ã¤ãã¦è°è«ãã¦ãã¾ããèè ã¯ãã¯ã¨ãªãã©ã¡ã¼ã¿ã使ç¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ãHTTPãããã¼ãããã¢ã¯ã»ã¹ãããããæä½ããããããã§ãã
ãã¹ãããããã£ã¼ã«ãã¨ãããã®æ±ã: èè ã¯ãããã表è¨ã使ç¨ãã¦ãã¹ãããããã£ã¼ã«ãããããã®ãã¼ãæå®ããæ¹æ³ã説æãã¦ãã¾ããããã«ãããè¤éãªãã¼ã¿æ§é ã§ãæè»ã«é¨åçãªæ´æ°ãåå¾ãå¯è½ã«ãªãã¾ãã
ç¹°ãè¿ããã£ã¼ã«ãã®æ±ã: é åããªã¹ãã®ãããªç¹°ãè¿ããã£ã¼ã«ãã«å¯¾ããæä½ã®å¶éã«ã¤ãã¦è°è«ãã¦ãã¾ããèè ã¯ãã¤ã³ããã¯ã¹ãã¼ã¹ã®æä½ãé¿ãã代ããã«ãã£ã¼ã«ãå ¨ä½ã®ç½®ãæããæ¨å¥¨ãã¦ãã¾ãã
ããã©ã«ãå¤: é¨åçãªåå¾ã¨æ´æ°ã«ãããããã©ã«ãå¤ã®æ±ãã«ã¤ãã¦èª¬æãã¦ãã¾ããç¹ã«ãæ´æ°æä½ã§ã®æé»çãªãã£ã¼ã«ããã¹ã¯ã®ä½¿ç¨ãæ¨å¥¨ãã¦ãã¾ãã
ãããã®å®è£ 詳細ã¯ãå®éã®ã·ã¹ãã è¨è¨ã«ããã¦é常ã«æç¨ã§ããä¾ãã°ãGolangã§ã®å®è£ ãèããã¨ã以ä¸ã®ãããªã³ã¼ããèãããã¾ãã
type FieldMask []string type UpdateUserRequest struct { User *User FieldMask FieldMask `json:"fieldMask,omitempty"` } func UpdateUser(ctx context.Context, req *UpdateUserRequest) (*User, error) { existingUser, err := getUserFromDatabase(req.User.ID) if err != nil { return nil, err } if req.FieldMask == nil { // æé»çãªãã£ã¼ã«ããã¹ã¯ãä½¿ç¨ req.FieldMask = inferFieldMask(req.User) } for _, field := range req.FieldMask { switch field { case "name": existingUser.Name = req.User.Name case "email": existingUser.Email = req.User.Email // ... ãã®ä»ã®ãã£ã¼ã«ã } } return saveUserToDatabase(existingUser) } func inferFieldMask(user *User) FieldMask { var mask FieldMask if user.Name != "" { mask = append(mask, "name") } if user.Email != "" { mask = append(mask, "email") } // ... ãã®ä»ã®ãã£ã¼ã«ã return mask }
ãã®ã³ã¼ãã§ã¯ããã£ã¼ã«ããã¹ã¯ãæ示çã«æå®ããªãå ´åãæä¾ããããã¼ã¿ããæé»çã«ãã£ã¼ã«ããã¹ã¯ãæ¨è«ãã¦ãã¾ããããã«ãããã¯ã©ã¤ã¢ã³ãã¯å¿ è¦ãªãã£ã¼ã«ãã®ã¿ãæ´æ°ã§ããä¸è¦ãªãã¼ã¿ã®éä¿¡ãé¿ãããã¨ãã§ãã¾ãã
é¨åçãªæ´æ°ã¨åå¾ã®èª²é¡
èè ã¯ãé¨åçãªæ´æ°ã¨åå¾ã®å®è£ ã«é¢ããéè¦ãªèª²é¡ã«ã¤ãã¦ãè°è«ãã¦ãã¾ãã
ä¸è²«æ§: é¨åçãªæ´æ°ãè¡ãéããªã½ã¼ã¹å ¨ä½ã®ä¸è²«æ§ãç¶æãããã¨ãéè¦ã§ããç¹ã«ãç¸äºã«ä¾åãããã£ã¼ã«ããããå ´åããã®ç¹ã«æ³¨æãå¿ è¦ã§ãã
ããã©ã¼ãã³ã¹: ãã£ã¼ã«ããã¹ã¯ã®è§£æã¨é©ç¨ã«ã¯è¨ç®ã³ã¹ãããããã¾ãã大è¦æ¨¡ãªã·ã¹ãã ã§ã¯ããã®ãªã¼ãã¼ããããèæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¸ã§ãã³ã°: APIã®é²åã«ä¼´ããæ°ãããã£ã¼ã«ãã追å ãããããæ¢åã®ãã£ã¼ã«ããå¤æ´ããããããå¯è½æ§ãããã¾ãããã£ã¼ã«ããã¹ã¯ã®è¨è¨ã¯ããã®ãããªå¤æ´ã«å¯¾å¿ã§ããæè»æ§ãæã¤å¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£: ãã£ã¼ã«ããã¹ã¯ãéãã¦ãã¯ã©ã¤ã¢ã³ããã¢ã¯ã»ã¹ã許å¯ããã¦ããªããã£ã¼ã«ããæ´æ°ã¾ãã¯åå¾ãããã¨ããå¯è½æ§ãããã¾ããé©åãªã¢ã¯ã»ã¹å¶å¾¡ãå¿ è¦ã§ãã
ãããã®èª²é¡ã¯ãç¹ã«å¤§è¦æ¨¡ãªã·ã¹ãã ãé·æçã«ç¶æãããAPIã«ããã¦éè¦ã§ããä¾ãã°ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã§ã¯ãåãµã¼ãã¹ãæ±ããã¼ã¿ã®ä¸é¨ã®ã¿ãæ´æ°ããå¿ è¦ãããå ´åããã°ãã°ããã¾ãããã®æãé¨åçãªæ´æ°æ©è½ã¯é常ã«æç¨ã§ãããåæã«ãµã¼ãã¹éã®ãã¼ã¿æ´åæ§ãç¶æãããã¨ãéè¦ã«ãªãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
å¹çæ§ã¨ããã©ã¼ãã³ã¹: é¨åçãªæ´æ°ã¨åå¾ãé©åã«å®è£ ãããã¨ã§ããããã¯ã¼ã¯å¸¯åå¹ ã®ä½¿ç¨ãæé©åããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãåä¸ããããã¨ãã§ãã¾ããããã¯ç¹ã«ãã¢ãã¤ã«ã¢ããªã±ã¼ã·ã§ã³ã帯åå¹ ãå¶éããã¦ããç°å¢ã§éè¦ã§ãã
æè»æ§ã¨æ¡å¼µæ§: ãã£ã¼ã«ããã¹ã¯ã使ç¨ãããã¨ã§ãAPIã®æè»æ§ãå¤§å¹ ã«åä¸ãã¾ããã¯ã©ã¤ã¢ã³ãã¯å¿ è¦ãªãã¼ã¿ã®ã¿ãè¦æ±ã§ããæ°ãããã£ã¼ã«ãã®è¿½å ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ããã«è¡ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã¨ã®é¢ä¿: é¨åçãªæ´æ°ã¨åå¾ã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããæ°ãããã¼ã¸ã§ã³ãå°å ¥ããéãããã£ã¼ã«ããã¹ã¯ãéãã¦å¾æ¹äºææ§ãç¶æãããããªãã¾ãã
éç¨æ§ã¨å¯è¦³æ¸¬æ§: é¨åçãªæ´æ°ã¨åå¾ãé©åã«å®è£ ãããã¨ã§ãã·ã¹ãã ã®éç¨æ§ãåä¸ãã¾ããä¾ãã°ãç¹å®ã®ãã£ã¼ã«ãã®æ´æ°é »åº¦ããã©ã®ãã£ã¼ã«ããæãé »ç¹ã«è¦æ±ãããããç£è¦ãããã¨ã§ãã·ã¹ãã ã®ä½¿ç¨ãã¿ã¼ã³ãããæ·±ãç解ããæé©åã®æ©ä¼ãè¦åºããã¨ãã§ãã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°: ç¡å¹ãªãã£ã¼ã«ããã¹ã¯ããåå¨ããªããã£ã¼ã«ãã¸ã®ã¢ã¯ã»ã¹è©¦è¡ãã©ã®ããã«å¦çãããã¯éè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ããé©åãªã¨ã©ã¼ã¡ãã»ã¼ã¸ã¨ç¶æ ã³ã¼ããè¿ããã¨ã§ãAPIã®ä½¿ããããã¨ä¿¡é ¼æ§ãåä¸ããããã¨ãã§ãã¾ãã
ãã£ã¼ã«ããã¹ã¯ã®é«åº¦ãªä½¿ç¨æ³
èè ã¯ããã£ã¼ã«ããã¹ã¯ã®ããé«åº¦ãªä½¿ç¨æ³ã«ã¤ãã¦ãè¨åãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãã¯ããã¹ããããæ§é ããããåã®ãã£ã¼ã«ãã¸ã®å¯¾å¿ã§ãã
ä¾ãã°ã次ã®ãããªè¤éãªæ§é ãæã¤ãªã½ã¼ã¹ãèãã¦ã¿ã¾ãããï¼
type User struct { ID string Name string Address Address Settings map[string]interface{} } type Address struct { Street string City string Country string }
ãã®ãããªæ§é ã«å¯¾ãã¦ãèè ã¯ä»¥ä¸ã®ãããªãã£ã¼ã«ããã¹ã¯ã®è¡¨è¨ãææ¡ãã¦ãã¾ãã
name
: ã¦ã¼ã¶ã¼ã®ååãæ´æ°ã¾ãã¯åå¾address.city
: ã¦ã¼ã¶ã¼ã®ä½æã®é½å¸ã®ã¿ãæ´æ°ã¾ãã¯åå¾settings.theme
: è¨å®ãããå ã®ãã¼ãè¨å®ã®ã¿ãæ´æ°ã¾ãã¯åå¾
ãã®è¡¨è¨æ³ã«ãããé常ã«ç´°ããç²åº¦ã§æ´æ°ãåå¾ãè¡ããã¨ãå¯è½ã«ãªãã¾ããããã¯ç¹ã«ã大è¦æ¨¡ã§è¤éãªãªã½ã¼ã¹ãæ±ãå ´åã«æç¨ã§ãã
ãããããã®ãããªè¤éãªãã£ã¼ã«ããã¹ã¯ã®å®è£ ã«ã¯èª²é¡ãããã¾ããç¹ã«ãã»ãã¥ãªãã£ã¨ããã©ã¼ãã³ã¹ã®è¦³ç¹ãã注æãå¿ è¦ã§ããä¾ãã°ãæ·±ããã¹ãããããã£ã¼ã«ãã¸ã®ã¢ã¯ã»ã¹ã許å¯ãããã¨ã§ãäºæãã¬ã»ãã¥ãªãã£ãã¼ã«ãçã¾ããå¯è½æ§ãããã¾ããã¾ããé常ã«è¤éãªãã£ã¼ã«ããã¹ã¯ã®è§£æã¨é©ç¨ã¯ãã·ã¹ãã ã«å¤§ããªè² è·ããããå¯è½æ§ãããã¾ãã
ãããã®èª²é¡ã«å¯¾å¦ãããããèè ã¯ä»¥ä¸ã®ãããªæ¨å¥¨äºé ãæ示ãã¦ãã¾ãã
- ãã£ã¼ã«ããã¹ã¯ã®æ·±ãã«å¶éãè¨ãã
- ç¹å®ã®ãã¿ã¼ã³ã®ã¿ã許å¯ãããã¯ã¤ããªã¹ããå®è£ ãã
- ãã£ã¼ã«ããã¹ã¯ã®è¤éãã«å¿ãã¦ããªã¯ã¨ã¹ãã®ã¬ã¼ãå¶éã調æ´ãã
ãããã®æ¨å¥¨äºé ã¯ãã·ã¹ãã ã®å®å ¨æ§ã¨æ§è½ã確ä¿ãã¤ã¤ãAPIã®æè»æ§ãç¶æããã®ã«å½¹ç«ã¡ã¾ãã
é¨åçãªæ´æ°ã¨åå¾ã®å½±é¿
é¨åçãªæ´æ°ã¨åå¾ã®å®è£ ã¯ãã·ã¹ãã å ¨ä½ã«åºç¯ãªå½±é¿ãä¸ãã¾ããç¹ã«ä»¥ä¸ã®ç¹ãéè¦ã§ãã
ãã¼ã¿ãã¼ã¹è¨è¨: é¨åçãªæ´æ°ããµãã¼ãããããã«ã¯ããã¼ã¿ãã¼ã¹ã®è¨è¨ãèæ ®ããå¿ è¦ãããã¾ããä¾ãã°ãããã¥ã¡ã³ãæåã®ãã¼ã¿ãã¼ã¹ã¯ãé¨åçãªæ´æ°ã«é©ãã¦ããå ´åãããã¾ãã
ãã£ãã·ã³ã°æ¦ç¥: é¨åçãªåå¾ããµãã¼ãããå ´åããã£ãã·ã³ã°æ¦ç¥ãåèããå¿ è¦ãããã¾ãããã£ã¼ã«ããã¨ã«ç°ãªããã£ãã·ã¥æéãè¨å®ããããé¨åçãªæ´æ°ããã£ãå ´åã«ãã£ãã·ã¥ãé©åã«ç¡å¹åããä»çµã¿ãå¿ è¦ã«ãªãã¾ãã
ç£è¦ã¨ãã®ã³ã°: é¨åçãªæ´æ°ã¨åå¾ããµãã¼ããããã¨ã§ãã·ã¹ãã ã®ç£è¦ã¨ãã®ã³ã°ã®è¤éããå¢ãã¾ããã©ã®ãã£ã¼ã«ããæ´æ°ãããããã©ã®ãã£ã¼ã«ããè¦æ±ããããã追跡ããé©åã«ãã°ãåããã¨ãéè¦ã«ãªãã¾ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³: ãã£ã¼ã«ããã¹ã¯ã®ä½¿ç¨æ¹æ³ããåãã£ã¼ã«ãã®æå³ãç¸äºä¾åé¢ä¿ãªã©ãæ確ã«ããã¥ã¡ã³ãåããå¿ è¦ãããã¾ããããã«ãããAPIå©ç¨è ãé¨åçãªæ´æ°ã¨åå¾ãé©åã«ä½¿ç¨ã§ããããã«ãªãã¾ãã
ãã¹ãæ¦ç¥: é¨åçãªæ´æ°ã¨åå¾ããµãã¼ããããã¨ã§ããã¹ãã±ã¼ã¹ã®æ°ãå¤§å¹ ã«å¢å ãã¾ããå ¨ã¦ã®æå¹ãªãã£ã¼ã«ãã®çµã¿åããããã¹ãããä¸æ£ãªãã£ã¼ã«ããã¹ã¯ã«å¯¾ããé©åãªã¨ã©ã¼ãã³ããªã³ã°ã確èªããå¿ è¦ãããã¾ãã
ã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãª: APIã¯ã©ã¤ã¢ã³ãã©ã¤ãã©ãªãæä¾ãã¦ããå ´åããã£ã¼ã«ããã¹ã¯ãé©åã«æ±ããããã«æ´æ°ããå¿ è¦ãããã¾ããããã«ãããAPIå©ç¨è ãããç°¡åã«é¨åçãªæ´æ°ã¨åå¾ãå©ç¨ã§ããããã«ãªãã¾ãã
ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°: é¨åçãªæ´æ°ã¨åå¾ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã«å¤§ããªå½±é¿ãä¸ããå¯è½æ§ãããã¾ãããã£ã¼ã«ããã¹ã¯ã®è§£æãé©ç¨ã®ããã©ã¼ãã³ã¹ãæé©åããå¿ è¦ã«å¿ãã¦ã¤ã³ããã¯ã¹ã追å ãããªã©ã®å¯¾çãå¿ è¦ã«ãªãå ´åãããã¾ãã
ã»ãã¥ãªãã£å¯¾ç: ãã£ã¼ã«ããã¹ã¯ãéãã¦ãæ©å¯æ å ±ã¸ã®ã¢ã¯ã»ã¹ãå¯è½ã«ãªãå¯è½æ§ãããã¾ããé©åãªã¢ã¯ã»ã¹å¶å¾¡ã¨èªå¯ãã§ãã¯ãå®è£ ããã»ãã¥ãªãã£ç£æ»ãè¡ããã¨ãéè¦ã§ãã
ãã¼ã¸ã§ãã³ã°æ¦ç¥: æ°ãããã£ã¼ã«ãã®è¿½å ãæ¢åãã£ã¼ã«ãã®å¤æ´ãè¡ãéããã£ã¼ã«ããã¹ã¯ã¨ã®äºææ§ãç¶æããå¿ è¦ãããã¾ããããã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã«å¤§ããªå½±é¿ãä¸ããå¯è½æ§ãããã¾ãã
éçºè æè²: éçºãã¼ã å ¨ä½ãé¨åçãªæ´æ°ã¨åå¾ã®æ¦å¿µãç解ããé©åã«å®è£ ã§ããããã«ããããã®æè²ãå¿ è¦ã«ãªãã¾ããããã«ã¯ããã¹ããã©ã¯ãã£ã¹ã®å ±æãã³ã¼ãã¬ãã¥ã¼ã®ããã»ã¹ã®æ´æ°ãå«ã¾ããå¯è½æ§ãããã¾ãã
ãããã®å½±é¿ãé©åã«ç®¡çãããã¨ã§ãé¨åçãªæ´æ°ã¨åå¾ã®å®è£ ã«ããå©ç¹ãæ大éã«æ´»ããã¤ã¤ãæ½å¨çãªåé¡ãæå°éã«æãããã¨ãã§ãã¾ããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ãéçºããã»ã¹ãéç¨ãã©ã¯ãã£ã¹ãå æ¬çã«è¦ç´ããå¿ è¦ã«å¿ãã¦èª¿æ´ãè¡ããã¨ãéè¦ã§ãã
æçµçã«ãé¨åçãªæ´æ°ã¨åå¾ã®å®è£ ã¯ãAPIã®ä½¿ããããã¨å¹çæ§ãå¤§å¹ ã«åä¸ãããå¯è½æ§ãããã¾ãããåæã«ã·ã¹ãã ã®è¤éæ§ãå¢å ããã¾ãããããã£ã¦ããã®å°å ¥ã決å®ããéã¯ãå©ç¹ã¨ã³ã¹ããæ éã«æ¤è¨ããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ã«åºã¥ãã¦é©åãªå¤æãä¸ãå¿ è¦ãããã¾ããé·æçãªä¿å®æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦å ¨ä½çãªã·ã¹ãã ã®ããã©ã¼ãã³ã¹ãèæ ®ã«å ¥ããä¸ã§ãé¨åçãªæ´æ°ã¨åå¾ã®å®è£ ç¯å²ã¨æ¹æ³ã決å®ãããã¨ãè³¢æã§ãã
çµè«
第8ç« ãPartial updates and retrievalsãã¯ãAPIã«ãããé¨åçãªæ´æ°ã¨åå¾ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®å¹çæ§ãæè»æ§ãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
é¨åçãªæ´æ°ã¨åå¾ã¯ã大è¦æ¨¡ãªãªã½ã¼ã¹ãå¶éã®ããã¯ã©ã¤ã¢ã³ãç°å¢ã§ç¹ã«éè¦ã§ãã
ãã£ã¼ã«ããã¹ã¯ã¯ãé¨åçãªæ´æ°ã¨åå¾ãå®ç¾ããããã®å¼·åãªãã¼ã«ã§ãã
é©åãªå®è£ ã¯ããããã¯ã¼ã¯å¸¯åå¹ ã®ä½¿ç¨ãæé©åããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãåä¸ããã¾ãã
ãã£ã¼ã«ããã¹ã¯ã®ä½¿ç¨ã¯ãAPIã®æè»æ§ã¨æ¡å¼µæ§ãå¤§å¹ ã«åä¸ããã¾ãã
é¨åçãªæ´æ°ã¨åå¾ã®å®è£ ã«ã¯ãä¸è²«æ§ãããã©ã¼ãã³ã¹ããã¼ã¸ã§ãã³ã°ãã»ãã¥ãªãã£ãªã©ã®èª²é¡ããããããããé©åã«èæ ®ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãé¨åçãªæ´æ°ã¨åå¾ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨æ§ã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããé¨åçãªæ´æ°ã¨åå¾ã®é©åãªå®è£ ã¯ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããäºæãã¬ããã©ã¼ãã³ã¹åé¡ãäºææ§ã®åé¡ãé²ãä¸ã§ä¸å¯æ¬ ã§ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¹ççã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
9 Custom methods
ãAPI Design Patternsãã®ç¬¬9ç« ãCustom methodsãã¯ãAPIã«ãããã«ã¹ã¿ã ã¡ã½ããã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ã«ã¹ã¿ã ã¡ã½ãããåãªã追å æ©è½ã§ã¯ãªããAPIã®æè»æ§ã表ç¾åãããã¦é·æçãªä¿å®æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
ã«ã¹ã¿ã ã¡ã½ããã®å¿ è¦æ§ã¨åæ©
èè ã¯ãæ¨æºã¡ã½ããã ãã§ã¯å¯¾å¿ã§ããªãã·ããªãªãåå¨ãããã¨ããè°è«ãå§ãã¦ãã¾ããä¾ãã°ãé»åã¡ã¼ã«ã®éä¿¡ãããã¹ãã®ç¿»è¨³ã®ãããªç¹å®ã®ã¢ã¯ã·ã§ã³ãAPIã§ã©ã®ããã«è¡¨ç¾ããã¹ããã¨ããåé¡ãæèµ·ãã¦ãã¾ãããããã®ã¢ã¯ã·ã§ã³ã¯ãæ¨æºçãªCRUDæä½ï¼Create, Read, Update, Deleteï¼ã«ã¯ç°¡åã«å½ã¦ã¯ã¾ããããã¤éè¦ãªå¯ä½ç¨ãä¼´ãå¯è½æ§ãããã¾ãã
ãã®åé¡ã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ãæä¾ããæ©è½ãè¤éåããæ¨æºçãªRESTfulæä½ã ãã§ã¯ã«ãã¼ããããªãã±ã¼ã¹ãå¢ãã¦ãã¾ããä¾ãã°ãããç¹å®ã®æ¡ä»¶ä¸ã§ã®ã¿å®è¡å¯è½ãªæä½ããè¤æ°ã®ãªã½ã¼ã¹ã«è·¨ããæä½ãªã©ã該å½ãã¾ãã
èè ã¯ããã®ãããªç¶æ³ã«å¯¾å¦ããããã®ã½ãªã¥ã¼ã·ã§ã³ã¨ãã¦ã«ã¹ã¿ã ã¡ã½ãããææ¡ãã¦ãã¾ããã«ã¹ã¿ã ã¡ã½ããã¯ãæ¨æºã¡ã½ããã®å¶ç´ãè¶ ãã¦ãAPIã«ç¹åããæä½ãå®ç¾ããæ段ã¨ãªãã¾ãã
ã«ã¹ã¿ã ã¡ã½ããã®å®è£
ã«ã¹ã¿ã ã¡ã½ããã®å®è£ ã«é¢ãã¦ãèè ã¯ããã¤ãã®éè¦ãªãã¤ã³ãã強調ãã¦ãã¾ãã
HTTP ã¡ã½ããã®é¸æ: ã«ã¹ã¿ã ã¡ã½ããã¯ã»ã¨ãã©ã®å ´åãPOSTã¡ã½ããã使ç¨ãã¾ããããã¯ãPOSTããªã½ã¼ã¹ã®ç¶æ ãå¤æ´ããæä½ã«é©ãã¦ããããã§ãã
URLæ§é : ã«ã¹ã¿ã ã¡ã½ããã®URLã¯ãæ¨æºçãªãªã½ã¼ã¹ãã¹ã®å¾ã«ã³ãã³ï¼:ï¼ã使ç¨ãã¦ãã«ã¹ã¿ã ã¢ã¯ã·ã§ã³ã示ãã¾ããä¾ãã°ã
POST /rockets/1234:launch
ã®ãããªå½¢å¼ã§ããå½åè¦å: ã«ã¹ã¿ã ã¡ã½ããã®ååã¯ãæ¨æºã¡ã½ããã¨åæ§ã«åè©+åè©ã®å½¢å¼ãåãã¹ãã§ããä¾ãã°ã
LaunchRocket
ãSendEmail
ãªã©ã§ãã
ãããã®è¦åã¯ãAPIã®ä¸è²«æ§ã¨äºæ¸¬å¯è½æ§ãç¶æããä¸ã§éè¦ã§ããç¹ã«ã大è¦æ¨¡ãªã·ã¹ãã ãé·æçã«éç¨ãããAPIã«ããã¦ããã®ä¸è²«æ§ã¯éçºè ã®çç£æ§ã¨å¦ç¿æ²ç·ã«å¤§ããªå½±é¿ãä¸ãã¾ãã
èè ãæ示ããå®è£ ä¾ããGolangãç¨ãã¦å ·ä½åããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
type RocketAPI interface { LaunchRocket(ctx context.Context, req *LaunchRocketRequest) (*Rocket, error) } type LaunchRocketRequest struct { ID string `json:"id"` } func (s *rocketService) LaunchRocket(ctx context.Context, req *LaunchRocketRequest) (*Rocket, error) { // ã«ã¹ã¿ã ãã¸ãã¯ã®å®è£ // ä¾: ãã±ããã®ç¶æ ãã§ãã¯ãæã¡ä¸ãã·ã¼ã±ã³ã¹ã®éå§ãªã© }
ãã®ãããªå®è£ ã«ãããæ¨æºçãªCRUDæä½ã§ã¯è¡¨ç¾ããããªãè¤éãªãã¸ãã¹ãã¸ãã¯ããæ確ã§ç´æçãªAPIã¤ã³ã¿ã¼ãã§ã¼ã¹ã¨ãã¦æä¾ãããã¨ãå¯è½ã«ãªãã¾ãã
å¯ä½ç¨ã®åãæ±ã
ã«ã¹ã¿ã ã¡ã½ããã®éè¦ãªç¹å¾´ã®ä¸ã¤ã¨ãã¦ãèè ã¯å¯ä½ç¨ã®è¨±å®¹ãæãã¦ãã¾ããæ¨æºã¡ã½ãããåºæ¬çã«ãªã½ã¼ã¹ã®ç¶æ å¤æ´ã®ã¿ãè¡ãã®ã«å¯¾ããã«ã¹ã¿ã ã¡ã½ããã¯ããåºç¯ãªæä½ãè¡ããã¨ãã§ãã¾ããä¾ãã°ãã¡ã¼ã«ã®éä¿¡ãããã¯ã°ã©ã¦ã³ãã¸ã§ãã®éå§ãè¤æ°ãªã½ã¼ã¹ã®æ´æ°ãªã©ã§ãã
ãã®ç¹æ§ã¯ãã·ã¹ãã ã®è¨è¨ã¨éç¨ã«å¤§ããªå½±é¿ãä¸ãã¾ããå¯ä½ç¨ãä¼´ãæä½ã¯ãã·ã¹ãã ã®ä¸è²«æ§ãä¿¡é ¼æ§ã«å½±é¿ãä¸ããå¯è½æ§ããããããæ éã«è¨è¨ããå¿ è¦ãããã¾ããä¾ãã°ããã©ã³ã¶ã¯ã·ã§ã³ç®¡çãã¨ã©ã¼ãã³ããªã³ã°ããªãã©ã¤ã¡ã«ããºã ãªã©ãèæ ®ããå¿ è¦ãããã¾ãã
èè ãæ示ããé»åã¡ã¼ã«éä¿¡ã®ä¾ã¯ããã®ç¹ãæ確ã«ç¤ºãã¦ãã¾ããã¡ã¼ã«ã®éä¿¡æä½ã¯ããã¼ã¿ãã¼ã¹ã®æ´æ°ã ãã§ãªããå¤é¨ã®SMTPãµã¼ãã¼ã¨ã®éä¿¡ãå«ã¿ã¾ãããã®ãããªè¤åçãªæä½ãã«ã¹ã¿ã ã¡ã½ããã¨ãã¦å®è£ ãããã¨ã§ãæä½ã®æå³ãæ確ã«è¡¨ç¾ããåæã«å¿ è¦ãªå¯ä½ç¨ãé©åã«ç®¡çãããã¨ãã§ãã¾ãã
ãªã½ã¼ã¹vs.ã³ã¬ã¯ã·ã§ã³
èè ã¯ãã«ã¹ã¿ã ã¡ã½ãããåã ã®ãªã½ã¼ã¹ã«é©ç¨ãããããªã½ã¼ã¹ã®ã³ã¬ã¯ã·ã§ã³ã«é©ç¨ãããã¨ããé¸æã«ã¤ãã¦ãè«ãã¦ãã¾ãããã®é¸æã¯ãæä½ã®æ§è³ªã¨å½±é¿ç¯å²ã«åºã¥ãã¦è¡ãããã¹ãã§ãã
ä¾ãã°ãåä¸ã®ã¡ã¼ã«ãéä¿¡ããæä½ã¯åã ã®ãªã½ã¼ã¹ã«å¯¾ããã«ã¹ã¿ã ã¡ã½ããã¨ãã¦å®è£ ãããä¸æ¹ã§ãè¤æ°ã®ã¡ã¼ã«ãã¨ã¯ã¹ãã¼ãããæä½ã¯ã³ã¬ã¯ã·ã§ã³ã«å¯¾ããã«ã¹ã¿ã ã¡ã½ããã¨ãã¦å®è£ ãããã¹ãã§ãã
ãã®åºå¥ã¯ãAPIã®è«ççæ§é ã¨ä½¿ããããã«ç´æ¥å½±é¿ãã¾ããé©åã«è¨è¨ãããã«ã¹ã¿ã ã¡ã½ããã¯ãè¤éãªæä½ãç´æçãªã¤ã³ã¿ã¼ãã§ã¼ã¹ã§æä¾ããã¯ã©ã¤ã¢ã³ãå´ã®å®è£ ãç°¡ç´ åãã¾ãã
ã¹ãã¼ãã¬ã¹ã«ã¹ã¿ã ã¡ã½ãã
èè ã¯ãã¹ãã¼ãã¬ã¹ãªã«ã¹ã¿ã ã¡ã½ããã«ã¤ãã¦ãè¨åãã¦ãã¾ãããããã¯ãæ°¸ç¶çãªç¶æ å¤æ´ãä¼´ããã主ã«è¨ç®ãæ¤è¨¼ãè¡ãã¡ã½ããã§ããä¾ãã°ãããã¹ã翻訳ãã¡ã¼ã«ã¢ãã¬ã¹ã®æ¤è¨¼ãªã©ã該å½ãã¾ãã
ã¹ãã¼ãã¬ã¹ã¡ã½ããã¯ãç¹ã«ãã¼ã¿ãã©ã¤ãã·ã¼ãã»ãã¥ãªãã£ã®è¦ä»¶ãå³ããç°å¢ã§æç¨ã§ããä¾ãã°ãGDPRï¼ä¸è¬ãã¼ã¿ä¿è·è¦åï¼ã®ãããªãã¼ã¿ä¿è·è¦å¶ã«å¯¾å¿ããå¿ è¦ãããå ´åããã¼ã¿ãæ°¸ç¶åããã«å¦çã§ããã¹ãã¼ãã¬ã¹ã¡ã½ããã¯æå¹ãªã½ãªã¥ã¼ã·ã§ã³ã¨ãªãã¾ãã
ããããèè ã¯å®å ¨ã«ã¹ãã¼ãã¬ã¹ãªã¢ããã¼ãã®éçã«ã¤ãã¦ãè¦åãã¦ãã¾ããå¤ãã®å ´åãå°æ¥çã«ã¯ããç¨åº¦ã®ç¶æ 管çãå¿ è¦ã«ãªãå¯è½æ§ããããããå®å ¨ã«ã¹ãã¼ãã¬ã¹ãªè¨è¨ã«åºå·ãããã¨ã¯é¿ããã¹ãã ã¨ææãã¦ãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
æè»æ§ã¨è¡¨ç¾å: ã«ã¹ã¿ã ã¡ã½ãããé©åã«ä½¿ç¨ãããã¨ã§ãAPIã®æè»æ§ã¨è¡¨ç¾åãå¤§å¹ ã«åä¸ãã¾ããè¤éãªãã¸ãã¹ãã¸ãã¯ãç¹æ®ãªã¦ã¼ã¹ã±ã¼ã¹ããç´æçã§ä½¿ããããã¤ã³ã¿ã¼ãã§ã¼ã¹ã¨ãã¦æä¾ãããã¨ãå¯è½ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: ã«ã¹ã¿ã ã¡ã½ããã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ç¹ã«æç¨ã§ããåãµã¼ãã¹ãæä¾ããç¹æ®ãªæ©è½ãããµã¼ãã¹éã®è¤éãªç¸äºä½ç¨ã表ç¾ããã®ã«é©ãã¦ãã¾ãã
éç¨æ§ã¨å¯è¦³æ¸¬æ§: ã«ã¹ã¿ã ã¡ã½ããã®å°å ¥ã¯ãã·ã¹ãã ã®éç¨æ§ã¨å¯è¦³æ¸¬æ§ã«å½±é¿ãä¸ãã¾ããå¯ä½ç¨ãä¼´ãæä½ããè¤éãªå¦çããã¼ãå«ãã«ã¹ã¿ã ã¡ã½ããã¯ãé©åãªãã°è¨é²ãã¢ãã¿ãªã³ã°ããã¬ã¼ã·ã³ã°ã®å®è£ ãä¸å¯æ¬ ã§ãã
ãã¼ã¸ã§ãã³ã°ã¨å¾æ¹äºææ§: ã«ã¹ã¿ã ã¡ã½ããã®è¿½å ãå¤æ´ã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã«å½±é¿ãä¸ãã¾ããæ°ããã«ã¹ã¿ã ã¡ã½ããã®å°å ¥ãæ¢åã¡ã½ããã®å¤æ´ãè¡ãéã¯ãå¾æ¹äºææ§ã®ç¶æã«æ³¨æãæãå¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£ã®èæ ®: ã«ã¹ã¿ã ã¡ã½ãããç¹ã«å¯ä½ç¨ãä¼´ããã®ã¯ãé©åãªã¢ã¯ã»ã¹å¶å¾¡ã¨èªå¯ãã§ãã¯ãå¿ è¦ã§ããã¾ããã¹ãã¼ãã¬ã¹ã¡ã½ããã使ç¨ããå ´åã§ããå ¥åãã¼ã¿ã®æ¤è¨¼ããµãã¿ã¤ãºã¯ä¸å¯æ¬ ã§ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: ã«ã¹ã¿ã ã¡ã½ããã®å®è£ ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ããç¹ã«ãè¤éãªå¦çãå¤é¨ãµã¼ãã¹ã¨ã®é£æºãå«ãã¡ã½ããã¯ãé©åãªããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ã¨ã¹ã±ã¼ãªã³ã°æ¦ç¥ãå¿ è¦ã«ãªãã¾ãã
çµè«
第9ç« ãCustom methodsãã¯ãAPIã«ãããã«ã¹ã¿ã ã¡ã½ããã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ã表ç¾åãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã«ã¹ã¿ã ã¡ã½ããã¯ãæ¨æºã¡ã½ããã§ã¯é©åã«è¡¨ç¾ã§ããªãè¤éãªæä½ãç¹æ®ãªã¦ã¼ã¹ã±ã¼ã¹ã«å¯¾å¿ããããã®å¼·åãªãã¼ã«ã§ãã
ã«ã¹ã¿ã ã¡ã½ããã®è¨è¨ã¨å®è£ ã«ã¯ãä¸è²«æ§ã®ããå½åè¦åã¨URLæ§é ã®ä½¿ç¨ãéè¦ã§ãã
å¯ä½ç¨ãä¼´ãã«ã¹ã¿ã ã¡ã½ããã®ä½¿ç¨ã¯æ éã«è¡ããé©åãªç®¡çã¨ææ¸åãå¿ è¦ã§ãã
ãªã½ã¼ã¹ã¨ã³ã¬ã¯ã·ã§ã³ã«å¯¾ããã«ã¹ã¿ã ã¡ã½ããã®é©ç¨ã¯ãæä½ã®æ§è³ªã«åºã¥ãã¦é©åã«é¸æããå¿ è¦ãããã¾ãã
ã¹ãã¼ãã¬ã¹ãªã«ã¹ã¿ã ã¡ã½ããã¯æç¨ã§ãããå°æ¥çãªæ¡å¼µæ§ãèæ ®ãã¦è¨è¨ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãã«ã¹ã¿ã ã¡ã½ããã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªã«ã¹ã¿ã ã¡ã½ããã®è¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãä¿å®æ§ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããã«ã¹ã¿ã ã¡ã½ããã®é©åãªå®è£ ã¯ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããäºæãã¬è¦ä»¶å¤æ´ãæ°æ©è½ã®è¿½å ã«ãæè»ã«å¯¾å¿ã§ããAPIãå®ç¾ãã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
10 Long-running operations
ãAPI Design Patternsãã®ç¬¬10ç« ãLong-running operationsãã¯ãAPIã«ãããé·æéå®è¡æä½ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯é·æéå®è¡æä½ï¼LROï¼ãåãªãæ©è½ã®è¿½å ã§ã¯ãªããAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªéç¨æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
é·æéå®è¡æä½ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãAPIã«ãããé·æéå®è¡æä½ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¤ãã®APIå¼ã³åºãã¯æ°ç¾ããªç§ä»¥å ã«å¦çããã¾ããããã¼ã¿å¦çãå¤é¨ãµã¼ãã¹ã¨ã®é£æºãªã©ãæéã®ãããæä½ãåå¨ãã¾ãããããã®æä½ãåæçã«å¦çããã¨ãã¯ã©ã¤ã¢ã³ãã®å¾ ã¡æéãé·ããªãããªã½ã¼ã¹ã®ç¡é§é£ãã«ã¤ãªããå¯è½æ§ãããã¾ãã
é·æéå®è¡æä½ã®æ¦å¿µã¯ãããã°ã©ãã³ã°è¨èªã«ãããPromiseãFutureã¨é¡ä¼¼ãã¦ãã¾ããAPIã®æèã§ã¯ããããã®æä½ã¯ãLong-running Operationsãï¼LROï¼ã¨å¼ã°ããéåæå¦çãå¯è½ã«ãã¾ããLROã¯ãæä½ã®é²è¡ç¶æ³ã追跡ããæçµçãªçµæãåå¾ããããã®ã¡ã«ããºã ãæä¾ãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãä¸ã¤ã®æä½ãè¤æ°ã®ãµã¼ãã¹ã«ã¾ããã£ã¦å®è¡ãããå¯è½æ§ãããããã®å ¨ä½ã®é²è¡ç¶æ³ã追跡ããå¿ è¦ãããã¾ãã
èè ã¯ãLROã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
- ä¸æã®èå¥å
- æä½ã®ç¶æ ï¼å®è¡ä¸ãå®äºãã¨ã©ã¼ãªã©ï¼
- çµæã¾ãã¯çºçããã¨ã©ã¼ã®æ å ±
- é²è¡ç¶æ³ã追å ã®ã¡ã¿ãã¼ã¿
ãããã®è¦ç´ ãå«ãLROã¯ãAPIãªã½ã¼ã¹ã¨ãã¦æ±ãããã¯ã©ã¤ã¢ã³ãã¯ãã®ãªã½ã¼ã¹ãéãã¦æä½ã®ç¶æ ã確èªããçµæãåå¾ãããã¨ãã§ãã¾ãã
LROã®å®è£
LROã®å®è£ ã«é¢ãã¦ãèè ã¯ããã¤ãã®éè¦ãªãã¤ã³ãã強調ãã¦ãã¾ãã
ãªã½ã¼ã¹ã¨ãã¦ã®LRO: LROã¯é常ã®APIãªã½ã¼ã¹ã¨ãã¦æ±ãããä¸æã®èå¥åãæã¡ã¾ããããã«ãããã¯ã©ã¤ã¢ã³ãã¯æä½ã®ç¶æ ãç°¡åã«è¿½è·¡ã§ãã¾ãã
ã¸ã§ããªãã¯ãªè¨è¨: LROã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ããã¾ãã¾ãªç¨®é¡ã®æä½ã«å¯¾å¿ã§ããããã«ãçµæã®åã¨ã¡ã¿ãã¼ã¿ã®åããã©ã¡ã¼ã¿åãã¾ãã
ã¹ãã¼ã¿ã¹ç®¡ç: æä½ã®ç¶æ ï¼å®è¡ä¸ãå®äºãã¨ã©ã¼ãªã©ï¼ãæ確ã«è¡¨ç¾ããå¿ è¦ãããã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°: æä½ã失æããå ´åã®ã¨ã©ã¼æ å ±ãé©åã«æä¾ããå¿ è¦ãããã¾ãã
é²è¡ç¶æ³ã®è¿½è·¡: é·æéå®è¡æä½ã®é²è¡ç¶æ³ã追跡ããã¯ã©ã¤ã¢ã³ãã«æä¾ããã¡ã«ããºã ãå¿ è¦ã§ãã
ãããã®è¦ç´ ãèæ ®ããLROã®åºæ¬çãªæ§é ããGolangãç¨ãã¦è¡¨ç¾ããã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
type Operation struct { ID string `json:"id"` Done bool `json:"done"` Result interface{} `json:"result,omitempty"` Error *ErrorInfo `json:"error,omitempty"` Metadata interface{} `json:"metadata,omitempty"` } type ErrorInfo struct { Code int `json:"code"` Message string `json:"message"` Details map[string]interface{} `json:"details,omitempty"` }
ãã®æ§é ã«ãããAPIã¯é·æéå®è¡æä½ã®ç¶æ ãå¹æçã«è¡¨ç¾ããã¯ã©ã¤ã¢ã³ãã«å¿ è¦ãªæ å ±ãæä¾ãããã¨ãã§ãã¾ãã
LROã®ç¶æ 管çã¨çµæã®åå¾
èè ã¯ãLROã®ç¶æ ã管çããçµæãåå¾ããããã®2ã¤ã®ä¸»è¦ãªã¢ããã¼ããææ¡ãã¦ãã¾ãããã¼ãªã³ã°ã¨å¾ æ©ã§ãã
ãã¼ãªã³ã°: ã¯ã©ã¤ã¢ã³ããå®æçã«LROã®ç¶æ ã確èªããæ¹æ³ã§ããããã¯å®è£ ãç°¡åã§ãããä¸å¿ è¦ãªAPIå¼ã³åºããçºçããå¯è½æ§ãããã¾ãã
å¾ æ©: ã¯ã©ã¤ã¢ã³ããLROã®å®äºãå¾ ã¤é·ææ¥ç¶ã確ç«ããæ¹æ³ã§ããããã¯ãªã¢ã«ã¿ã¤ã æ§ãé«ãã§ããããµã¼ãã¼å´ã®ãªã½ã¼ã¹ç®¡çãè¤éã«ãªãå¯è½æ§ãããã¾ãã
ãããã®ã¢ããã¼ããå®è£ ããéãèè ã¯ä»¥ä¸ã®APIã¡ã½ãããææ¡ãã¦ãã¾ãã
GetOperation
: LROã®ç¾å¨ã®ç¶æ ãåå¾ãã¾ããListOperations
: è¤æ°ã®LROããªã¹ãã¢ãããã¾ããWaitOperation
: LROã®å®äºãå¾ æ©ãã¾ãã
ãããã®ã¡ã½ãããé©åã«å®è£ ãããã¨ã§ãã¯ã©ã¤ã¢ã³ãã¯é·æéå®è¡æä½ã®é²è¡ç¶æ³ãå¹æçã«è¿½è·¡ããçµæãåå¾ãããã¨ãã§ãã¾ãã
LROã®å¶å¾¡ã¨ç®¡ç
èè ã¯ãLROãããæè»ã«ç®¡çããããã®è¿½å æ©è½ã«ã¤ãã¦ãè«ãã¦ãã¾ãã
ãã£ã³ã»ã«: å®è¡ä¸ã®æä½ãä¸æ¢ããæ©è½ã§ããããã¯ãä¸è¦ã«ãªã£ãæä½ãã¨ã©ã¼ãçºçããæä½ãé©åã«çµäºãããããã«éè¦ã§ãã
ä¸æåæ¢ã¨åé: ä¸é¨ã®æä½ã§ã¯ãä¸æçã«å¦çãåæ¢ããå¾ã§åéããæ©è½ãæç¨ãªå ´åãããã¾ãã
æå¹æé: LROãªã½ã¼ã¹ããã¤ã¾ã§ä¿æãããã決å®ããã¡ã«ããºã ã§ããããã¯ãã·ã¹ãã ãªã½ã¼ã¹ã®å¹ççãªç®¡çã«å½¹ç«ã¡ã¾ãã
ãããã®æ©è½ãå®è£ ãããã¨ã§ãAPIã®æè»æ§ã¨éç¨æ§ãåä¸ãã¾ããä¾ãã°ããã£ã³ã»ã«æ©è½ã¯ä»¥ä¸ã®ããã«å®è£ ã§ãã¾ãã
func (s *Service) CancelOperation(ctx context.Context, req *CancelOperationRequest) (*Operation, error) { op, err := s.GetOperation(ctx, &GetOperationRequest{Name: req.Name}) if err != nil { return nil, err } if op.Done { return op, nil } // æä½ããã£ã³ã»ã«ãããã¸ã㯠// ... op.Done = true op.Error = &ErrorInfo{ Code: int(codes.Cancelled), Message: "Operation cancelled by the user.", } return s.UpdateOperation(ctx, op) }
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨æ§è½: LROãé©åã«å®è£ ãããã¨ã§ãAPIã®ã¹ã±ã¼ã©ããªãã£ã¨å ¨ä½çãªæ§è½ãåä¸ããããã¨ãã§ãã¾ããé·æéå®è¡æä½ãéåæã§å¦çãããã¨ã§ããµã¼ãã¼ãªã½ã¼ã¹ãå¹ççã«å©ç¨ããã¯ã©ã¤ã¢ã³ãã®å¿çæ§ãç¶æãããã¨ãã§ãã¾ãã
ä¿¡é ¼æ§ã¨ã¨ã©ã¼å¦ç: LROãã¿ã¼ã³ã¯ãé·æéå®è¡æä½ä¸ã«çºçããå¯è½æ§ã®ããã¨ã©ã¼ãé©åã«å¦çããã¯ã©ã¤ã¢ã³ãã«ä¼éããã¡ã«ããºã ãæä¾ãã¾ããããã«ãããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãåä¸ãã¾ãã
éç¨æ§ã¨å¯è¦³æ¸¬æ§: LROãªã½ã¼ã¹ãéãã¦æä½ã®é²è¡ç¶æ³ãç¶æ ã追跡ã§ãããã¨ã¯ãã·ã¹ãã ã®éç¨æ§ã¨å¯è¦³æ¸¬æ§ãå¤§å¹ ã«åä¸ããã¾ããããã¯ãè¤éãªåæ£ã·ã¹ãã ã®åé¡è¨ºæãæ§è½æé©åã«ç¹ã«æç¨ã§ãã
ã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹: ã¯ã©ã¤ã¢ã³ãã«é²è¡ç¶æ³ãæä¾ããé·æéæä½ããã£ã³ã»ã«ããæ©è½ãæä¾ãããã¨ã§ãAPIã®ã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹ãåä¸ãã¾ãã
ãªã½ã¼ã¹ç®¡ç: LROã®æå¹æéãé©åã«è¨å®ãããã¨ã§ãã·ã¹ãã ãªã½ã¼ã¹ãå¹ççã«ç®¡çã§ãã¾ããããã¯ã大è¦æ¨¡ãªã·ã¹ãã ã®é·æçãªéç¨ã«ããã¦ç¹ã«éè¦ã§ãã
çµè«
第10ç« ãLong-running operationsãã¯ãAPIã«ãããé·æéå®è¡æä½ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªéç¨æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
LROã¯ãé·æéå®è¡æä½ãéåæã§å¦çããããã®å¼·åãªãã¼ã«ã§ãã
LROãAPIãªã½ã¼ã¹ã¨ãã¦æ±ããã¨ã§ãæä½ã®ç¶æ 管çã¨çµæã®åå¾ã容æã«ãªãã¾ãã
ãã¼ãªã³ã°ã¨å¾ æ©ã®ä¸¡æ¹ã®ã¢ããã¼ããæä¾ãããã¨ã§ããã¾ãã¾ãªã¯ã©ã¤ã¢ã³ãã®ãã¼ãºã«å¯¾å¿ã§ãã¾ãã
ãã£ã³ã»ã«ãä¸æåæ¢ãåéãªã©ã®å¶å¾¡æ©è½ãæä¾ãããã¨ã§ãAPIã®æè»æ§ãåä¸ãã¾ãã
LROãªã½ã¼ã¹ã®é©åãªæå¹æé管çã¯ãã·ã¹ãã ãªã½ã¼ã¹ã®å¹ççãªå©ç¨ã«ã¤ãªããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãLROã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªLROã®è¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããLROã®é©åãªå®è£ ã¯ãè¤éãªåæ£ã·ã¹ãã ã«ãããéåæå¦çã®ç®¡çã容æã«ããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ã¨å¹çæ§ãåä¸ããã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
11 Rerunnable jobs
ãAPI Design Patternsãã®ç¬¬11ç« ãRerunnable jobsãã¯ãAPIã«ãããåå®è¡å¯è½ãªã¸ã§ãã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯åå®è¡å¯è½ãªã¸ã§ããåãªãæ©è½ã®è¿½å ã§ã¯ãªããAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªéç¨æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
åå®è¡å¯è½ãªã¸ã§ãã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãåå®è¡å¯è½ãªã¸ã§ãã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¤ãã®APIã§ã¯ãã«ã¹ã¿ãã¤ãºå¯è½ã§ç¹°ãè¿ãå®è¡ããå¿ è¦ã®ããæ©è½ãåå¨ãã¾ããããããå¾æ¥ã®APIãã¶ã¤ã³ã§ã¯ããããã®æ©è½ãå¹ççã«ç®¡çãããã¨ãå°é£ã§ãããèè ã¯ããã®åé¡ã«å¯¾å¦ããããã«ãã¸ã§ããã¨ããæ¦å¿µãå°å ¥ãã¦ãã¾ãã
ã¸ã§ãã¯ãAPIã¡ã½ããã®è¨å®ã¨å®è¡ãåé¢ããç¹å¥ãªãªã½ã¼ã¹ã¨ãã¦å®ç¾©ããã¦ãã¾ãããã®åé¢ã«ã¯ä»¥ä¸ã®å©ç¹ãããã¾ãã
è¨å®ã®æ°¸ç¶åï¼ã¸ã§ãã®è¨å®ãAPIãµã¼ãã¼å´ã§ä¿åã§ãããããã¯ã©ã¤ã¢ã³ãã¯æ¯å詳細ãªè¨å®ãæä¾ããå¿ è¦ãããã¾ããã
権éã®åé¢ï¼ã¸ã§ãã®è¨å®ã¨å®è¡ã«ç°ãªã権éãè¨å®ã§ãããããã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡ãåä¸ãã¾ãã
ã¹ã±ã¸ã¥ã¼ãªã³ã°ã®å®¹æãï¼ã¸ã§ããAPIãµã¼ãã¼å´ã§ã¹ã±ã¸ã¥ã¼ã«ãããã¨ãå¯è½ã«ãªããã¯ã©ã¤ã¢ã³ãå´ã§ã®è¤éãªã¹ã±ã¸ã¥ã¼ãªã³ã°ç®¡çãä¸è¦ã«ãªãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãå®æçãªãã¼ã¿å¦çãããã¯ã¢ãããªã©ã®æä½ãå¹ççã«ç®¡çããå¿ è¦ãããã¾ããåå®è¡å¯è½ãªã¸ã§ãã使ç¨ãããã¨ã§ããããã®æä½ãä¸è²«ããæ¹æ³ã§è¨è¨ããå®è¡ãããã¨ãã§ãã¾ãããã®è¾ºã®åå®è¡æ§ã«ã¤ãã¦å æ¬çã«ç¥ãããã®ã§ããã°Cloud Native Go, 2nd Editionããã¼ã¿æåã¢ããªã±ã¼ã·ã§ã³ãã¶ã¤ã³ âä¿¡é ¼æ§ãæ¡å¼µæ§ãä¿å®æ§ã®é«ãåæ£ã·ã¹ãã è¨è¨ã®åçãªã©ãè¯ãã®ã§ãªã¹ã¹ã¡ã§ãã
èè ã¯ãã¸ã§ãã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
- ã¸ã§ããªã½ã¼ã¹ï¼è¨å®æ å ±ãä¿æãããªã½ã¼ã¹
- å®è¡ã¡ã½ããï¼ã¸ã§ããå®è¡ããããã®ã«ã¹ã¿ã ã¡ã½ãã
- å®è¡ãªã½ã¼ã¹ï¼ã¸ã§ãã®å®è¡çµæãä¿æãããªã½ã¼ã¹ï¼å¿ è¦ãªå ´åï¼
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ãAPIã¯æè»ã§åå©ç¨å¯è½ãªã¸ã§ã管çã·ã¹ãã ãæä¾ãããã¨ãã§ãã¾ãã
ã¸ã§ããªã½ã¼ã¹ã®å®è£
èè ã¯ãã¸ã§ããªã½ã¼ã¹ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããã¸ã§ããªã½ã¼ã¹ã¯ãé常ã®APIãªã½ã¼ã¹ã¨åæ§ã«æ±ããã¾ããããã®ç®çã¯ç¹å®ã®æä½ã®è¨å®ãä¿åãããã¨ã§ããã¸ã§ããªã½ã¼ã¹ã®ä¸»ãªç¹å¾´ã¯ä»¥ä¸ã®éãã§ãã
ä¸æã®èå¥åï¼ä»ã®ãªã½ã¼ã¹ã¨åæ§ã«ãã¸ã§ããªã½ã¼ã¹ãä¸æã®èå¥åãæã¡ã¾ãã
è¨å®ãã©ã¡ã¼ã¿ï¼ã¸ã§ãã®å®è¡ã«å¿ è¦ãªå ¨ã¦ã®è¨å®æ å ±ãä¿æãã¾ãã
æ¨æºçãªCRUDæä½ï¼ã¸ã§ããªã½ã¼ã¹ã¯ä½æãèªã¿åããæ´æ°ãåé¤ã®æ¨æºçãªæä½ããµãã¼ããã¾ãã
èè ã¯ããã£ããã«ã¼ã ã®ããã¯ã¢ãããä¾ã«ã¨ã£ã¦ãã¸ã§ããªã½ã¼ã¹ã®è¨è¨ã説æãã¦ãã¾ãã以ä¸ã¯ãGolangãç¨ãã¦ãã®ã¸ã§ããªã½ã¼ã¹ã表ç¾ããä¾ã§ãã
type BackupChatRoomJob struct { ID string `json:"id"` ChatRoomID string `json:"chatRoomId"` Destination string `json:"destination"` CompressionFormat string `json:"compressionFormat"` EncryptionKey string `json:"encryptionKey"` }
ãã®ãããªè¨è¨ã«ãããã¸ã§ãã®è¨å®ãæ°¸ç¶åããå¿ è¦ã«å¿ãã¦åå©ç¨ãããã¨ãå¯è½ã«ãªãã¾ããã¾ããç°ãªã権éã¬ãã«ãæã¤ã¦ã¼ã¶ã¼ãã¸ã§ãã®è¨å®ã¨å®è¡ãå¥ã ã«ç®¡çã§ããããã«ãªãã¾ãã
ã¸ã§ãã®å®è¡ã¨LRO
èè ã¯ãã¸ã§ãã®å®è¡æ¹æ³ã«ã¤ãã¦ã詳細ã«èª¬æãã¦ãã¾ããã¸ã§ãã®å®è¡ã¯ãã«ã¹ã¿ã ã¡ã½ããï¼é常ã¯ãrunãã¡ã½ããï¼ãéãã¦è¡ããã¾ãããã®ã¡ã½ããã¯ãé·æéå®è¡æä½ï¼LROï¼ãè¿ããã¨ã§ãéåæå®è¡ããµãã¼ããã¾ãã
以ä¸ã¯ãGolangãç¨ãã¦ã¸ã§ãå®è¡ã¡ã½ããã表ç¾ããä¾ã§ãã
func (s *Service) RunBackupChatRoomJob(ctx context.Context, req *RunBackupChatRoomJobRequest) (*Operation, error) { job, err := s.GetBackupChatRoomJob(ctx, req.JobID) if err != nil { return nil, err } op := &Operation{ Name: fmt.Sprintf("operations/backup_%s", job.ID), Metadata: &BackupChatRoomJobMetadata{ JobID: job.ID, Status: "RUNNING", }, } go s.executeBackupJob(job, op) return op, nil }
ãã®ã¢ããã¼ãã«ã¯ä»¥ä¸ã®å©ç¹ãããã¾ãã
éåæå®è¡ï¼é·æéãããå¯è½æ§ã®ããæä½ãéåæã§å®è¡ã§ãã¾ãã
é²æ追跡ï¼LROãéãã¦ãã¸ã§ãã®é²æç¶æ³ã追跡ã§ãã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°ï¼LROã使ç¨ãããã¨ã§ãã¸ã§ãå®è¡ä¸ã®ã¨ã©ã¼ãé©åã«å¦çããã¯ã©ã¤ã¢ã³ãã«ä¼éã§ãã¾ãã
å®è¡ãªã½ã¼ã¹ã®å°å ¥
èè ã¯ãã¸ã§ãã®å®è¡çµæãæ°¸ç¶åããããã®ãå®è¡ãªã½ã¼ã¹ãã®æ¦å¿µãå°å ¥ãã¦ãã¾ããããã¯ãLROã®æå¹æéãéå®ãããå¯è½æ§ãããå ´åã«ç¹ã«éè¦ã§ããå®è¡ãªã½ã¼ã¹ã®ä¸»ãªç¹å¾´ã¯ä»¥ä¸ã®éãã§ãã
èªã¿åãå°ç¨ï¼å®è¡ãªã½ã¼ã¹ã¯ãã¸ã§ãã®å®è¡çµæã表ããããé常ã¯èªã¿åãå°ç¨ã§ãã
ã¸ã§ãã¨ã®é¢é£ä»ãï¼åå®è¡ãªã½ã¼ã¹ã¯ãç¹å®ã®ã¸ã§ããªã½ã¼ã¹ã«é¢é£ä»ãããã¾ãã
çµæã®æ°¸ç¶åï¼ã¸ã§ãã®å®è¡çµæãé·æçã«ä¿åããå¾ã§åç §ãããã¨ãã§ãã¾ãã
以ä¸ã¯ãGolangãç¨ãã¦å®è¡ãªã½ã¼ã¹ã表ç¾ããä¾ã§ãã
type AnalyzeChatRoomJobExecution struct { ID string `json:"id"` JobID string `json:"jobId"` ExecutionTime time.Time `json:"executionTime"` SentenceComplexity float64 `json:"sentenceComplexity"` Sentiment float64 `json:"sentiment"` AbuseScore float64 `json:"abuseScore"` }
å®è¡ãªã½ã¼ã¹ãå°å ¥ãããã¨ã§ãã¸ã§ãã®å®è¡å±¥æ´ã管çããçµæãé·æçã«ä¿åãããã¨ãå¯è½ã«ãªãã¾ããããã¯ããã¼ã¿åæãç£æ»ã®ç®çã§ç¹ã«æç¨ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨æ§è½: åå®è¡å¯è½ãªã¸ã§ããé©åã«å®è£ ãããã¨ã§ãAPIã®ã¹ã±ã¼ã©ããªãã£ã¨å ¨ä½çãªæ§è½ãåä¸ããããã¨ãã§ãã¾ããé·æéå®è¡ãããæä½ãéåæã§å¦çãããã¨ã§ããµã¼ãã¼ãªã½ã¼ã¹ãå¹ççã«å©ç¨ããã¯ã©ã¤ã¢ã³ãã®å¿çæ§ãç¶æãããã¨ãã§ãã¾ãã
éç¨æ§ã¨å¯è¦³æ¸¬æ§: ã¸ã§ããªã½ã¼ã¹ã¨å®è¡ãªã½ã¼ã¹ãå°å ¥ãããã¨ã§ãã·ã¹ãã ã®éç¨æ§ã¨å¯è¦³æ¸¬æ§ãåä¸ãã¾ããã¸ã§ãã®è¨å®ãå®è¡ç¶æ³ãçµæãä¸å çã«ç®¡çã§ãããããåé¡ã®è¨ºæãæ§è½æé©åã容æã«ãªãã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ã¸ã§ãã®è¨å®ã¨å®è¡ãåé¢ãããã¨ã§ãããç´°ããã¢ã¯ã»ã¹å¶å¾¡ãå¯è½ã«ãªãã¾ããããã¯ã大è¦æ¨¡ãªçµç¹ãè¤éãªã·ã¹ãã ã«ããã¦ç¹ã«éè¦ã§ãã
ãã¼ã¸ã§ãã³ã°ã¨å¾æ¹äºææ§: ã¸ã§ããªã½ã¼ã¹ã使ç¨ãããã¨ã§ãAPIã®é²åã«ä¼´ãå¤æ´ã管çãããããªãã¾ããæ°ãããã©ã¡ã¼ã¿ãæ©è½ã追å ããéããæ¢åã®ã¸ã§ãã¨ã®äºææ§ãç¶æãããããªãã¾ãã
ã¹ã±ã¸ã¥ã¼ãªã³ã°ã¨èªåå: åå®è¡å¯è½ãªã¸ã§ãã¯ãå®æçãªã¿ã¹ã¯ããããå¦çã®èªååã«é©ãã¦ãã¾ããããã¯ããã¼ã¿å¦çãã¤ãã©ã¤ã³ãã¬ãã¼ãçæãªã©ã®ã·ããªãªã§ç¹ã«æç¨ã§ãã
çµè«
第11ç« ãRerunnable jobsãã¯ãAPIã«ãããåå®è¡å¯è½ãªã¸ã§ãã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªéç¨æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã¸ã§ããªã½ã¼ã¹ãå°å ¥ãããã¨ã§ãè¨å®ã¨å®è¡ãåé¢ããåå©ç¨æ§ãé«ãããã¨ãã§ãã¾ãã
ã«ã¹ã¿ã ã®å®è¡ã¡ã½ããã¨LROãçµã¿åããããã¨ã§ãéåæå®è¡ã¨é²æ追跡ãå®ç¾ã§ãã¾ãã
å®è¡ãªã½ã¼ã¹ã使ç¨ãããã¨ã§ãã¸ã§ãã®çµæãæ°¸ç¶åããé·æçãªåæãç£æ»ãå¯è½ã«ãã¾ãã
ãã®è¨è¨ãã¿ã¼ã³ã¯ãã»ãã¥ãªãã£ãã¹ã±ã¼ã©ããªãã£ãéç¨æ§ã®åä¸ã«è²¢ç®ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãåå®è¡å¯è½ãªã¸ã§ãã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªã¸ã§ãè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããåå®è¡å¯è½ãªã¸ã§ãã®é©åãªå®è£ ã¯ãè¤éãªã¯ã¼ã¯ããã¼ã®ç®¡çã容æã«ããã·ã¹ãã å ¨ä½ã®æè»æ§ã¨å¹çæ§ãåä¸ããã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
Part 4 Resource relationships
ããã§ã¯ãAPIã«ããããªã½ã¼ã¹éã®é¢ä¿æ§ã®è¡¨ç¾æ¹æ³ã«ã¤ãã¦è©³ãã解説ããã¦ãã¾ããã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãã¯ãã¹ãªãã¡ã¬ã³ã¹ãé¢é£ãªã½ã¼ã¹ãããªã¢ã¼ãã£ãºã ãªã©ãè¤éãªãã¼ã¿æ§é ãé¢ä¿æ§ã APIã§è¡¨ç¾ããããã®é«åº¦ãªãã¯ããã¯ãç´¹ä»ããã¦ãã¾ãããããã®ãã¿ã¼ã³ãç解ãé©åã«é©ç¨ãããã¨ã§ãããæè»ã§è¡¨ç¾åè±ããªAPIãè¨è¨ãããã¨ãã§ãã¾ãã
12 Singleton sub-resources
ãAPI Design Patternsãã®ç¬¬12ç« ãSingleton sub-resourcesãã¯ãAPIã«ãããã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãåãªãè¨è¨ä¸ã®é¸æã§ã¯ãªããAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªä¿å®æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ãã¿ã¼ã³ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¤ãã®APIã§ã¯ããªã½ã¼ã¹ã®ä¸é¨ã®ãã¼ã¿ãç¬ç«ãã¦ç®¡çããå¿ è¦ãçãããã¨ãããã¾ããä¾ãã°ãã¢ã¯ã»ã¹å¶å¾¡ãªã¹ãï¼ACLï¼ã®ãããªå¤§è¦æ¨¡ãªãã¼ã¿ãé »ç¹ã«æ´æ°ãããä½ç½®æ å ±ãã¾ãã¯ç¹å¥ãªã»ãã¥ãªãã£è¦ä»¶ãæã¤ãã¼ã¿ãªã©ã該å½ãã¾ãããããã®ãã¼ã¿ã主ãªã½ã¼ã¹ããåé¢ãããã¨ã§ãAPIã®å¹çæ§ã¨æè»æ§ãåä¸ããããã¨ãã§ãã¾ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯ããªã½ã¼ã¹ã®ããããã£ã¨ãµããªã½ã¼ã¹ã®ä¸éçãªåå¨ã¨ãã¦å®ç¾©ããã¦ãã¾ããèè ã¯ããã®æ¦å¿µã以ä¸ã®ããã«èª¬æãã¦ãã¾ãã
- 親ãªã½ã¼ã¹ã«å¾å±ï¼ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯å¸¸ã«è¦ªãªã½ã¼ã¹ã«é¢é£ä»ãããã¾ãã
- åä¸ã¤ã³ã¹ã¿ã³ã¹ï¼å親ãªã½ã¼ã¹ã«å¯¾ãã¦ãç¹å®ã®ã¿ã¤ãã®ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯1ã¤ããåå¨ãã¾ããã
- ç¬ç«ãã管çï¼ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯ã親ãªã½ã¼ã¹ã¨ã¯å¥ã«åå¾ãæ´æ°ãå¯è½ã§ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ãµã¼ãã¹ã¨ä½ç½®æ å ±ãµã¼ãã¹ãåé¢ãã¤ã¤ã両è ã®é¢é£æ§ãç¶æãããå ´åã«ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãæå¹ã§ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å®è£
èè ã¯ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
æ¨æºã¡ã½ããã®å¶é: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯ãé常ã®ãªã½ã¼ã¹ã¨ã¯ç°ãªããæ¨æºã®CRUDæä½ã®ä¸é¨ã®ã¿ããµãã¼ããã¾ããå ·ä½çã«ã¯ãGetï¼åå¾ï¼ã¨Updateï¼æ´æ°ï¼ã®ã¿ã許å¯ããã¾ãã
æé»çãªä½æã¨åé¤: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯è¦ªãªã½ã¼ã¹ã®ä½ææã«èªåçã«ä½æããã親ãªã½ã¼ã¹ã®åé¤æã«èªåçã«åé¤ããã¾ãã
ãªã»ããæ©è½: èè ã¯ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãåæç¶æ ã«ãªã»ããããããã®ã«ã¹ã¿ã ã¡ã½ããã®å®è£ ãæ¨å¥¨ãã¦ãã¾ãã
é層æ§é : ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯å¸¸ã«è¦ªãªã½ã¼ã¹ã®ç´ä¸ã«ä½ç½®ããä»ã®ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®åã«ãªããã¨ã¯ããã¾ããã
ãããã®ååãé©ç¨ãããã¨ã§ãAPIã®ä¸è²«æ§ã¨äºæ¸¬å¯è½æ§ãç¶æãã¤ã¤ãç¹å®ã®ãã¼ã¿ãå¹ççã«ç®¡çãããã¨ãã§ãã¾ãã
以ä¸ã¯ãGolangãç¨ãã¦ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãå®è£ ããä¾ã§ãã
type Driver struct { ID string `json:"id"` Name string `json:"name"` LicensePlate string `json:"licensePlate"` } type DriverLocation struct { ID string `json:"id"` DriverID string `json:"driverId"` Latitude float64 `json:"latitude"` Longitude float64 `json:"longitude"` UpdatedAt time.Time `json:"updatedAt"` } type DriverService interface { GetDriver(ctx context.Context, id string) (*Driver, error) UpdateDriver(ctx context.Context, driver *Driver) error GetDriverLocation(ctx context.Context, driverID string) (*DriverLocation, error) UpdateDriverLocation(ctx context.Context, location *DriverLocation) error ResetDriverLocation(ctx context.Context, driverID string) error }
ãã®ä¾ã§ã¯ãDriver
ãªã½ã¼ã¹ã¨DriverLocation
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãå®ç¾©ãã¦ãã¾ããDriverService
ã¤ã³ã¿ã¼ãã§ã¼ã¹ã¯ããããã®ãªã½ã¼ã¹ã«å¯¾ããæä½ãå®ç¾©ãã¦ãã¾ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å©ç¹ã¨èª²é¡
èè ã¯ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®å©ç¹ã¨èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãã
å©ç¹:
- ãã¼ã¿ã®åé¢: é »ç¹ã«æ´æ°ããããã¼ã¿ã大éã®ãã¼ã¿ãåé¢ãããã¨ã§ã主ãªã½ã¼ã¹ã®ç®¡çã容æã«ãªãã¾ãã
- ç´°ç²åº¦ã®ã¢ã¯ã»ã¹å¶å¾¡: ç¹å®ã®ãã¼ã¿ã«å¯¾ãã¦ããã詳細ãªã¢ã¯ã»ã¹å¶å¾¡ãå®è£ ã§ãã¾ãã
- ããã©ã¼ãã³ã¹ã®åä¸: å¿ è¦ãªãã¼ã¿ã®ã¿ãåå¾ã»æ´æ°ãããã¨ã§ãAPIã®ããã©ã¼ãã³ã¹ãåä¸ãã¾ãã
課é¡:
- ååæ§ã®æ¬ å¦: 親ãªã½ã¼ã¹ã¨ãµããªã½ã¼ã¹ãåæã«æ´æ°ãããã¨ãã§ããªãããããã¼ã¿ã®ä¸è²«æ§ãç¶æããããã®è¿½å ã®ä½æ¥ãå¿ è¦ã«ãªãå ´åãããã¾ãã
- è¤éæ§ã®å¢å : APIã®æ§é ãè¥å¹²è¤éã«ãªããã¯ã©ã¤ã¢ã³ãå´ã®å®è£ ãå°ãé£ãããªãå¯è½æ§ãããã¾ãã
ãããã®å©ç¹ã¨èª²é¡ãèæ ®ããªãããã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®é©ç¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨æ§è½: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãé©åã«å®è£ ãããã¨ã§ãAPIã®ã¹ã±ã¼ã©ããªãã£ã¨å ¨ä½çãªæ§è½ãåä¸ããããã¨ãã§ãã¾ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ãé »ç¹ã«æ´æ°ããããã¼ã¿ãæ±ãå ´åã«æå¹ã§ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã使ç¨ãããã¨ã§ãç¹å®ã®ãã¼ã¿ã«å¯¾ãã¦ããç´°ããã¢ã¯ã»ã¹å¶å¾¡ãå®è£ ã§ãã¾ããããã¯ãã»ãã¥ãªãã£è¦ä»¶ãå³ããç°å¢ã§ç¹ã«éè¦ã§ãã
ã·ã¹ãã ã®é²å: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ãã¿ã¼ã³ãæ¡ç¨ãããã¨ã§ãã·ã¹ãã ã®å°æ¥çãªæ¡å¼µãå¤æ´ã容æã«ãªãã¾ããæ°ããè¦ä»¶ãçºçããéã«ãæ¢åã®ãªã½ã¼ã¹æ§é ã大ããå¤æ´ãããã¨ãªããæ°ãããµããªã½ã¼ã¹ã追å ã§ãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®æ¦å¿µã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ãµã¼ãã¹éã®å¢çãå®ç¾©ããéã«ç¹ã«æç¨ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ãããã¡ã¤ã«ãµã¼ãã¹ã¨ä½ç½®æ å ±ãµã¼ãã¹ãåé¢ãã¤ã¤ã両è ã®é¢é£æ§ãç¶æãããã¨ãã§ãã¾ãã
éç¨æ§ã¨å¯è¦³æ¸¬æ§: ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã使ç¨ãããã¨ã§ãç¹å®ã®ãã¼ã¿ã®å¤æ´å±¥æ´ãæ´æ°é »åº¦ãç¬ç«ãã¦è¿½è·¡ãããããªãã¾ããããã«ãããã·ã¹ãã ã®éç¨æ§ã¨å¯è¦³æ¸¬æ§ãåä¸ãã¾ãã
çµè«
第12ç« ãSingleton sub-resourcesãã¯ãAPIã«ãããã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯ãç¹å®ã®ãã¼ã¿ã親ãªã½ã¼ã¹ããåé¢ãã¤ã¤ãå¼·ãé¢é£æ§ãç¶æããå¹æçãªæ¹æ³ã§ãã
Getï¼åå¾ï¼ã¨Updateï¼æ´æ°ï¼ã®ã¿ããµãã¼ãããä½æã¨åé¤ã¯è¦ªãªã½ã¼ã¹ã«ä¾åãã¾ãã
ã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã¯ã大è¦æ¨¡ãã¼ã¿ãé »ç¹ã«æ´æ°ããããã¼ã¿ãç¹å¥ãªã»ãã¥ãªãã£è¦ä»¶ãæã¤ãã¼ã¿ã®ç®¡çã«ç¹ã«æå¹ã§ãã
ãã®ãã¿ã¼ã³ãæ¡ç¨ããéã¯ããã¼ã¿ã®ä¸è²«æ§ç¶æãAPIè¤éæ§ã®å¢å ã¨ãã£ã課é¡ã«ã注æãæãå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããã·ã³ã°ã«ãã³ãµããªã½ã¼ã¹ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
13 Cross references
ãAPI Design Patternsãã®ç¬¬13ç« ãCross referencesãã¯ãAPIã«ããããªã½ã¼ã¹éã®åç §ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã½ã¼ã¹éã®åç §ãåãªãæè¡çãªå®è£ ã®è©³ç´°ã§ã¯ãªããAPIã®æè»æ§ãä¸è²«æ§ãããã¦é·æçãªä¿å®æ§ã«ç´æ¥å½±é¿ãä¸ããéè¦ãªè¨è¨ä¸ã®æ±ºå®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
ãªã½ã¼ã¹éåç §ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ããªã½ã¼ã¹éåç §ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¤ãã®APIã§ã¯ãè¤æ°ã®ãªã½ã¼ã¹ã¿ã¤ããåå¨ãããããã®ãªã½ã¼ã¹éã«é¢é£æ§ãããå ´åãå¤ã ããã¾ããä¾ãã°ãæ¸ç±ãªã½ã¼ã¹ã¨èè ãªã½ã¼ã¹ã®é¢ä¿ãªã©ãæãããã¾ãããããã®é¢é£æ§ãé©åã«è¡¨ç¾ãã管çãããã¨ããAPIã®ä½¿ããããã¨æè»æ§ãåä¸ãããä¸ã§éè¦ã§ãã
èè ã¯ããªã½ã¼ã¹éåç §ã®ç¯å²ã«ã¤ãã¦ã以ä¸ã®ããã«åé¡ãã¦ãã¾ãã
- ãã¼ã«ã«åç §ï¼åãAPIå ã®ä»ã®ãªã½ã¼ã¹ã¸ã®åç §
- ã°ãã¼ãã«åç §ï¼ã¤ã³ã¿ã¼ãããä¸ã®ä»ã®ãªã½ã¼ã¹ã¸ã®åç §
- ä¸éçåç §ï¼åããããã¤ãã¼ãæä¾ããç°ãªãAPIå ã®ãªã½ã¼ã¹ã¸ã®åç §
ãã®æ¦å¿µãè¦è¦çã«è¡¨ç¾ããããã«ãèè ã¯ä»¥ä¸ã®å³ãæ示ãã¦ãã¾ãã
ãã®å³ã¯ããªã½ã¼ã¹ãåãAPIå ã®ä»ã®ãªã½ã¼ã¹ãå¤é¨APIã®ãªã½ã¼ã¹ãããã¦ã¤ã³ã¿ã¼ãããä¸ã®ä»»æã®ãªã½ã¼ã¹ãåç §ã§ãããã¨ã示ãã¦ãã¾ããããã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ãµã¼ãã¹ã注æãµã¼ãã¹ãæ¯æããµã¼ãã¹ãªã©ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹éã§ãªã½ã¼ã¹ãç¸äºåç §ããå¿ è¦ãããå ´åã«ããã®æ¦å¿µãé©ç¨ããã¾ãã
èè ã¯ããªã½ã¼ã¹éåç §ã®åºæ¬çãªå®è£ ã¨ãã¦ãæåååã®ä¸æèå¥åã使ç¨ãããã¨ãææ¡ãã¦ãã¾ããããã«ãããåãAPIå ã®ãªã½ã¼ã¹ãç°ãªãAPIã®ãªã½ã¼ã¹ãããã«ã¯ã¤ã³ã¿ã¼ãããä¸ã®ä»»æã®ãªã½ã¼ã¹ãçµ±ä¸çã«åç §ãããã¨ãå¯è½ã«ãªãã¾ãã
ãªã½ã¼ã¹éåç §ã®å®è£
èè ã¯ããªã½ã¼ã¹éåç §ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
åç §ãã£ã¼ã«ãã®å½å: èè ã¯ãåç §ãã£ã¼ã«ãã®ååã«ãIdããµãã£ãã¯ã¹ãä»ãããã¨ãæ¨å¥¨ãã¦ãã¾ããä¾ãã°ã
Book
ãªã½ã¼ã¹ãAuthor
ãªã½ã¼ã¹ãåç §ããå ´åãåç §ãã£ã¼ã«ãã¯authorId
ã¨å½åãã¾ããããã«ããããã£ã¼ã«ãã®ç®çãæ確ã«ãªããAPIã®ä¸è²«æ§ãåä¸ãã¾ããåçãªã½ã¼ã¹ã¿ã¤ãã®åç §: åç §å ã®ãªã½ã¼ã¹ã¿ã¤ããåçã«å¤åããå ´åãèè ã¯è¿½å ã®
type
ãã£ã¼ã«ãã使ç¨ãããã¨ãææ¡ãã¦ãã¾ããããã«ãããç°ãªãã¿ã¤ãã®ãªã½ã¼ã¹ãæè»ã«åç §ã§ãã¾ãããã¼ã¿æ´åæ§: èè ã¯ãåç §ã®æ´åæ§ï¼ã¤ã¾ããåç §å ã®ãªã½ã¼ã¹ã常ã«åå¨ãããã¨ãä¿è¨¼ãããã¨ï¼ãç¶æãããã¨ã®é£ãããææãã¦ãã¾ãã代ããã«ãAPIã¯ã©ã¤ã¢ã³ããåç §ã®æå¹æ§ã確èªãã責任ãè² ãã¢ããã¼ããææ¡ãã¦ãã¾ãã
å¤vsåç §: èè ã¯ãåç §å ã®ãªã½ã¼ã¹ãã¼ã¿ãã³ãã¼ãã¦ä¿æãããï¼å¤æ¸¡ãï¼ãåã«åç §ãä¿æãããï¼åç §æ¸¡ãï¼ã®ãã¬ã¼ããªãã«ã¤ãã¦è°è«ãã¦ãã¾ããä¸è¬çã«ãåç §ã使ç¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ãããç¹å®ã®ç¶æ³ã§ã¯å¤ã®ã³ãã¼ãé©åãªå ´åããããã¨ãèªãã¦ãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãªã½ã¼ã¹éåç §ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type Book struct { ID string `json:"id"` Title string `json:"title"` AuthorID string `json:"authorId"` } type Author struct { ID string `json:"id"` Name string `json:"name"` } type ChangeLogEntry struct { ID string `json:"id"` TargetID string `json:"targetId"` TargetType string `json:"targetType"` Description string `json:"description"` }
ãã®å®è£
ã§ã¯ãBook
æ§é ä½ãAuthorID
ãã£ã¼ã«ããéãã¦Author
æ§é ä½ãåç
§ãã¦ãã¾ããã¾ããChangeLogEntry
æ§é ä½ã¯åçãªãªã½ã¼ã¹ã¿ã¤ããåç
§ã§ããããè¨è¨ããã¦ãã¾ãã
ãªã½ã¼ã¹éåç §ã®å©ç¹ã¨èª²é¡
èè ã¯ããªã½ã¼ã¹éåç §ã®å©ç¹ã¨èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãã
å©ç¹:
- æè»æ§: ãªã½ã¼ã¹éã®é¢ä¿ãæè»ã«è¡¨ç¾ã§ãã¾ãã
- ä¸è²«æ§: åç §ã®è¡¨ç¾æ¹æ³ãçµ±ä¸ãããAPIã®ä¸è²«æ§ãåä¸ãã¾ãã
- ã¹ã±ã¼ã©ããªãã£: 大è¦æ¨¡ãªã·ã¹ãã ã§ãããªã½ã¼ã¹éã®é¢ä¿ãå¹ççã«ç®¡çã§ãã¾ãã
課é¡:
- ãã¼ã¿æ´åæ§: åç §å ã®ãªã½ã¼ã¹ãåé¤ãããå ´åãç¡å¹ãªåç §ï¼ãã³ã°ãªã³ã°ãã¤ã³ã¿ï¼ãçºçããå¯è½æ§ãããã¾ãã
- ããã©ã¼ãã³ã¹: é¢é£ãããã¼ã¿ãåå¾ããããã«è¤æ°ã®APIå¼ã³åºããå¿ è¦ã«ãªãå ´åãããã¾ãã
- è¤éæ§: åçãªã½ã¼ã¹ã¿ã¤ãã®åç §ãªã©ãä¸é¨ã®å®è£ ã¯è¤éã«ãªãå¯è½æ§ãããã¾ãã
ãããã®å©ç¹ã¨èª²é¡ãèæ ®ããªããããªã½ã¼ã¹éåç §ã®é©ç¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: ãªã½ã¼ã¹éåç §ã®æ¦å¿µã¯ããã¤ã¯ããµã¼ãã¹éã§ã®ãã¼ã¿ã®é¢é£ä»ãã«ç´æ¥é©ç¨ã§ãã¾ããä¾ãã°ã注æãµã¼ãã¹ãã¦ã¼ã¶ã¼ãµã¼ãã¹ã®ã¦ã¼ã¶ã¼IDãåç §ããéã«ããã®è¨è¨ãã¿ã¼ã³ã使ç¨ã§ãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹: åç §ã使ç¨ãããã¨ã§ãåãªã½ã¼ã¹ãç¬ç«ãã¦ç®¡çã§ãããããã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ãåä¸ãã¾ãããã ããé¢é£ãã¼ã¿ã®åå¾ã«è¤æ°ã®APIå¼ã³åºããå¿ è¦ã«ãªãå¯è½æ§ããããããããã©ã¼ãã³ã¹ã¨ã®ãã©ã³ã¹ãåãå¿ è¦ãããã¾ãã
ãã¼ã¿æ´åæ§ã¨å¯ç¨æ§ã®ãã¬ã¼ããªã: å¼·åãªãã¼ã¿æ´åæ§ãç¶æãããã¨ããã¨ï¼ä¾ï¼åç §å ã®ãªã½ã¼ã¹ã®åé¤ãç¦æ¢ããï¼ãã·ã¹ãã ã®å¯ç¨æ§ãä½ä¸ããå¯è½æ§ãããã¾ããèè ã®ææ¡ãããç·©ãããªåç §ãã¢ããã¼ãã¯ãé«å¯ç¨æ§ãç¶æãã¤ã¤ãæ´åæ§ã®åé¡ãã¯ã©ã¤ã¢ã³ãå´ã§å¦çãã責任ãè² ããã¾ãã
APIã®é²åã¨å¾æ¹äºææ§: ãªã½ã¼ã¹éåç §ãé©åã«è¨è¨ãããã¨ã§ãAPIã®é²åã容æã«ãªãã¾ããæ°ãããªã½ã¼ã¹ã¿ã¤ãã®è¿½å ããæ¢åã®ãªã½ã¼ã¹æ§é ã®å¤æ´ããæ¢åã®åç §ã«å½±é¿ãä¸ãã«ãããªãã¾ãã
ç£è¦ã¨éç¨: ãªã½ã¼ã¹éåç §ã使ç¨ããå ´åãç¡å¹ãªåç §ã®çºçãç£è¦ããå¿ è¦ã«å¿ãã¦ä¿®æ£ããããã»ã¹ã確ç«ãããã¨ãéè¦ã§ããããã¯ãã·ã¹ãã ã®é·æçãªå¥å ¨æ§ãç¶æããä¸ã§éè¦ãªéç¨ã¿ã¹ã¯ã¨ãªãã¾ãã
çµè«
第13ç« ãCross referencesãã¯ãAPIã«ããããªã½ã¼ã¹éåç §ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ãä¸è²«æ§ãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãªã½ã¼ã¹éåç §ã¯ãåç´ãªæåååã®èå¥åã使ç¨ãã¦å®è£ ãã¹ãã§ãã
åç §ãã£ã¼ã«ãã®å½åã«ã¯ä¸è²«æ§ãéè¦ã§ããIdããµãã£ãã¯ã¹ã®ä½¿ç¨ãæ¨å¥¨ããã¾ãã
ãã¼ã¿æ´åæ§ã®ç¶æã¯é£ãããããã¯ã©ã¤ã¢ã³ãå´ã§åç §ã®æå¹æ§ã確èªãã責任ãæãããã¢ããã¼ããæ¨å¥¨ããã¾ãã
å¤ã®ã³ãã¼ãããåç §ã®ä½¿ç¨ãä¸è¬çã«æ¨å¥¨ããã¾ãããç¹å®ã®ç¶æ³ã§ã¯å¤ã®ã³ãã¼ãé©åãªå ´åãããã¾ãã
GraphQLãªã©ã®æè¡ãæ´»ç¨ãããã¨ã§ããªã½ã¼ã¹éåç §ã«é¢é£ããããã©ã¼ãã³ã¹ã®åé¡ã軽æ¸ã§ããå¯è½æ§ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ããªã½ã¼ã¹éåç §ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ãããªã½ã¼ã¹éåç §ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
14 Association resources
ãAPI Design Patternsãã®ç¬¬14ç« ãAssociation resourcesãã¯ãå¤å¯¾å¤ã®é¢ä¿ãæã¤ãªã½ã¼ã¹éã®é¢é£æ§ãæ±ãAPIãã¶ã¤ã³ãã¿ã¼ã³ã«ã¤ãã¦è©³ç´°ã«è§£èª¬ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯é¢é£ãªã½ã¼ã¹ã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦æ確ã«ç¤ºããAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªä¿å®æ§ã«ã©ã®ããã«å½±é¿ãããã説æãã¦ãã¾ãã
é¢é£ãªã½ã¼ã¹ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãå¤å¯¾å¤ã®é¢ä¿ãæã¤ãªã½ã¼ã¹ã®ç®¡çãAPIãã¶ã¤ã³ã«ããã¦éè¦ãªèª²é¡ã§ãããã¨ãææãã¦ãã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ã¨ã°ã«ã¼ãã®é¢ä¿ããå¦çã¨è¬åº§ã®é¢ä¿ãªã©ãå ¸åçãªä¾ã¨ãã¦æãããã¾ãããããã®é¢ä¿ãå¹æçã«è¡¨ç¾ã管çãããã¨ã¯ãAPIã®ä½¿ããããã¨æè»æ§ãåä¸ãããä¸ã§é常ã«éè¦ã§ãã
é¢é£ãªã½ã¼ã¹ã®æ¦å¿µã¯ããã¼ã¿ãã¼ã¹è¨è¨ã«ãããçµåãã¼ãã«ã«é¡ä¼¼ãã¦ãã¾ããAPIã®æèã§ã¯ããã®çµåãã¼ãã«ãç¬ç«ãããªã½ã¼ã¹ã¨ãã¦æ±ããã¨ã§ãé¢é£æ§ãã®ãã®ã«å¯¾ããæä½ã追å ã®ã¡ã¿ãã¼ã¿ã®ç®¡çãå¯è½ã«ãªãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ç®¡çãµã¼ãã¹ã¨ã°ã«ã¼ã管çãµã¼ãã¹ãå¥ã ã«åå¨ããå ´åããããã®éã®é¢ä¿ã管çããããã®ç¬ç«ãããµã¼ãã¹ãAPIã¨ã³ããã¤ã³ããå¿ è¦ã«ãªãã¾ããé¢é£ãªã½ã¼ã¹ã®ãã¿ã¼ã³ã¯ããã®ãããªè¤éãªé¢ä¿ãå¹æçã«ç®¡çããããã®å¼·åãªãã¼ã«ã¨ãªãã¾ãã
èè ã¯ãé¢é£ãªã½ã¼ã¹ã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
- ç¬ç«ãããªã½ã¼ã¹èå¥å
- é¢é£ãã両æ¹ã®ãªã½ã¼ã¹ã¸ã®åç §
- é¢é£æ§ã«é¢ãã追å ã®ã¡ã¿ãã¼ã¿ï¼å¿ è¦ã«å¿ãã¦ï¼
ãããã®è¦ç´ ãå«ãé¢é£ãªã½ã¼ã¹ã¯ãAPIã®ä¸ã§ç¬ç«ããã¨ã³ãã£ãã£ã¨ãã¦æ±ãããæ¨æºçãªCRUDæä½ã®å¯¾è±¡ã¨ãªãã¾ãã
é¢é£ãªã½ã¼ã¹ã®å®è£
èè ã¯ãé¢é£ãªã½ã¼ã¹ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
å½åè¦å: é¢é£ãªã½ã¼ã¹ã®ååã¯ãé¢é£ãã両æ¹ã®ãªã½ã¼ã¹ãåæ ãããã¹ãã§ããä¾ãã°ãã¦ã¼ã¶ã¼ã¨ã°ã«ã¼ãã®é¢é£ã§ããã°ãUserGroupãããGroupMembershipããªã©ãé©åã§ãã
æ¨æºã¡ã½ããã®ãµãã¼ã: é¢é£ãªã½ã¼ã¹ã¯é常ã®ãªã½ã¼ã¹ã¨åæ§ã«ãæ¨æºçãªCRUDæä½ï¼Create, Read, Update, Delete, Listï¼ããµãã¼ãããå¿ è¦ãããã¾ãã
ä¸ææ§å¶ç´: åããªã½ã¼ã¹ã®ãã¢ã«å¯¾ãã¦è¤æ°ã®é¢é£ãä½æãããã¨ãé²ããããä¸ææ§å¶ç´ãå®è£ ããå¿ è¦ãããã¾ãã
åç §æ´åæ§: é¢é£ãªã½ã¼ã¹ã¯ãåç §ãããªã½ã¼ã¹ã®åå¨ã«ä¾åãã¾ããèè ã¯ãåç §æ´åæ§ã®ç¶ææ¹æ³ã¨ãã¦ãå¶ç´ï¼é¢é£ãããªã½ã¼ã¹ãåå¨ããå ´åã®ã¿æä½ã許å¯ï¼ã¾ãã¯åç §ã®ç¡å¹åï¼é¢é£ãããªã½ã¼ã¹ãåé¤ãããå ´åã«é¢é£ãç¡å¹åããï¼ã®ã¢ããã¼ããææ¡ãã¦ãã¾ãã
ã¡ã¿ãã¼ã¿ã®ç®¡ç: é¢é£æ§ã«é¢ãã追å æ å ±ï¼ä¾ï¼ã¦ã¼ã¶ã¼ãã°ã«ã¼ãã«åå ããæ¥æããã¼ã«ãªã©ï¼ãä¿åããããã®ãã£ã¼ã«ããæä¾ãã¾ãã
ãããã®ååãé©ç¨ãããé¢é£ãªã½ã¼ã¹ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type UserGroupMembership struct { ID string `json:"id"` UserID string `json:"userId"` GroupID string `json:"groupId"` JoinedAt time.Time `json:"joinedAt"` Role string `json:"role"` } type UserGroupService interface { CreateMembership(ctx context.Context, membership *UserGroupMembership) (*UserGroupMembership, error) GetMembership(ctx context.Context, id string) (*UserGroupMembership, error) UpdateMembership(ctx context.Context, membership *UserGroupMembership) (*UserGroupMembership, error) DeleteMembership(ctx context.Context, id string) error ListMemberships(ctx context.Context, filter string) ([]*UserGroupMembership, error) }
ãã®å®è£
ä¾ã§ã¯ãUserGroupMembership
æ§é ä½ãé¢é£ãªã½ã¼ã¹ã表ç¾ããUserGroupService
ã¤ã³ã¿ã¼ãã§ã¼ã¹ãæ¨æºçãªCRUDæä½ãæä¾ãã¦ãã¾ãã
é¢é£ãªã½ã¼ã¹ã®å©ç¹ã¨èª²é¡
èè ã¯ãé¢é£ãªã½ã¼ã¹ã®ãã¿ã¼ã³ã®å©ç¹ã¨èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãã
å©ç¹:
- æè»æ§: é¢é£æ§ãã®ãã®ãç¬ç«ãããªã½ã¼ã¹ã¨ãã¦æ±ããã¨ã§ãé¢é£ã«å¯¾ãã詳細ãªæä½ãå¯è½ã«ãªãã¾ãã
- ã¡ã¿ãã¼ã¿ã®ç®¡ç: é¢é£æ§ã«é¢ãã追å æ å ±ã容æã«ç®¡çã§ãã¾ãã
- ã¹ã±ã¼ã©ããªãã£: 大è¦æ¨¡ãªã·ã¹ãã ã§ãããªã½ã¼ã¹éã®é¢ä¿ãå¹ççã«ç®¡çã§ãã¾ãã
課é¡:
- è¤éæ§ã®å¢å : APIã®æ§é ãè¥å¹²è¤éã«ãªããã¯ã©ã¤ã¢ã³ãå´ã®å®è£ ãå°ãé£ãããªãå¯è½æ§ãããã¾ãã
- ããã©ã¼ãã³ã¹: é¢é£ãã¼ã¿ãåå¾ããããã«è¿½å ã®APIå¼ã³åºããå¿ è¦ã«ãªãå ´åãããã¾ãã
- æ´åæ§ã®ç¶æ: åç §æ´åæ§ãç¶æããããã®è¿½å ã®ä»çµã¿ãå¿ è¦ã«ãªãã¾ãã
ãããã®å©ç¹ã¨èª²é¡ãèæ ®ããªãããé¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ã®é©ç¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: é¢é£ãªã½ã¼ã¹ã®ãã¿ã¼ã³ã¯ããã¤ã¯ããµã¼ãã¹éã®ãã¼ã¿ã®é¢é£ä»ãã«ç´æ¥é©ç¨ã§ãã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ãµã¼ãã¹ã¨ã°ã«ã¼ããµã¼ãã¹ã®éã®é¢ä¿ã管çããç¬ç«ãããµã¼ãã¹ã¨ãã¦å®è£ ãããã¨ãã§ãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹: é¢é£ãªã½ã¼ã¹ãç¬ç«ãã¦ç®¡çãããã¨ã§ãã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ãåä¸ãã¾ãããã ããé¢é£ãã¼ã¿ã®åå¾ã«è¿½å ã®APIå¼ã³åºããå¿ è¦ã«ãªãå¯è½æ§ããããããããã©ã¼ãã³ã¹ã¨ã®ãã©ã³ã¹ãåãå¿ è¦ãããã¾ãããã®ãã¬ã¼ããªãã管çããããã«ããã£ãã·ã³ã°æ¦ç¥ããããå¦çã®å°å ¥ãæ¤è¨ããå¿ è¦ãããã§ãããã
ãã¼ã¿æ´åæ§ã¨å¯ç¨æ§ã®ãã¬ã¼ããªã: åç §æ´åæ§ãå³å¯ã«ç¶æãããã¨ããã¨ãã·ã¹ãã ã®å¯ç¨æ§ãä½ä¸ããå¯è½æ§ãããã¾ããä¸æ¹ã§ãç·©ãããªæ´åæ§ã許容ããã¨ãç¡å¹ãªé¢é£ãä¸æçã«åå¨ããå¯è½æ§ãããã¾ãããã®ãã¬ã¼ããªããé©åã«ç®¡çããããã«ãéåæã®æ´åæ§ãã§ãã¯ãã¤ãã³ãé§ååã®ã¢ã¼ããã¯ãã£ã®å°å ¥ãæ¤è¨ãããã¨ãã§ãã¾ãã
APIã®é²åã¨å¾æ¹äºææ§: é¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ãæ¡ç¨ãããã¨ã§ãAPIã®é²åã容æã«ãªãã¾ããæ°ããã¿ã¤ãã®é¢é£ã追å ã®ã¡ã¿ãã¼ã¿ãå°å ¥ããéã«ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ãããã¨ãªãæ¡å¼µã§ãã¾ãã
ç£è¦ã¨éç¨: é¢é£ãªã½ã¼ã¹ã使ç¨ããå ´åãç¡å¹ãªé¢é£ã®çºçãç£è¦ããå¿ è¦ã«å¿ãã¦ä¿®æ£ããããã»ã¹ã確ç«ãããã¨ãéè¦ã§ããã¾ããé¢é£ãªã½ã¼ã¹ã®æ°ãå¢å ããå ´åã®ããã©ã¼ãã³ã¹ã®å½±é¿ããã¹ãã¬ã¼ã¸ã®ä½¿ç¨éãªã©ãç£è¦ããå¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: é¢é£ãªã½ã¼ã¹ã«å¯¾ããã¢ã¯ã»ã¹å¶å¾¡ãé©åã«è¨è¨ãããã¨ãéè¦ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ãã°ã«ã¼ãã®ã¡ã³ãã¼ã·ããã表示ãããå¤æ´ããããã権éããããç´°ããå¶å¾¡ããå¿ è¦ãããã¾ãã
ã¯ã¨ãªã®æé©å: é¢é£ãªã½ã¼ã¹ãå¹ççã«åå¾ããããã®ã¯ã¨ãªãã©ã¡ã¼ã¿ããã£ã«ã¿ãªã³ã°ãªãã·ã§ã³ãæä¾ãããã¨ãéè¦ã§ããä¾ãã°ãç¹å®ã®ã¦ã¼ã¶ã¼ãæå±ãããã¹ã¦ã®ã°ã«ã¼ããä¸åº¦ã«åå¾ãããããªæé©åãããã¨ã³ããã¤ã³ããæä¾ãããã¨ãæ¤è¨ã§ãã¾ãã
ãã«ã¯æä½ã®ãµãã¼ã: 大éã®é¢é£ãä¸åº¦ã«ä½æãæ´æ°ãåé¤ããå¿ è¦ãããå ´åããã«ã¯æä½ããµãã¼ããããã¨ã§å¹çæ§ãåä¸ããããã¨ãã§ãã¾ãã
ã¤ãã³ãé§åè¨è¨ã¨ã®çµ±å: é¢é£ãªã½ã¼ã¹ã®å¤æ´ï¼ä½æãæ´æ°ãåé¤ï¼ãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãä»ã®ãµã¼ãã¹ãã·ã¹ãã ã³ã³ãã¼ãã³ããé©åã«åå¿ããå ¨ä½çãªæ´åæ§ãç¶æãããã¨ãã§ãã¾ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³ã¨éçºè ã¨ã¯ã¹ããªã¨ã³ã¹: é¢é£ãªã½ã¼ã¹ã®æ¦å¿µã¨ä½¿ç¨æ¹æ³ãæ確ã«ããã¥ã¡ã³ãåããéçºè ããã®ãã¿ã¼ã³ãå¹æçã«å©ç¨ã§ããããã«ãããã¨ãéè¦ã§ããAPIå©ç¨è ãé¢é£ãªã½ã¼ã¹ãç°¡åã«ä½æã管çãã¯ã¨ãªã§ãããããªãã¼ã«ãSDKãæä¾ãããã¨ãæ¤è¨ãã¹ãã§ãã
çµè«
第14ç« ãAssociation resourcesãã¯ãå¤å¯¾å¤ã®é¢ä¿ãæã¤ãªã½ã¼ã¹éã®é¢é£æ§ã管çããããã®éè¦ãªãã¿ã¼ã³ãæä¾ãã¦ãã¾ãããã®ãã¿ã¼ã³ã¯ãAPIã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
é¢é£ãªã½ã¼ã¹ã¯ãå¤å¯¾å¤ã®é¢ä¿ãç¬ç«ããã¨ã³ãã£ãã£ã¨ãã¦æ±ããã¨ã§ãè¤éãªé¢ä¿ã®ç®¡çã容æã«ãã¾ãã
æ¨æºçãªCRUDæä½ããµãã¼ãããé¢é£æ§ã«é¢ãã追å ã®ã¡ã¿ãã¼ã¿ã管çã§ããããã«ãããã¨ãéè¦ã§ãã
ä¸ææ§å¶ç´ã¨åç §æ´åæ§ã®ç¶æã¯ãé¢é£ãªã½ã¼ã¹ã®è¨è¨ã«ããã¦éè¦ãªèæ ®äºé ã§ãã
ãã®ãã¿ã¼ã³ã¯æè»æ§ã¨æ¡å¼µæ§ãæä¾ãã¾ãããAPIã®è¤éæ§ã¨ããã©ã¼ãã³ã¹ã¸ã®å½±é¿ãæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ããã®ãã¿ã¼ã³ã¯ç¹ã«æç¨ã§ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ãç¾ä»£ã®è¤éãªåæ£ã·ã¹ãã ã«ãããå¹æçãªãã¼ã¿ç®¡çã¨é¢ä¿æ§ã®è¡¨ç¾ã«ç´æ¥çã«é©ç¨å¯è½ã§ãã
é¢é£ãªã½ã¼ã¹ã®ãã¿ã¼ã³ãæ¡ç¨ããéã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ä»ãã¦èããå¿ è¦ãããã¾ããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããé¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããã¾ãããã®ãã¿ã¼ã³ã¯ããã¸ãã¹ãã¸ãã¯ã®å¤æ´ãæ°ããè¦ä»¶ã®è¿½å ã«å¯¾ãã¦æè»ã«å¯¾å¿ã§ããåºç¤ãæä¾ãã¾ãã
æå¾ã«ãé¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ã®æ¡ç¨ã¯ãåãªãæè¡çãªæ±ºå®ã§ã¯ãªãããã¸ãã¹è¦ä»¶ã¨ã·ã¹ãã ã®é·æçãªç®æ¨ãèæ ®ããæ¦ç¥çãªé¸æã§ããã¹ãã§ããé©åã«å®è£ ãããé¢é£ãªã½ã¼ã¹ã¯ãè¤éãªãã¸ãã¹ã«ã¼ã«ãé¢ä¿æ§ãå¹æçã«è¡¨ç¾ããã·ã¹ãã ã®ä¾¡å¤ãé·æçã«é«ãããã¨ãã§ãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããã®å¼·åãªãã¿ã¼ã³ãç解ããé©åã«æ´»ç¨ãããã¨ã§ãããå ç¢ã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
15 Add and remove custom methods
ãAPI Design Patternsãã®ç¬¬15ç« ãAdd and remove custom methodsãã¯ãå¤å¯¾å¤ã®é¢ä¿ãæã¤ãªã½ã¼ã¹éã®é¢é£æ§ã管çããããã®ä»£æ¿ãã¿ã¼ã³ã«ã¤ãã¦è©³ç´°ã«è§£èª¬ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ã«ã¹ã¿ã ã®addããã³removeã¡ã½ããã使ç¨ãã¦ãé¢é£ãªã½ã¼ã¹ãå°å ¥ããã«å¤å¯¾å¤ã®é¢ä¿ã管çããæ¹æ³ã¨ãã®ãã¬ã¼ããªãã«ã¤ãã¦æ確ã«ç¤ºãã¦ãã¾ãã
åæ©ã¨æ¦è¦
èè ã¯ãåç« ã§ç´¹ä»ããé¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ãæè»æ§ãé«ãä¸æ¹ã§ãè¤éããå¢ããã¨ãææãã¦ãã¾ããããã§ãããåç´ãªã¢ããã¼ãã¨ãã¦ãã«ã¹ã¿ã ã®addããã³removeã¡ã½ããã使ç¨ããæ¹æ³ãææ¡ãã¦ãã¾ãããã®ãã¿ã¼ã³ã¯ãé¢ä¿æ§ã«é¢ããã¡ã¿ãã¼ã¿ãä¿åããå¿ è¦ããªãå ´åããAPIã®è¤éããæãããå ´åã«ç¹ã«æå¹ã§ãã
ãã®ã¢ããã¼ãã®æ ¸å¿ã¯ããªã½ã¼ã¹éã®é¢ä¿æ§ã管çããããã®å°ç¨ã®ãªã½ã¼ã¹ï¼é¢é£ãªã½ã¼ã¹ï¼ãä½æããã代ããã«æ¢åã®ãªã½ã¼ã¹ã«å¯¾ãã¦addã¨removeã®æä½ãè¡ããã¨ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ã¨ã°ã«ã¼ãã®é¢ä¿ã管çããå ´åãAddGroupUser
ãRemoveGroupUser
ã¨ãã£ãã¡ã½ããã使ç¨ãã¾ãã
ãã®è¨è¨ãã¿ã¼ã³ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ç¹ã«èå³æ·±ãå¿ç¨ãèãããã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ç®¡çãµã¼ãã¹ã¨ã°ã«ã¼ã管çãµã¼ãã¹ãåé¢ããã¦ããç°å¢ã§ããããã®ãµã¼ãã¹éã®é¢ä¿æ§ãç°¡æ½ã«ç®¡çããæ¹æ³ã¨ãã¦æ´»ç¨ã§ãã¾ãããã®ãã¿ã¼ã³ãæ¡ç¨ãããã¨ã§ããµã¼ãã¹éã®çµå度ãä½ãä¿ã¡ã¤ã¤ãå¿ è¦ãªé¢ä¿æ§ãå¹ççã«ç®¡çãããã¨ãå¯è½ã«ãªãã¾ãã
èè ã¯ããã®ãã¿ã¼ã³ã®ä¸»ãªå¶éäºé ã¨ãã¦ä»¥ä¸ã®2ç¹ãæãã¦ãã¾ãã
- é¢ä¿æ§ã«é¢ããã¡ã¿ãã¼ã¿ãä¿åã§ããªã
- ãªã½ã¼ã¹éã®é¢ä¿æ§ã«æ¹åæ§ãçã¾ããï¼ç®¡çãããªã½ã¼ã¹ã¨ç®¡çããããªã½ã¼ã¹ãæ確ã«åãããï¼
ãããã®å¶éã¯ãã·ã¹ãã ã®è¨è¨ã¨å®è£ ã«å¤§ããªå½±é¿ãä¸ããå¯è½æ§ããããããæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
å®è£ ã®è©³ç´°
èè ã¯ãaddããã³removeã«ã¹ã¿ã ã¡ã½ããã®å®è£ ã«ã¤ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
ã¡ã½ããåã®è¦å:
Add<Managing-Resource><Associated-Resource>
ããã³Remove<Managing-Resource><Associated-Resource>
ã®å½¢å¼ã使ç¨ãã¾ããä¾ãã°ãAddGroupUser
ãRemoveGroupUser
ã¨ãã£ãå ·åã§ãããªã¯ã¨ã¹ãã®æ§é : ãããã®ã¡ã½ããã¯ã管çãããªã½ã¼ã¹ï¼è¦ªãªã½ã¼ã¹ï¼ã¨é¢é£ä»ãããªã½ã¼ã¹ã®IDãå«ããªã¯ã¨ã¹ããåãåãã¾ãã
é¢é£ãªã½ã¼ã¹ã®ä¸è¦§åå¾: é¢é£ä»ãããããªã½ã¼ã¹ã®ä¸è¦§ãåå¾ããããã«ãã«ã¹ã¿ã ã®ãªã¹ãã¡ã½ãããæä¾ãã¾ããä¾ãã°ã
ListGroupUsers
ãListUserGroups
ã¨ãã£ãã¡ã½ããã§ãããã¼ã¿ã®æ´åæ§: éè¤ããé¢é£ä»ããåå¨ããªãé¢é£ã®åé¤ã¨ãã£ãæä½ã«å¯¾ãã¦ãé©åãªã¨ã©ã¼ãã³ããªã³ã°ãå®è£ ããå¿ è¦ãããã¾ãã
ãããã®ååãé©ç¨ããå®è£ ä¾ããGolangãç¨ãã¦ç¤ºãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
type GroupService interface { AddGroupUser(ctx context.Context, groupID, userID string) error RemoveGroupUser(ctx context.Context, groupID, userID string) error ListGroupUsers(ctx context.Context, groupID string, pageToken string, pageSize int) ([]*User, string, error) ListUserGroups(ctx context.Context, userID string, pageToken string, pageSize int) ([]*Group, string, error) } func (s *groupService) AddGroupUser(ctx context.Context, groupID, userID string) error { // å®è£ ã®è©³ç´°... // éè¤ãã§ãã¯ãåå¨ãã§ãã¯ããã¼ã¿ãã¼ã¹æä½ãªã© return nil } func (s *groupService) RemoveGroupUser(ctx context.Context, groupID, userID string) error { // å®è£ ã®è©³ç´°... // åå¨ãã§ãã¯ããã¼ã¿ãã¼ã¹æä½ãªã© return nil } func (s *groupService) ListGroupUsers(ctx context.Context, groupID string, pageToken string, pageSize int) ([]*User, string, error) { // å®è£ ã®è©³ç´°... // ãã¼ã¸ãã¼ã·ã§ã³å¦çããã¼ã¿ãã¼ã¹ã¯ã¨ãªãªã© return users, nextPageToken, nil }
ãã®å®è£
ä¾ã§ã¯ãGroupService
ã¤ã³ã¿ã¼ãã§ã¼ã¹ãaddã¨removeã®ã«ã¹ã¿ã ã¡ã½ãããããã³é¢é£ãªã½ã¼ã¹ã®ä¸è¦§ãåå¾ããããã®ã¡ã½ãããå®ç¾©ãã¦ãã¾ãããããã®ã¡ã½ããã¯ãã°ã«ã¼ãã¨ã¦ã¼ã¶ã¼éã®é¢ä¿æ§ã管çããããã®åºæ¬çãªæä½ãæä¾ãã¾ãã
å©ç¹ã¨èª²é¡
èè ã¯ããã®ãã¿ã¼ã³ã®ä¸»ãªå©ç¹ã¨èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãã
å©ç¹:
- ã·ã³ãã«ã: é¢é£ãªã½ã¼ã¹ãå°å ¥ããã«å¤å¯¾å¤ã®é¢ä¿ã管çã§ãããããAPIã®æ§é ãã·ã³ãã«ã«ãªãã¾ãã
- å®è£ ã®å®¹æã: æ¢åã®ãªã½ã¼ã¹ã«å¯¾ããã«ã¹ã¿ã ã¡ã½ããã¨ãã¦å®è£ ã§ãããããæ°ãããªã½ã¼ã¹ã¿ã¤ããå°å ¥ããå¿ è¦ãããã¾ããã
- ããã©ã¼ãã³ã¹: é¢é£ãªã½ã¼ã¹ãä»ããã«ç´æ¥æä½ã§ãããããç¹å®ã®ã·ããªãªã§ã¯ããã©ã¼ãã³ã¹ãåä¸ããå¯è½æ§ãããã¾ãã
課é¡:
- ã¡ã¿ãã¼ã¿ã®å¶é: é¢ä¿æ§ã«é¢ãã追å ã®ã¡ã¿ãã¼ã¿ï¼ä¾ï¼é¢é£ä»ããããæ¥æãé¢é£ã®ç¨®é¡ãªã©ï¼ãä¿åã§ãã¾ããã
- æ¹åæ§ã®å¶ç´: ãªã½ã¼ã¹éã®é¢ä¿ã«æ確ãªæ¹åæ§ãçã¾ãããããä¸é¨ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ç´æçã§ãªãè¨è¨ã«ãªãå¯è½æ§ãããã¾ãã
- æè»æ§ã®ä½ä¸: é¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ã¨æ¯è¼ãã¦ãé¢ä¿æ§ã®è¡¨ç¾ãæä½ã®æè»æ§ãä½ä¸ãã¾ãã
ãããã®å©ç¹ã¨èª²é¡ãèæ ®ããªãããã·ã¹ãã ã®è¦ä»¶ã«å¿ãã¦ãã®ãã¿ã¼ã³ã®é©ç¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹: addã¨removeã«ã¹ã¿ã ã¡ã½ããã使ç¨ãããã¨ã§ãç¹å®ã®ã·ããªãªã§ã¯ã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹ãåä¸ããå¯è½æ§ãããã¾ããä¾ãã°ã大è¦æ¨¡ãªã½ã¼ã·ã£ã«ãããã¯ã¼ã¯ã¢ããªã±ã¼ã·ã§ã³ã§ãã¦ã¼ã¶ã¼éã®ãã©ãã¼é¢ä¿ã管çããå ´åããã®ãã¿ã¼ã³ã使ç¨ãããã¨ã§ãé¢é£ãªã½ã¼ã¹ãä»ããã«ç´æ¥çãã¤å¹ççã«é¢ä¿æ§ãæä½ã§ãã¾ãã
éç¨ã®ç°¡ç´ å: ãã®ãã¿ã¼ã³ãæ¡ç¨ãããã¨ã§ãé¢é£ãªã½ã¼ã¹ã®ç®¡çãä¸è¦ã«ãªããããã·ã¹ãã ã®éç¨ãç°¡ç´ åãããå¯è½æ§ãããã¾ããä¾ãã°ããã¼ã¿ãã¼ã¹ã®ã¹ãã¼ããã·ã³ãã«ã«ãªãããã¤ã°ã¬ã¼ã·ã§ã³ãããã¯ã¢ããã®è¤éãã軽æ¸ããã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: ãã®ãã¿ã¼ã³ã¯ããã¤ã¯ããµã¼ãã¹éã®é¢ä¿æ§ã管çããéã«ç¹ã«æç¨ã§ããä¾ãã°ãã¦ã¼ã¶ã¼ãµã¼ãã¹ã¨ã³ã³ãã³ããµã¼ãã¹ãåé¢ããã¦ããç°å¢ã§ãã¦ã¼ã¶ã¼ãã³ã³ãã³ãã«ããããããã¤ããæ©è½ãå®è£ ããå ´åããã®ãã¿ã¼ã³ã使ç¨ãããã¨ã§ããµã¼ãã¹éã®çµå度ãä½ãä¿ã¡ã¤ã¤ãå¿ è¦ãªé¢ä¿æ§ãå¹ççã«ç®¡çãããã¨ãã§ãã¾ãã
APIé²åã®å®¹æã: é¢é£ãªã½ã¼ã¹ãå°å ¥ããã«é¢ä¿æ§ã管çã§ãããããAPIã®é²åã容æã«ãªãå¯è½æ§ãããã¾ããæ°ãã種é¡ã®é¢ä¿æ§ã追å ããéã«ãæ¢åã®ãªã½ã¼ã¹ã«æ°ããã«ã¹ã¿ã ã¡ã½ããã追å ããã ãã§å¯¾å¿ã§ãã¾ãã
ç£è¦ã¨å¯è¦³æ¸¬æ§: addã¨removeã®æä½ãæ示çãªã¡ã½ããã¨ãã¦å®ç¾©ããã¦ããããããããã®æä½ã®é »åº¦ãæ§è½ãç´æ¥çã«ç£è¦ãããããªãã¾ããããã«ãããã·ã¹ãã ã®æåãããç´°ããææ¡ããæé©åã®æ©ä¼ãè¦åºããã¨ãã§ãã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ã«ã¹ã¿ã ã¡ã½ããã使ç¨ãããã¨ã§ãé¢ä¿æ§ã®æä½ã«å¯¾ããç´°ããªã¢ã¯ã»ã¹å¶å¾¡ãå®è£ ãããããªãã¾ããä¾ãã°ãç¹å®ã®ã¦ã¼ã¶ã¼ã°ã«ã¼ãã®ã¿ãã°ã«ã¼ãã«ã¡ã³ãã¼ã追å ã§ããããã«ããã¨ãã£ãå¶å¾¡ã容æã«ãªãã¾ãã
ãããå¦çã¨ãã«ã¯æä½: ãã®ãã¿ã¼ã³ã¯ã大éã®é¢ä¿æ§ãä¸åº¦ã«æä½ããå¿ è¦ãããå ´åã«ãé©ãã¦ãã¾ããä¾ãã°ã
AddGroupUsers
ãRemoveGroupUsers
ã¨ãã£ããã«ã¯æä½ç¨ã®ã¡ã½ããã追å ãããã¨ã§ãå¹ççãªå¦çãå¯è½ã«ãªãã¾ããã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®çµ±å: addãremoveæä½ãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®åå¿æ§ã¨æè»æ§ãåä¸ããããã¨ãã§ãã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ãã°ã«ã¼ãã«è¿½å ãããã¨ãã«ãéç¥ãµã¼ãã¹ã権é管çãµã¼ãã¹ã«ã¤ãã³ããçºè¡ããé©åãªã¢ã¯ã·ã§ã³ãèµ·ãããã¨ãã§ãã¾ãã
çµè«
第15ç« ãAdd and remove custom methodsãã¯ãå¤å¯¾å¤ã®é¢ä¿ã管çããããã®ä»£æ¿ãã¿ã¼ã³ã¨ãã¦ãã«ã¹ã¿ã ã®addããã³removeã¡ã½ããã®ä½¿ç¨ãææ¡ãã¦ãã¾ãããã®ãã¿ã¼ã³ã¯ãAPIã®è¤éããæãã¤ã¤ãå¹ççã«é¢ä¿æ§ã管çãããå ´åã«ç¹ã«æå¹ã§ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã®ãã¿ã¼ã³ã¯ãé¢é£ãªã½ã¼ã¹ãå°å ¥ããã«å¤å¯¾å¤ã®é¢ä¿ã管çã§ãããããAPIã®æ§é ãã·ã³ãã«ã«ä¿ã¤ãã¨ãã§ãã¾ãã
addã¨removeã®ã«ã¹ã¿ã ã¡ã½ããã使ç¨ãããã¨ã§ãé¢ä¿æ§ã®æä½ãæ示çãã¤ç´æçã«ãªãã¾ãã
é¢ä¿æ§ã«é¢ããã¡ã¿ãã¼ã¿ãä¿åã§ããªãã¨ããå¶éããããããé©ç¨ããåã«ã¦ã¼ã¹ã±ã¼ã¹ãæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ãã®ãã¿ã¼ã³ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§ãé«ããå¹ççãªã·ã¹ãã è¨è¨ãå¯è½ã«ãã¾ãã
éç¨ã®ç°¡ç´ åãç£è¦ã®å®¹æããã»ãã¥ãªãã£å¶å¾¡ã®æè»æ§ãªã©ãã·ã¹ãã å ¨ä½ã®ç®¡çæ§åä¸ã«ãè²¢ç®ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ãç¾ä»£ã®è¤éãªåæ£ã·ã¹ãã ã«ãããå¹æçãªãã¼ã¿ç®¡çã¨é¢ä¿æ§ã®è¡¨ç¾ã«ç´æ¥çã«é©ç¨å¯è½ã§ãã
ãã ãããã®ãã¿ã¼ã³ã®æ¡ç¨ãæ¤è¨ããéã¯ãã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãæ éã«è©ä¾¡ããå¿ è¦ãããã¾ããé¢ä¿æ§ã«é¢ããã¡ã¿ãã¼ã¿ãéè¦ã§ããå ´åãããªã½ã¼ã¹éã®é¢ä¿ã«æ確ãªæ¹åæ§ãæãããããªãå ´åã¯ãåç« ã§ç´¹ä»ãããé¢é£ãªã½ã¼ã¹ãã¿ã¼ã³ã®æ¹ãé©ãã¦ããå¯è½æ§ãããã¾ãã
æå¾ã«ãAPIè¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããaddã¨removeã«ã¹ã¿ã ã¡ã½ããã®ãã¿ã¼ã³ãæ¡ç¨ããéã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã©ã®ããã«è²¢ç®ãããã常ã«èæ ®ããå¿ è¦ãããã¾ããé©åã«å®è£ ããããã®ãã¿ã¼ã³ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ãããå¼·åãªãã¼ã«ã¨ãªãã¾ãã
APIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããã®ãã¿ã¼ã³ã®å©ç¹ã¨å¶éãååã«ç解ããããã¸ã§ã¯ãã®è¦ä»¶ã«å¿ãã¦é©åã«é©ç¨ãããã¨ã§ãããå ç¢ã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ããããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ããã®ãã¿ã¼ã³ã¯è¤éãªé¢ä¿æ§ãå¹ççã«ç®¡çããããã®å¼·åãªé¸æè¢ã¨ãªãå¾ã¾ãã
16 Polymorphism
ãAPI Design Patternsãã®ç¬¬16ç« ãPolymorphismãã¯ãAPIã«ãããããªã¢ã¼ãã£ãºã ã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã®å¼·åãªæ¦å¿µã§ããããªã¢ã¼ãã£ãºã ãAPIãã¶ã¤ã³ã«é©ç¨ããæ¹æ³ã¨ããããAPIã®æè»æ§ãä¿å®æ§ãããã¦é·æçãªé²åå¯è½æ§ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ããªã¢ã¼ãã£ãºã ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ããªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ï¼OOPï¼ã«ãããããªã¢ã¼ãã£ãºã ã®æ¦å¿µããè°è«ãå§ãã¦ãã¾ããããªã¢ã¼ãã£ãºã ã¯ãç°ãªãå ·ä½çãªåã«å¯¾ãã¦å ±éã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã使ç¨ããè½åãæä¾ããç¹å®ã®åã¨å¯¾è©±ããéã«ç解ããå¿ è¦ãããå®è£ ã®è©³ç´°ãæå°éã«æãã¾ããèè ã¯ããã®å¼·åãªæ¦å¿µããªãã¸ã§ã¯ãæåããã°ã©ãã³ã°ã®ä¸çãããªã½ã¼ã¹æåã®APIãã¶ã¤ã³ã®ä¸çã«ç¿»è¨³ããæ¹æ³ãæ¢æ±ãã¦ãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãã¡ãã»ã¼ã¸ã³ã°ãµã¼ãã¹ãèãã¦ã¿ã¾ããããããã¹ãã¡ãã»ã¼ã¸ãç»åã¡ãã»ã¼ã¸ãé³å£°ã¡ãã»ã¼ã¸ãªã©ãæ§ã ãªç¨®é¡ã®ã¡ãã»ã¼ã¸ãåå¨ããå¯è½æ§ãããã¾ãããããã®ã¡ãã»ã¼ã¸ã¿ã¤ãã¯å ±éã®ç¹æ§ï¼éä¿¡è ãã¿ã¤ã ã¹ã¿ã³ããªã©ï¼ãæã¡ãªãããããããåºæã®å±æ§ï¼ããã¹ãå 容ãç»åURLãé³å£°ãã¡ã¤ã«ã®é·ããªã©ï¼ãæã£ã¦ãã¾ãã
ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã使ç¨ãããã¨ã§ããããã®ç°ãªãã¡ãã»ã¼ã¸ã¿ã¤ããåä¸ã®Message
ãªã½ã¼ã¹ã¨ãã¦æ±ããå
±éã®æä½ï¼ä½æãåå¾ãä¸è¦§è¡¨ç¤ºãªã©ï¼ãæä¾ãã¤ã¤ãåã¿ã¤ãã«åºæã®å±æ§ãæ¯ãèããç¶æãããã¨ãã§ãã¾ããããã«ãããAPIã®ä¸è²«æ§ãåä¸ããã¯ã©ã¤ã¢ã³ãã®å®è£
ãç°¡ç´ åããã¾ãã
èè ã¯ãããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
- ä¸æã®èå¥å
- ãªã½ã¼ã¹ã®ã¿ã¤ãã示ãæ示çãªãã£ã¼ã«ã
- å ±éã®å±æ§
- ã¿ã¤ãåºæã®å±æ§
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ãAPIã¯æè»ã§æ¡å¼µå¯è½ãªãªã½ã¼ã¹è¡¨ç¾ãæä¾ãããã¨ãã§ãã¾ãã
ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®å®è£
èè ã¯ãããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
ã¿ã¤ããã£ã¼ã«ãã®å®ç¾©: ãªã½ã¼ã¹ã®ã¿ã¤ãã示ããã£ã¼ã«ãã¯ãåç´ãªæååã¨ãã¦å®è£ ãããã¨ãæ¨å¥¨ããã¦ãã¾ããããã«ãããæ°ããã¿ã¤ãã®è¿½å ã容æã«ãªãã¾ãã
ãã¼ã¿æ§é : ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã¯ããã¹ã¦ã®ãµãã¿ã¤ãã®å±æ§ãã«ãã¼ããã¹ã¼ãã¼ã»ããã¨ãã¦è¨è¨ããã¾ããããã«ãããåã¿ã¤ãã«åºæã®å±æ§ãæè»ã«æ±ããã¨ãã§ãã¾ãã
ããªãã¼ã·ã§ã³: ã¿ã¤ãã«å¿ãã¦ç°ãªãããªãã¼ã·ã§ã³ã«ã¼ã«ãé©ç¨ããå¿ è¦ãããã¾ããä¾ãã°ãããã¹ãã¡ãã»ã¼ã¸ã¨ç»åã¡ãã»ã¼ã¸ã§ã¯ãcontentãã£ã¼ã«ãã®æå¹ãªå¤ãç°ãªãã¾ãã
æ¨æºã¡ã½ããã®å®è£ : ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã«å¯¾ããæ¨æºçãªCRUDæä½ã¯ãé常ã®ãªã½ã¼ã¹ã¨åæ§ã«å®è£ ããã¾ãããã¿ã¤ãã«å¿ãã¦ç°ãªãæ¯ãèããæã¤å¯è½æ§ãããã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type MessageType string const ( TextMessage MessageType = "text" ImageMessage MessageType = "image" AudioMessage MessageType = "audio" ) type Message struct { ID string `json:"id"` Type MessageType `json:"type"` Sender string `json:"sender"` Timestamp time.Time `json:"timestamp"` Content interface{} `json:"content"` } type TextContent struct { Text string `json:"text"` } type ImageContent struct { URL string `json:"url"` Width int `json:"width"` Height int `json:"height"` } type AudioContent struct { URL string `json:"url"` Duration float64 `json:"duration"` } func (m *Message) Validate() error { switch m.Type { case TextMessage: if _, ok := m.Content.(TextContent); !ok { return errors.New("invalid content for text message") } case ImageMessage: if _, ok := m.Content.(ImageContent); !ok { return errors.New("invalid content for image message") } case AudioMessage: if _, ok := m.Content.(AudioContent); !ok { return errors.New("invalid content for audio message") } default: return errors.New("unknown message type") } return nil }
ãã®å®è£
ä¾ã§ã¯ãMessage
æ§é ä½ãããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã表ç¾ããContent
ãã£ã¼ã«ããinterface{}
åã使ç¨ãããã¨ã§ãç°ãªãã¿ã¤ãã®ã³ã³ãã³ããæè»ã«æ±ããããã«ãªã£ã¦ãã¾ããValidate
ã¡ã½ããã¯ãã¡ãã»ã¼ã¸ã¿ã¤ãã«å¿ãã¦é©åãªããªãã¼ã·ã§ã³ãè¡ãã¾ãã
ããªã¢ã¼ãã£ãºã ã®å©ç¹ã¨èª²é¡
èè ã¯ãAPIã«ãããããªã¢ã¼ãã£ãºã ã®å©ç¹ã¨èª²é¡ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãã
å©ç¹:
- æè»æ§: æ°ãããªã½ã¼ã¹ã¿ã¤ãã追å ããéã«ãæ¢åã®APIã¡ã½ãããå¤æ´ããå¿ è¦ãããã¾ããã
- ä¸è²«æ§: å ±éã®æä½ãåä¸ã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§æä¾ãããã¨ã§ãAPIã®ä¸è²«æ§ãåä¸ãã¾ãã
- ã¯ã©ã¤ã¢ã³ãã®ç°¡ç´ å: ã¯ã©ã¤ã¢ã³ãã¯ãç°ãªãã¿ã¤ãã®ãªã½ã¼ã¹ãçµ±ä¸çã«æ±ããã¨ãã§ãã¾ãã
課é¡:
- è¤éæ§ã®å¢å : ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®è¨è¨ã¨å®è£ ã¯ãåä¸ã¿ã¤ãã®ãªã½ã¼ã¹ãããè¤éã«ãªãå¯è½æ§ãããã¾ãã
- ããã©ã¼ãã³ã¹: ã¿ã¤ãã«å¿ããå¦çãå¿ è¦ãªãããä¸é¨ã®ã±ã¼ã¹ã§ããã©ã¼ãã³ã¹ãä½ä¸ããå¯è½æ§ãããã¾ãã
- ãã¼ã¸ã§ãã³ã°ã®é£ãã: æ°ããã¿ã¤ãã®è¿½å ãæ¢åã¿ã¤ãã®å¤æ´ããæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ãã
ãããã®å©ç¹ã¨èª²é¡ãèæ ®ããªãããããªã¢ã¼ãã£ãºã ã®é©ç¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã¯ããã¤ã¯ããµã¼ãã¹éã§ã®ãã¼ã¿ã®ä¸è²«ãã表ç¾ã«å½¹ç«ã¡ã¾ããä¾ãã°ãéç¥ãµã¼ãã¹ãæ§ã ãªç¨®é¡ã®éç¥ï¼ã¡ã¼ã«ãããã·ã¥éç¥ãSMSãªã©ï¼ãçµ±ä¸çã«æ±ãå ´åã«æç¨ã§ãã
ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹: ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ãé©åã«è¨è¨ãããã¨ã§ãæ°ãããªã½ã¼ã¹ã¿ã¤ãã®è¿½å ã容æã«ãªããã·ã¹ãã ã®æ¡å¼µæ§ãåä¸ãã¾ãããã ããã¿ã¤ããã§ãã¯ãããªãã¼ã·ã§ã³ã®ãªã¼ãã¼ãããã«æ³¨æãå¿ è¦ã§ãã
éç¨ã®ç°¡ç´ å: å ±éã®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã使ç¨ãããã¨ã§ãç£è¦ããã°è¨é²ããããã°ãªã©ã®éç¨ã¿ã¹ã¯ãç°¡ç´ åãããå¯è½æ§ãããã¾ããä¾ãã°ããã¹ã¦ã®ã¡ãã»ã¼ã¸ã¿ã¤ãã«å¯¾ãã¦çµ±ä¸çãªãã°ãã©ã¼ãããã使ç¨ã§ãã¾ãã
APIã®é²åã¨å¾æ¹äºææ§: ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã使ç¨ãããã¨ã§ãæ°ãããªã½ã¼ã¹ã¿ã¤ãã®è¿½å ã容æã«ãªãã¾ãããã ããæ¢åã®ã¿ã¤ããå¤æ´ããéã¯ãå¾æ¹äºææ§ã«åå注æãæãå¿ è¦ãããã¾ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³ã¨éçºè ã¨ã¯ã¹ããªã¨ã³ã¹: ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®æ¦å¿µã¨ä½¿ç¨æ¹æ³ãæ確ã«ããã¥ã¡ã³ãåããéçºè ããã®ãã¿ã¼ã³ãå¹æçã«å©ç¨ã§ããããã«ãããã¨ãéè¦ã§ãã
ããªãã¼ã·ã§ã³ã¨ã¨ã©ã¼ãã³ããªã³ã°: ã¿ã¤ãã«å¿ããé©åãªããªãã¼ã·ã§ã³ãå®è£ ããã¨ã©ã¼ã¡ãã»ã¼ã¸ãæ確ã«å®ç¾©ãããã¨ãéè¦ã§ããããã«ãããAPIã®ä¿¡é ¼æ§ã¨ä½¿ãããããåä¸ãã¾ãã
ãã£ãã·ã³ã°æ¦ç¥: ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®ãã£ãã·ã³ã°ã¯è¤éã«ãªãå¯è½æ§ãããã¾ããã¿ã¤ãã«å¿ãã¦ç°ãªããã£ãã·ã¥æ¦ç¥ãé©ç¨ãããã¨ãæ¤è¨ããå¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ç°ãªãã¿ã¤ãã®ãªã½ã¼ã¹ã«å¯¾ãã¦ãé©åãªã¢ã¯ã»ã¹å¶å¾¡ãå®è£ ãããã¨ãéè¦ã§ããä¾ãã°ãç¹å®ã®ã¦ã¼ã¶ã¼ãç¹å®ã®ã¿ã¤ãã®ã¡ãã»ã¼ã¸ã®ã¿ãä½æã§ããããã«ããå ´åãªã©ã§ãã
ããªã¢ã¼ãã£ãã¯ã¡ã½ããã®åé¿
èè ã¯ãããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®ä½¿ç¨ãæ¨å¥¨ããä¸æ¹ã§ãããªã¢ã¼ãã£ãã¯ã¡ã½ããï¼è¤æ°ã®ç°ãªããªã½ã¼ã¹ã¿ã¤ãã§åä½ããåä¸ã®APIã¡ã½ããï¼ã®ä½¿ç¨ãå¼·ãè¦åãã¦ãã¾ããããã¯é常ã«éè¦ãªææã§ãã
ããªã¢ã¼ãã£ãã¯ã¡ã½ããã¯ãä¸è¦ããã¨ä¾¿å©ã«è¦ãã¾ãããé·æçã«ã¯å¤ãã®åé¡ãå¼ãèµ·ããå¯è½æ§ãããã¾ãã
æè»æ§ã®æ¬ å¦: ç°ãªããªã½ã¼ã¹ã¿ã¤ããå°æ¥çã«ç°ãªãæ¯ãèããå¿ è¦ã¨ããå¯è½æ§ãããã¾ããããªã¢ã¼ãã£ãã¯ã¡ã½ããã¯ãã®æè»æ§ãå¶éãã¾ãã
è¤éæ§ã®å¢å : ã¡ã½ããå ã§å¤ãã®æ¡ä»¶åå²ãå¿ è¦ã«ãªããã³ã¼ãã®è¤éæ§ãå¢å ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã®é£ãã: ä¸é¨ã®ãªã½ã¼ã¹ã¿ã¤ãã«å¯¾ãã¦ã®ã¿å¤æ´ãå ãããå ´åãæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ããã«ãããè¡ããã¨ãå°é£ã«ãªãã¾ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³ã®è¤éã: æ§ã ãªãªã½ã¼ã¹ã¿ã¤ãã«å¯¾ããæ¯ãèããæ確ã«ããã¥ã¡ã³ãåãããã¨ãé£ãããªãã¾ãã
代ããã«ãèè ã¯åãªã½ã¼ã¹ã¿ã¤ãã«å¯¾ãã¦åå¥ã®ã¡ã½ãããå®ç¾©ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã«ãããAPIã®æè»æ§ã¨ä¿å®æ§ãåä¸ãã¾ãã
çµè«
第16ç« ãPolymorphismãã¯ãAPIã«ãããããªã¢ã¼ãã£ãºã ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ãæ¡å¼µæ§ãããã¦é·æçãªä¿å®æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã¯ãç°ãªããµãã¿ã¤ããæã¤ãªã½ã¼ã¹ãå¹æçã«è¡¨ç¾ãã管çããããã®å¼·åãªãã¼ã«ã§ãã
ã¿ã¤ããã£ã¼ã«ãã使ç¨ãã¦ãªã½ã¼ã¹ã®ãµãã¿ã¤ããæ示çã«ç¤ºããã¨ã§ãAPIã®æè»æ§ã¨æ¡å¼µæ§ãåä¸ãã¾ãã
ããªã¢ã¼ãã£ãã¯ãªã½ã¼ã¹ã®è¨è¨ã«ã¯æ éãªèæ ®ãå¿ è¦ã§ãç¹ã«ãã¼ã¿æ§é ã¨ããªãã¼ã·ã§ã³ã«æ³¨æãæãå¿ è¦ãããã¾ãã
ããªã¢ã¼ãã£ãã¯ã¡ã½ããã¯é¿ããã¹ãã§ã代ããã«åãªã½ã¼ã¹ã¿ã¤ãã«å¯¾ãã¦åå¥ã®ã¡ã½ãããå®ç¾©ãããã¨ãæ¨å¥¨ããã¾ãã
ããªã¢ã¼ãã£ãºã ã®é©ç¨ã¯ãAPIã®ä¸è²«æ§ãåä¸ããã¤ã¤ãå°æ¥çãªæ¡å¼µæ§ã確ä¿ããããã®å¹æçãªæ段ã¨ãªãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãããªã¢ã¼ãã£ãºã ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããããªã¢ã¼ãã£ãºã ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå¼·åºã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
Part 5 Collective operations
ãã®ãã¼ãã§ã¯ãè¤æ°ã®ãªã½ã¼ã¹ãä¸åº¦ã«æä½ããæ¹æ³ã«ã¤ãã¦è°è«ããã¦ãã¾ããã³ãã¼ã¨ç§»åããããæä½ãæ¡ä»¶ä»ãåé¤ãå¿åæ¸ãè¾¼ã¿ããã¼ã¸ãã¼ã·ã§ã³ããã£ã«ã¿ãªã³ã°ãã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ããªã©ã大éã®ãã¼ã¿ãè¤éãªæä½ãå¹ççã«æ±ãããã®ææ³ãç´¹ä»ããã¦ãã¾ãããããã®æä½ã¯ãç¹ã«å¤§è¦æ¨¡ãªã·ã¹ãã ããã¼ã¿éç´åã®ã¢ããªã±ã¼ã·ã§ã³ã«ããã¦éè¦ã§ãã
17 Copy and move
ãAPI Design Patternsãã®ç¬¬17ç« ãCopy and moveãã¯ãAPIã«ããããªã½ã¼ã¹ã®ã³ãã¼ã¨ç§»åæä½ã®å®è£ æ¹æ³ããã®è¤éããããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãããã®æä½ãä¸è¦åç´ã«è¦ãããã®ã®ãå®éã«ã¯å¤ãã®èæ ®äºé ã¨èª²é¡ãå«ãè¤éãªåé¡ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
ã³ãã¼ã¨ç§»åæä½ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãçæ³çãªä¸çã§ã¯ãªã½ã¼ã¹ã®é層é¢ä¿ãå®ç§ã«è¨è¨ãããä¸å¤ã§ããã¹ãã ã¨ææãã¦ãã¾ãããããç¾å®ã«ã¯ãã¦ã¼ã¶ã¼ã®èª¤ããè¦ä»¶ã®å¤æ´ã«ããããªã½ã¼ã¹ã®åé ç½®ãè¤è£½ãå¿ è¦ã«ãªããã¨ãããã¾ãããã®åé¡ã«å¯¾å¦ãããããèè ã¯ã«ã¹ã¿ã ã¡ã½ããã使ç¨ããã³ãã¼ã¨ç§»åæä½ã®å®è£ ãææ¡ãã¦ãã¾ãã
ãããã®æä½ã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹éã§ãã¼ã¿ã移åãããããã¹ãç°å¢ããæ¬çªç°å¢ã«ãªã½ã¼ã¹ãã³ãã¼ãããããéã«ããããã®æä½ãå¿ è¦ã«ãªãã¾ãã
èè ã¯ãã³ãã¼ã¨ç§»åæä½ã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
- ã«ã¹ã¿ã ã¡ã½ããã®ä½¿ç¨ï¼æ¨æºã®CRUDæä½ã§ã¯ãªãï¼
- 対象ãªã½ã¼ã¹ã®èå¥å
- ç®çå°ï¼æ°ãã親ãªã½ã¼ã¹ã¾ãã¯æ°ããèå¥åï¼
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ãAPIã¯æè»ãã¤å¶å¾¡å¯è½ãªã³ãã¼ã¨ç§»åæä½ãæä¾ãããã¨ãã§ãã¾ãã
å®è£ ã®è©³ç´°ã¨èª²é¡
èè ã¯ãã³ãã¼ã¨ç§»åæä½ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
èå¥åã®æ±ã: ã³ãã¼æä½ã§ã¯ãæ°ãããªã½ã¼ã¹ã®èå¥åãã©ã®ããã«æ±ºå®ãããï¼ã¦ã¼ã¶ã¼æå®ããã·ã¹ãã çæãï¼ãæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã移åæä½ã§ã¯ãèå¥åã®å¤æ´ã許å¯ããããã©ãããèæ ®ããå¿ è¦ãããã¾ãã
åãªã½ã¼ã¹ã®æ±ã: 親ãªã½ã¼ã¹ãã³ãã¼ã¾ãã¯ç§»åããéãåãªã½ã¼ã¹ãã©ã®ããã«æ±ããã決å®ããå¿ è¦ãããã¾ããèè ã¯ãä¸è¬çã«åãªã½ã¼ã¹ãä¸ç·ã«ã³ãã¼ã¾ãã¯ç§»åãã¹ãã ã¨ææ¡ãã¦ãã¾ãã
é¢é£ãªã½ã¼ã¹ã®æ±ã: ãªã½ã¼ã¹éã®åç §é¢ä¿ãã©ã®ããã«ç¶æããããèæ ®ããå¿ è¦ãããã¾ããç¹ã«ç§»åæä½ã§ã¯ãé¢é£ãªã½ã¼ã¹ã®åç §ãæ´æ°ããå¿ è¦ãããã¾ãã
å¤é¨ãã¼ã¿ã®æ±ã: 大容éã®ãã¼ã¿ï¼ä¾ï¼ãã¡ã¤ã«ã®å 容ï¼ãã©ã®ããã«æ±ããã決å®ããå¿ è¦ãããã¾ããèè ã¯ãã³ãã¼æä½ã§ã¯ãcopy-on-writeãæ¦ç¥ãæ¨å¥¨ãã¦ãã¾ãã
ç¶æ¿ãããã¡ã¿ãã¼ã¿ã®æ±ã: 親ãªã½ã¼ã¹ããç¶æ¿ãããã¡ã¿ãã¼ã¿ï¼ä¾ï¼ã¢ã¯ã»ã¹å¶å¾¡ããªã·ã¼ï¼ãã©ã®ããã«æ±ãããèæ ®ããå¿ è¦ãããã¾ãã
ã¢ãããã¯æ§ã®ç¢ºä¿: æä½å ¨ä½ã®ã¢ãããã¯æ§ãã©ã®ããã«ç¢ºä¿ããããæ¤è¨ããå¿ è¦ãããã¾ãããã¼ã¿ãã¼ã¹ãã©ã³ã¶ã¯ã·ã§ã³ã®ä½¿ç¨ãããã¤ã³ãã¤ã³ã¿ã¤ã ã¹ãããã·ã§ããã®å©ç¨ãæ¨å¥¨ããã¦ãã¾ãã
ãããã®èª²é¡ã«å¯¾å¦ãããããèè ã¯å ·ä½çãªå®è£ æ¦ç¥ãææ¡ãã¦ãã¾ããä¾ãã°ãGolangãç¨ãã¦ã³ãã¼æä½ãå®è£ ããå ´åã以ä¸ã®ãããªã³ã¼ããèãããã¾ãã
type CopyRequest struct { SourceID string `json:"sourceId"` DestinationID string `json:"destinationId,omitempty"` } func (s *Service) CopyResource(ctx context.Context, req CopyRequest) (*Resource, error) { // ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ tx, err := s.db.BeginTx(ctx, nil) if err != nil { return nil, err } defer tx.Rollback() // ã½ã¼ã¹ãªã½ã¼ã¹ã®åå¾ source, err := s.getResourceWithinTx(tx, req.SourceID) if err != nil { return nil, err } // æ°ããèå¥åã®çæï¼ã¾ãã¯æ¤è¨¼ï¼ destID := req.DestinationID if destID == "" { destID = generateNewID() } else if exists, _ := s.resourceExistsWithinTx(tx, destID); exists { return nil, ErrResourceAlreadyExists } // ãªã½ã¼ã¹ã®ã³ãã¼ newResource := copyResource(source, destID) // åãªã½ã¼ã¹ã®ã³ãã¼ if err := s.copyChildResourcesWithinTx(tx, source.ID, newResource.ID); err != nil { return nil, err } // æ°ãããªã½ã¼ã¹ã®ä¿å if err := s.saveResourceWithinTx(tx, newResource); err != nil { return nil, err } // ãã©ã³ã¶ã¯ã·ã§ã³ã®ã³ããã if err := tx.Commit(); err != nil { return nil, err } return newResource, nil }
ãã®ã³ã¼ãã¯ããã¼ã¿ãã¼ã¹ãã©ã³ã¶ã¯ã·ã§ã³ã使ç¨ãã¦ã³ãã¼æä½ã®ã¢ãããã¯æ§ã確ä¿ããåãªã½ã¼ã¹ãå«ãã¦ã³ãã¼ãè¡ã£ã¦ãã¾ããã¾ããç®çå°ã®èå¥åãæå®ããã¦ããªãå ´åã¯æ°ããèå¥åãçæããæå®ããã¦ããå ´åã¯æ¢åãªã½ã¼ã¹ã¨ã®è¡çªããã§ãã¯ãã¦ãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹: ã³ãã¼ã移åæä½ã¯ã大éã®ãã¼ã¿ãæ±ãå¯è½æ§ããããããã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã¨ããã©ã¼ãã³ã¹ã«å¤§ããªå½±é¿ãä¸ãã¾ããç¹ã«ã大è¦æ¨¡ãªãªã½ã¼ã¹é層ãæã¤ã·ã¹ãã ã§ã¯ããããã®æä½ã®å¹ççãªå®è£ ãéè¦ã«ãªãã¾ãã
ãã¼ã¿ã®æ´åæ§: ã³ãã¼ã移åæä½ä¸ã«ãã¼ã¿ã®æ´åæ§ãç¶æãããã¨ã¯ãã·ã¹ãã ã®ä¿¡é ¼æ§ã«ã¨ã£ã¦æ¥µãã¦éè¦ã§ããç¹ã«ãåæ£ã·ã¹ãã ã«ããã¦ã¯ããããã®æä½ã®ã¢ãããã¯æ§ã確ä¿ãããã¨ã大ããªèª²é¡ã¨ãªãã¾ãã
APIã®é²åã¨å¾æ¹äºææ§: ã³ãã¼ã移åæä½ã®å°å ¥ã¯ãAPIã®å¤§ããªå¤æ´ã¨ãªãå¯è½æ§ãããã¾ããæ¢åã®ã¯ã©ã¤ã¢ã³ãã¨ã®äºææ§ãç¶æãã¤ã¤ããããã®æä½ãã©ã®ããã«å°å ¥ããããæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ãªã½ã¼ã¹ã®ã³ãã¼ã移åã¯ãã»ãã¥ãªãã£ã¢ãã«ã«å¤§ããªå½±é¿ãä¸ããå¯è½æ§ãããã¾ããç¹ã«ãç°ãªãã»ãã¥ãªãã£ã³ã³ããã¹ãéã§ãªã½ã¼ã¹ã移åããå ´åãé©åãªã¢ã¯ã»ã¹å¶å¾¡ã®å®è£ ãéè¦ã«ãªãã¾ãã
éç¨ã®è¤éã: ã³ãã¼ã移åæä½ã®å°å ¥ã¯ãã·ã¹ãã ã®éç¨è¤éæ§ãå¢å¤§ãããå¯è½æ§ãããã¾ãããããã®æä½ã®ã¢ãã¿ãªã³ã°ããã©ãã«ã·ã¥ã¼ãã£ã³ã°ãããã¦å¿ è¦ã«å¿ãããã¼ã«ããã¯æé ã®ç¢ºç«ãéè¦ã«ãªãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ã³ãã¼ã移åæä½ãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ãç¶æãããããªãã¾ããä¾ãã°ããªã½ã¼ã¹ã移åãããã¨ãã«ã¤ãã³ããçºè¡ããé¢é£ãããµã¼ãã¹ãããã«åå¿ãã¦å¿ è¦ãªæ´æ°ãè¡ããã¨ãã§ãã¾ãã
çµè«
第17ç« ãCopy and moveãã¯ãAPIã«ããããªã½ã¼ã¹ã®ã³ãã¼ã¨ç§»åæä½ã®éè¦æ§ã¨ããã®å®è£ ã«ä¼´ãè¤éããæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ããããã®æä½ãå®å ¨ãã¤å¹æçã«å®è£ ããããã®éè¦ãªæéã¨ãªãã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã³ãã¼ã¨ç§»åæä½ã¯ãã«ã¹ã¿ã ã¡ã½ããã¨ãã¦å®è£ ãã¹ãã§ãããæ¨æºçãªCRUDæä½ã§ã¯é©åã«å¦çã§ãã¾ããã
ãããã®æä½ã¯ãåãªã½ã¼ã¹ãé¢é£ãªã½ã¼ã¹ã«ãå½±é¿ãä¸ããããããã®å½±é¿ç¯å²ãæ éã«èæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¿ã®æ´åæ§ã¨ã¢ãããã¯æ§ã®ç¢ºä¿ã極ãã¦éè¦ã§ãããé©åãªãã©ã³ã¶ã¯ã·ã§ã³ç®¡çãã¹ãããã·ã§ããæ©è½ã®å©ç¨ãæ¨å¥¨ããã¾ãã
å¤é¨ãã¼ã¿ãã¡ã¿ãã¼ã¿ã®æ±ããç¹ã«å¤§å®¹éãã¼ã¿ã®å¹ççãªå¦çæ¹æ³ãèæ ®ããå¿ è¦ãããã¾ãã
ãããã®æä½ã®å°å ¥ã¯ãã·ã¹ãã ã®è¤éæ§ãå¢å¤§ãããå¯è½æ§ãããããããã®å¿ è¦æ§ãæ éã«è©ä¾¡ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
æå¾ã«ãã³ãã¼ã¨ç§»åæä½ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®æ©è½ãæ¡å¼µããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããã³ãã¼ã¨ç§»åæä½ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããããããåæã«ãããã®æä½ã¯ç³»çµ±çãªãªã¹ã¯ãããããå¯è½æ§ãããããããã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®æä½ã®å©ç¹ã¨ãªã¹ã¯ãååã«ç解ããã·ã¹ãã ã®è¦ä»¶ã«å¿ãã¦é©åã«é©ç¨ãããã¨ã§ãããå ç¢ã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
18 Batch operations
ãAPI Design Patternsãã®ç¬¬18ç« ãBatch operationsãã¯ãAPIã«ããããããæä½ã®éè¦æ§ãè¨è¨ååãå®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãããæä½ãåãªãå©ä¾¿æ§ã®åä¸ã ãã§ãªããAPIã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãããæä½ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãåã ã®ãªã½ã¼ã¹ã«å¯¾ããæä½ã ãã§ãªããè¤æ°ã®ãªã½ã¼ã¹ãä¸åº¦ã«æä½ããå¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããç¹ã«ããã¼ã¿ãã¼ã¹ã·ã¹ãã ã«ããããã©ã³ã¶ã¯ã·ã§ã³ã®æ¦å¿µãå¼ãåãã«åºããWebãã¼ã¹ã®ã·ã¹ãã ã«ããã¦ãåæ§ã®ååæ§ãæã¤æä½ãå¿ è¦ã§ãããã¨ã強調ãã¦ãã¾ãã
ãããæä½ã®éè¦æ§ã¯ãç¹ã«ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦é¡èã§ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹éã§ãã¼ã¿ã®ä¸è²«æ§ãä¿ã¡ãªãã大éã®ãªã½ã¼ã¹ãæ´æ°ããå¿ è¦ãããå ´åãåå¥ã®APIå¼ã³åºãã§ã¯å¹çãæªããã¨ã©ã¼ãã³ããªã³ã°ãè¤éã«ãªãã¾ãããããæä½ãé©åã«è¨è¨ãããã¨ã§ããããã®åé¡ã解決ããã·ã¹ãã å ¨ä½ã®å¹çæ§ã¨ä¿¡é ¼æ§ãåä¸ããããã¨ãã§ãã¾ãã
èè ã¯ããããæä½ãå®ç¾ããããã®ä¸»è¦ãªæ¹æ³ã¨ãã¦ãæ¨æºã¡ã½ããï¼GetãCreateãUpdateãDeleteï¼ã«å¯¾å¿ããããããã¼ã¸ã§ã³ã®ã«ã¹ã¿ã ã¡ã½ãããææ¡ãã¦ãã¾ãã
- BatchGet
- BatchCreate
- BatchUpdate
- BatchDelete
ãããã®ã¡ã½ããã¯ãè¤æ°ã®ãªã½ã¼ã¹ã«å¯¾ããæä½ãåä¸ã®APIå¼ã³åºãã§å®è¡ãããã¨ãå¯è½ã«ãã¾ãã
ãããæä½ã®è¨è¨åå
èè ã¯ããããæä½ã®è¨è¨ã«é¢ãã¦ããã¤ãã®éè¦ãªååãæ示ãã¦ãã¾ãã
ååæ§: ãããæä½ã¯å ¨ã¦æåããããå ¨ã¦å¤±æãããã®ããããã§ããã¹ãã§ããé¨åçãªæåã¯è¨±å®¹ããã¾ããã
ã³ã¬ã¯ã·ã§ã³ã«å¯¾ããæä½: ãããã¡ã½ããã¯ãåã ã®ãªã½ã¼ã¹ã§ã¯ãªãããªã½ã¼ã¹ã®ã³ã¬ã¯ã·ã§ã³ã«å¯¾ãã¦æä½ãè¡ãã¹ãã§ãã
çµæã®é åºä¿æ: ãããæä½ã®çµæã¯ããªã¯ã¨ã¹ãã§æå®ããããªã½ã¼ã¹ã®é åºãä¿æãã¦è¿ãã¹ãã§ãã
å ±éãã£ã¼ã«ãã®æé©å: ãªã¯ã¨ã¹ãå ã§å ±éã®ãã£ã¼ã«ããæã¤å ´åããããããæã¡ä¸ããã¦éè¤ãé¿ããã¹ãã§ãã
è¤æ°ã®è¦ªãªã½ã¼ã¹ã«å¯¾ããæä½: å¿ è¦ã«å¿ãã¦ãç°ãªã親ãªã½ã¼ã¹ã«å±ãããªã½ã¼ã¹ã«å¯¾ãããããæä½ããµãã¼ããã¹ãã§ãã
ãããã®ååã¯ããããæä½ã®ä¸è²«æ§ãå¹çæ§ãããã¦ä½¿ããããã確ä¿ããä¸ã§éè¦ã§ããç¹ã«ãååæ§ã®ä¿è¨¼ã¯ãã·ã¹ãã ã®ä¸è²«æ§ãç¶æããè¤éãªã¨ã©ã¼ãã³ããªã³ã°ãåé¿ããä¸ã§é常ã«éè¦ã§ãã
å®è£ ã®è©³ç´°
èè ã¯ãåãããæä½ã¡ã½ããã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
BatchGet: IDã®ãªã¹ããåãåãã対å¿ãããªã½ã¼ã¹ã®ãªã¹ããè¿ãã¾ããHTTP GETã¡ã½ããã使ç¨ããIDã¯ã¯ã¨ãªãã©ã¡ã¼ã¿ã¨ãã¦æ¸¡ããã¾ãã
BatchCreate: ä½æãããªã½ã¼ã¹ã®ãªã¹ããåãåããä½æããããªã½ã¼ã¹ã®ãªã¹ããè¿ãã¾ããHTTP POSTã¡ã½ããã使ç¨ãã¾ãã
BatchUpdate: æ´æ°ãããªã½ã¼ã¹ã®ãªã¹ãã¨ãã£ã¼ã«ããã¹ã¯ãåãåããæ´æ°ããããªã½ã¼ã¹ã®ãªã¹ããè¿ãã¾ããHTTP POSTã¡ã½ããã使ç¨ãã¾ãã
BatchDelete: åé¤ãããªã½ã¼ã¹ã®IDãªã¹ããåãåããæä½ã®æåã示ãvoidåãè¿ãã¾ããHTTP POSTã¡ã½ããã使ç¨ãã¾ãã
ãããã®å®è£ 詳細ã¯ãå®éã®ã·ã¹ãã è¨è¨ã«ããã¦é常ã«æç¨ã§ããä¾ãã°ãGolangãç¨ãã¦ãããæä½ãå®è£ ããå ´åã以ä¸ã®ãããªã¤ã³ã¿ã¼ãã§ã¼ã¹ã¨ã¡ã½ãããèãããã¾ãã
type BatchService interface { BatchGet(ctx context.Context, ids []string) ([]*Resource, error) BatchCreate(ctx context.Context, resources []*Resource) ([]*Resource, error) BatchUpdate(ctx context.Context, updates []*ResourceUpdate) ([]*Resource, error) BatchDelete(ctx context.Context, ids []string) error } type ResourceUpdate struct { ID string UpdateMask []string Resource *Resource } func (s *service) BatchGet(ctx context.Context, ids []string) ([]*Resource, error) { // ãã©ã³ã¶ã¯ã·ã§ã³ã®éå§ tx, err := s.db.BeginTx(ctx, nil) if err != nil { return nil, err } defer tx.Rollback() resources := make([]*Resource, len(ids)) for i, id := range ids { resource, err := s.getResourceWithinTx(tx, id) if err != nil { return nil, err // 1ã¤ã§ã失æãããå ¨ä½ã失æã¨ãã } resources[i] = resource } if err := tx.Commit(); err != nil { return nil, err } return resources, nil }
ãã®å®è£
ä¾ã§ã¯ãBatchGet
ã¡ã½ããããã©ã³ã¶ã¯ã·ã§ã³ã使ç¨ãã¦ååæ§ã確ä¿ãã1ã¤ã®ãªã½ã¼ã¹ã®åå¾ã«å¤±æããå ´åã¯å
¨ä½ã失æã¨ãã¦æ±ã£ã¦ãã¾ãã
ãããæä½ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããããæä½ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: ãããæä½ã¯ããããã¯ã¼ã¯å¼ã³åºãã®åæ°ãæ¸ãããå ¨ä½çãªã¹ã«ã¼ããããåä¸ãããå¯è½æ§ãããã¾ãããããã大è¦æ¨¡ãªãããæä½ã¯ããµã¼ãã¼ãªã½ã¼ã¹ã«å¤§ããªè² è·ããããå¯è½æ§ãããã¾ãã
ã¨ã©ã¼ãã³ããªã³ã°ã®è¤éã: ååæ§ãä¿è¨¼ãããã¨ã§ãã¨ã©ã¼ãã³ããªã³ã°ãç°¡ç´ åããã¾ããããããå ¨ã¦æåãããå ¨ã¦å¤±æãããã®åä½ã¯ãä¸é¨ã®ã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ä¸ä¾¿ãªå ´åãããã¾ãã
APIè¨è¨ã®ä¸è²«æ§: ãããæä½ã®å°å ¥ã¯ãAPIå ¨ä½ã®è¨è¨ã«ä¸è²«æ§ãããããå¯è½æ§ãããã¾ãããåæã«æ°ããªè¤éããå°å ¥ãã¾ãã
ã·ã¹ãã ã®å¾©å å: é©åã«è¨è¨ããããããæä½ã¯ãã·ã¹ãã ã®å¾©å åãåä¸ãããå¯è½æ§ãããã¾ããä¾ãã°ãä¸æçãªé害ãçºçããå ´åããããå ¨ä½ããªãã©ã¤ãããã¨ã§å復ã容æã«ãªãã¾ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: ãããæä½ã¯ãã·ã¹ãã ã®æåãç£è¦ãç解ãããã¨ãããè¤éã«ããå¯è½æ§ãããã¾ããåã ã®æä½ã®è©³ç´°ãè¦ãã«ãããªããããé©åãªãã®ã³ã°ã¨ç£è¦æ¦ç¥ãéè¦ã«ãªãã¾ãã
ãããã®å½±é¿ã¨ãã¬ã¼ããªããèæ ®ããªããããããæä½ã®å°å ¥ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ãããæä½ã¯ããã¤ã¯ããµã¼ãã¹éã®ãã¼ã¿ä¸è²«æ§ãç¶æããä¸ã§éè¦ãªå½¹å²ãæããã¾ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ã«ã¾ããããªã½ã¼ã¹ã®æ´æ°ããåä¸ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¨ãã¦æ±ããã¨ãã§ãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®é£æº: ãããæä½ã®çµæãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®åå¿æ§ã¨æè»æ§ãåä¸ããããã¨ãã§ãã¾ãã
ãã£ãã·ã¥æ¦ç¥: ãããæä½ã¯ããã£ãã·ã¥ã®ä¸è²«æ§ç¶æãè¤éã«ããå¯è½æ§ãããã¾ããé©åãªãã£ãã·ã¥ç¡å¹åæ¦ç¥ãå¿ è¦ã«ãªãã¾ãã
ã¬ã¼ãå¶éã¨ã¯ã©ã¼ã¿ç®¡ç: ãããæä½ã¯ããªã½ã¼ã¹ä½¿ç¨éãæ¥æ¿ã«å¢å ãããå¯è½æ§ããããããé©åãªã¬ã¼ãå¶éã¨ã¯ã©ã¼ã¿ç®¡çãéè¦ã«ãªãã¾ãã
éåæå¦çã¨ã®çµ±å: é·æéå®è¡ããããããæä½ã®å ´åãéåæå¦çãã¿ã¼ã³ï¼ä¾ï¼ãã¼ãªã³ã°ãWebhookãªã©ï¼ã¨çµ±åãããã¨ã§ãã¯ã©ã¤ã¢ã³ãã®å¿çæ§ãåä¸ããããã¨ãã§ãã¾ãã
çµè«
第18ç« ãBatch operationsãã¯ãAPIã«ããããããæä½ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãããæä½ã¯ãè¤æ°ã®ãªã½ã¼ã¹ã«å¯¾ããæä½ãå¹ççã«è¡ãããã®å¼·åãªãã¼ã«ã§ãã
ååæ§ã®ä¿è¨¼ã¯ãã·ã¹ãã ã®ä¸è²«æ§ãç¶æããã¨ã©ã¼ãã³ããªã³ã°ãç°¡ç´ åããä¸ã§éè¦ã§ãã
ãããæä½ã®è¨è¨ã«ã¯ãçµæã®é åºä¿æãå ±éãã£ã¼ã«ãã®æé©åãè¤æ°è¦ªãªã½ã¼ã¹ã®ãµãã¼ããªã©ãããã¤ãã®éè¦ãªååãããã¾ãã
ãããæä½ã®å°å ¥ã¯ãã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨æ§ã«å¤§ããªå½±é¿ãä¸ãã¾ãã
ãããæä½ã®é©åãªå®è£ ã«ã¯ããã©ã³ã¶ã¯ã·ã§ã³ç®¡çãã¨ã©ã¼ãã³ããªã³ã°ãã¢ãã¿ãªã³ã°ãªã©ãè¤æ°ã®å´é¢ãèæ ®ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ãããããé·æçã«ä¿å®å¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªã·ã¹ãã è¨è¨ã«ãç´æ¥çã«é©ç¨å¯è½ã§ãã
ãããããããæä½ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããå ¨ã¦ã®æä½ããããåãããã¨ãé©åã¨ã¯éãããã·ã¹ãã ã®è¦ä»¶ãå¶ç´ã«åºã¥ãã¦é©åãªãã©ã³ã¹ãåãå¿ è¦ãããã¾ããã¾ãããããæä½ã®å°å ¥ã«ä¼´ãè¤éãã®å¢å ã管çããããã«ãé©åãªã¢ãã¿ãªã³ã°ããã®ã³ã°ãããã¦ã¨ã©ã¼ãã³ããªã³ã°æ¦ç¥ã確ç«ãããã¨ãéè¦ã§ãã
æå¾ã«ããããæä½ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®æ©è½ãæ¡å¼µããã ãã§ãªããã·ã¹ãã å ¨ä½ã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãããæä½ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§å¹ççãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ããããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿å¦çãè¤éãªãã¸ãã¹ãã¸ãã¯ãæã¤ã·ã¹ãã ã«ããã¦ããããæä½ã¯æ¥µãã¦éè¦ãªå½¹å²ãæããã¾ããé©åã«è¨è¨ããããããæä½ã¯ãã·ã¹ãã ã®æ§è½ãå¤§å¹ ã«åä¸ãããéç¨ã³ã¹ããåæ¸ããã¦ã¼ã¶ã¼ä½é¨ãåä¸ãããå¼·åãªãã¼ã«ã¨ãªãã¾ãã
19 Criteria-based deletion
ãAPI Design Patternsãã®ç¬¬19ç« ãCriteria-based deletionãã¯ãAPIã«ãããæ¡ä»¶ã«åºã¥ãåé¤æä½ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯æ¡ä»¶ã«åºã¥ãåé¤æä½ï¼purgeæä½ï¼ãåãªãå©ä¾¿æ§ã®åä¸ã ãã§ãªããAPIã®æè»æ§ãå¹çæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®å®å ¨æ§ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
æ¡ä»¶ã«åºã¥ãåé¤ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ããããåé¤æä½ã®éçããè°è«ãå§ãã¦ãã¾ãããããåé¤ã§ã¯ãåé¤å¯¾è±¡ã®ãªã½ã¼ã¹ã®IDãäºåã«ç¥ã£ã¦ããå¿ è¦ãããã¾ãããå®éã®éç¨ã§ã¯ç¹å®ã®æ¡ä»¶ã«åè´ãããã¹ã¦ã®ãªã½ã¼ã¹ãåé¤ãããå ´åãå¤ã ããã¾ããä¾ãã°ãã¢ã¼ã«ã¤ãããããã¹ã¦ã®ãã£ããã«ã¼ã ãåé¤ãããããªæä½ã§ãã
ãã®åé¡ã«å¯¾å¦ãããããèè ã¯ãpurgeãã¨å¼ã°ããæ°ããã«ã¹ã¿ã ã¡ã½ãããææ¡ãã¦ãã¾ããpurgeã¡ã½ããã¯ããã£ã«ã¿æ¡ä»¶ãåãåãããã®æ¡ä»¶ã«åè´ãããã¹ã¦ã®ãªã½ã¼ã¹ãä¸åº¦ã«åé¤ãã¾ããããã«ãããè¤æ°ã®APIå¼ã³åºãï¼ãªã½ã¼ã¹ã®ä¸è¦§åå¾ã¨åé¤ã®çµã¿åããï¼ã1åã®APIå¼ã³åºãã«ç½®ãæãããã¨ãã§ããå¹çæ§ã¨ä¸è²«æ§ãåä¸ãã¾ãã
ããããèè ã¯ãã®æä½ã®å±éºæ§ãæ確ã«ææãã¦ãã¾ããpurgeæä½ã¯ãã¦ã¼ã¶ã¼ãæå³ããã«å¤§éã®ãã¼ã¿ãåé¤ãã¦ãã¾ãå¯è½æ§ããããããæ éã«è¨è¨ããé©åãªå®å ¨æ©æ§ãçµã¿è¾¼ãå¿ è¦ãããã¾ãã
purgeæä½ã®è¨è¨ã¨å®è£
èè ã¯ãpurgeæä½ã®å®å ¨ãªå®è£ ã®ããã«ä»¥ä¸ã®éè¦ãªè¦ç´ ãææ¡ãã¦ãã¾ãã
forceãã©ã°: ããã©ã«ãã§ã¯åé¤ãå®è¡ããããã¬ãã¥ã¼ã¢ã¼ãã¨ãã¦åä½ãã¾ããå®éã«åé¤ãè¡ãã«ã¯ãæ示çã«forceãã©ã°ãtrueã«è¨å®ããå¿ è¦ãããã¾ãã
purgeCount: åé¤å¯¾è±¡ã¨ãªããªã½ã¼ã¹ã®æ°ãè¿ãã¾ãããã¬ãã¥ã¼ã¢ã¼ãã§ã¯æ¦ç®å¤ãè¿ããã¨ãããã¾ãã
purgeSample: åé¤å¯¾è±¡ã¨ãªããªã½ã¼ã¹ã®ãµã³ãã«ã»ãããè¿ãã¾ããããã«ãããã¦ã¼ã¶ã¼ã¯åé¤å¯¾è±¡ãæå³ãããã®ã§ãããã確èªã§ãã¾ãã
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ãAPIã¯æè»ãã¤å®å ¨ãªæ¡ä»¶ä»ãåé¤æ©è½ãæä¾ãããã¨ãã§ãã¾ãã
èè ã¯ãpurgeæä½ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã£ã«ã¿ãªã³ã°: purgeæä½ã®ãã£ã«ã¿ã¯ãæ¨æºçãªãªã¹ãæä½ã®ãã£ã«ã¿ã¨åãããã«åä½ãã¹ãã§ããããã«ãããAPIã®ä¸è²«æ§ãä¿ããã¾ãã
ããã©ã«ãã®åä½: å®å ¨æ§ã確ä¿ãããããããã©ã«ãã§ã¯ãã¬ãã¥ã¼ã¢ã¼ãã¨ãã¦åä½ããå®éã®åé¤ã¯è¡ãã¾ããã
çµæã®ä¸è²«æ§: ãã¬ãã¥ã¼ã¨å®éã®åé¤æä½ã®éã§ãã¼ã¿ãå¤æ´ãããå¯è½æ§ããããããå®å ¨ãªä¸è²«æ§ã¯ä¿è¨¼ã§ãã¾ããããã®å¶éãã¦ã¼ã¶ã¼ã«æ確ã«ä¼ããå¿ è¦ãããã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®purgeæä½ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type PurgeRequest struct { Parent string `json:"parent"` Filter string `json:"filter"` Force bool `json:"force"` } type PurgeResponse struct { PurgeCount int `json:"purgeCount"` PurgeSample []string `json:"purgeSample,omitempty"` } func (s *Service) PurgeMessages(ctx context.Context, req *PurgeRequest) (*PurgeResponse, error) { // ãã£ã«ã¿ã®æ¤è¨¼ if req.Filter == "" { return nil, errors.New("filter is required") } // ããããããªã½ã¼ã¹ã®åå¾ matchingResources, err := s.getMatchingResources(ctx, req.Parent, req.Filter) if err != nil { return nil, err } response := &PurgeResponse{ PurgeCount: len(matchingResources), PurgeSample: getSample(matchingResources, 100), } // å®éã®åé¤æä½ if req.Force { if err := s.deleteResources(ctx, matchingResources); err != nil { return nil, err } } return response, nil }
ãã®å®è£ ä¾ã§ã¯ãforceãã©ã°ãfalseã®å ´åã¯ãã¬ãã¥ã¼ã®ã¿ãè¡ããtrueã®å ´åã«å®éã®åé¤ãå®è¡ãã¾ããã¾ããåé¤å¯¾è±¡ã®ãµã³ãã«ãè¿ããã¨ã§ãã¦ã¼ã¶ã¼ãæå³ããæä½ã§ãããã確èªã§ããããã«ãã¦ãã¾ãã
purgeæä½ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ãpurgeæä½ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ããã©ã¼ãã³ã¹ã¨å¹çæ§: purgeæä½ã¯ãè¤æ°ã®APIå¼ã³åºãã1åã®å¼ã³åºãã«ç½®ãæãããã¨ã§ãå ¨ä½çãªå¹çãåä¸ããã¾ãããããã大éã®ãã¼ã¿ãä¸åº¦ã«å¦çããå¿ è¦ãããããããµã¼ãã¼ãªã½ã¼ã¹ã«å¤§ããªè² è·ããããå¯è½æ§ãããã¾ãã
å®å ¨æ§ã¨ã¦ã¼ã¶ããªãã£ã®ãã©ã³ã¹: ããã©ã«ãã§ãã¬ãã¥ã¼ã¢ã¼ãã¨ãã¦åä½ãããã¨ã§å®å ¨æ§ã確ä¿ãã¦ãã¾ãããããã¯åæã«ã¦ã¼ã¶ã¼ã2åã®APIå¼ã³åºããè¡ãå¿ è¦ããããã¨ãæå³ãã¾ãããã®ãã¬ã¼ããªããé©åã«ç®¡çããå¿ è¦ãããã¾ãã
ãã¼ã¿ã®ä¸è²«æ§: ãã¬ãã¥ã¼ã¨å®éã®åé¤æä½ã®éã§ãã¼ã¿ãå¤æ´ãããå¯è½æ§ããããããå®å ¨ãªä¸è²«æ§ãä¿è¨¼ãããã¨ã¯å°é£ã§ãããã®å¶éãã¦ã¼ã¶ã¼ã«æ確ã«ä¼ããé©åã«ç®¡çããå¿ è¦ãããã¾ãã
ã¨ã©ã¼å¦çã®è¤éã: 大éã®ãªã½ã¼ã¹ãä¸åº¦ã«åé¤ããéãä¸é¨ã®ãªã½ã¼ã¹ã®åé¤ã«å¤±æããå ´åã®å¦çãè¤éã«ãªãå¯è½æ§ãããã¾ããé¨åçãªæåãã©ã®ããã«æ±ãããæ éã«è¨è¨ããå¿ è¦ãããã¾ãã
ç£è¦ã¨å¯è¦³æ¸¬æ§: purgeæä½ã¯ãã·ã¹ãã ã®ç¶æ ã大ããå¤æ´ããå¯è½æ§ããããããé©åãªç£è¦ã¨ç£æ»ã¡ã«ããºã ãä¸å¯æ¬ ã§ããã©ã®ãããªæ¡ä»¶ã§ãã©ãã ãã®ãªã½ã¼ã¹ãåé¤ããããã追跡ã§ããããã«ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: purgeæä½ã¯ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ã«ã¾ããããã¼ã¿ã®ä¸è²«æ§ãç¶æããä¸ã§éè¦ãªå½¹å²ãæããå¯è½æ§ãããã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ãã¼ã¿ã®åé¤ï¼GDPR対å¿ãªã©ï¼ãã大è¦æ¨¡ãªãã¼ã¿ã¯ãªã¼ã³ã¢ããæä½ã«å©ç¨ã§ãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®é£æº: purgeæä½ã®çµæãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãé¢é£ããã·ã¹ãã ã³ã³ãã¼ãã³ããé©åã«åå¿ããå ¨ä½çãªä¸è²«æ§ãç¶æãããã¨ãã§ãã¾ãã
ããã¯ã°ã©ã¦ã³ãã¸ã§ãã¨ãã¦ã®å®è£ : 大è¦æ¨¡ãªpurgeæä½ã¯ãéåæã®ããã¯ã°ã©ã¦ã³ãã¸ã§ãã¨ãã¦å®è£ ãããã¨ãæ¤è¨ãã¹ãã§ããããã«ãããã¯ã©ã¤ã¢ã³ãã®ã¿ã¤ã ã¢ã¦ããåé¿ããã·ã¹ãã ã®å¿çæ§ãç¶æãããã¨ãã§ãã¾ãã
段éçãªåé¤æ¦ç¥: 大éã®ãã¼ã¿ãä¸åº¦ã«åé¤ããã®ã§ã¯ãªãã段éçã«åé¤ãè¡ãæ¦ç¥ãæ¤è¨ãã¹ãã§ããããã«ãããã·ã¹ãã ã¸ã®å½±é¿ãæå°éã«æãã¤ã¤ã大è¦æ¨¡ãªåé¤æä½ãå®å ¨ã«å®è¡ãããã¨ãã§ãã¾ãã
ç£æ»ã¨ã³ã³ãã©ã¤ã¢ã³ã¹: purgeæä½ã¯ãç£æ»ã¨ã³ã³ãã©ã¤ã¢ã³ã¹ã®è¦³ç¹ããéè¦ã§ããã©ã®ãã¼ã¿ããã¤ã誰ã«ãã£ã¦ãã©ã®ãããªæ¡ä»¶ã§åé¤ããããã追跡ã§ããããã«ããå¿ è¦ãããã¾ãã
çµè«
第19ç« ãCriteria-based deletionãã¯ãæ¡ä»¶ã«åºã¥ãåé¤æä½ï¼purgeæä½ï¼ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ã¨å¹çæ§ãåä¸ãããä¸æ¹ã§ãã·ã¹ãã ã®å®å ¨æ§ã¨æ´åæ§ãç¶æãããã¨ãç®æãã¦ãã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
purgeæä½ã¯ãæ¡ä»¶ã«åºã¥ãã¦è¤æ°ã®ãªã½ã¼ã¹ãä¸åº¦ã«åé¤ããå¼·åãªãã¼ã«ã§ãããæ éã«è¨è¨ããé©åãªå®å ¨æ©æ§ãçµã¿è¾¼ãå¿ è¦ãããã¾ãã
ããã©ã«ãã§ãã¬ãã¥ã¼ã¢ã¼ãã¨ãã¦åä½ããå®éã®åé¤ã«ã¯æ示çãªæ¿èªï¼forceãã©ã°ï¼ãè¦æ±ãããã¨ã§ãæå³ããªã大è¦æ¨¡åé¤ãé²ããã¨ãã§ãã¾ãã
åé¤å¯¾è±¡ã®ãªã½ã¼ã¹æ°ã¨ãµã³ãã«ãæä¾ãããã¨ã§ãã¦ã¼ã¶ã¼ãæä½ã®å½±é¿ãäºåã«è©ä¾¡ã§ããããã«ãããã¨ãéè¦ã§ãã
ãã¼ã¿ã®ä¸è²«æ§ã®ä¿è¨¼ãé£ããããããã®å¶éãã¦ã¼ã¶ã¼ã«æ確ã«ä¼ããå¿ è¦ãããã¾ãã
purgeæä½ã®å°å ¥ã¯ãã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨æ§ã«å¤§ããªå½±é¿ãä¸ããå¯è½æ§ããããããæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã«ã¨ã£ã¦ä½¿ããããããã¤å®å ¨ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããããã«ããããã®ååã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ãããå¹æçãªãã¼ã¿ç®¡çæ¦ç¥ã®ä¸é¨ã¨ãã¦ç´æ¥çã«é©ç¨å¯è½ã§ãã
ããããpurgeæä½ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ãããã®å¼·åãªæ©è½ããã«ãã·ã¹ãã ã®å®å ¨æ§ã¨ãã¼ã¿ã®æ´åæ§ã«å¤§ããªãªã¹ã¯ãããããå¯è½æ§ãããã¾ãããããã£ã¦ãpurgeæä½ã¯æ¬å½ã«å¿ è¦ãªå ´åã«ã®ã¿å°å ¥ããé©åãªå¶éã¨ç£è¦ã¡ã«ããºã ãä½µãã¦å®è£ ãããã¨ãéè¦ã§ãã
æå¾ã«ãpurgeæä½ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®æ©è½ãæ¡å¼µããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ãã¼ã¿ç®¡çæ¦ç¥ãã»ãã¥ãªãã£ããªã·ã¼ãããã¦éç¨ãã©ã¯ãã£ã¹ã«ã大ããªå½±é¿ãä¸ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
purgeæä½ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®ãã¼ã¿ç®¡çè½åãå¤§å¹ ã«åä¸ãããéç¨å¹çãé«ããå¯è½æ§ãããã¾ããããããåæã«ããã¯å¤§ããªè²¬ä»»ãä¼´ãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®æä½ã®å½±é¿ãæ·±ãç解ããé©åãªãµãã§ã¬ã¼ããå®è£ ãããã¨ã§ãããå ç¢ã§å¹ççããã¤å®å ¨ãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ããããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ç®¡çãè¤éãªãã¸ãã¹ãã¸ãã¯ãæã¤ã·ã¹ãã ã«ããã¦ãpurgeæä½ã¯æ¥µãã¦éè¦ãªå½¹å²ãæããå¯è½æ§ãããã¾ããããã®å°å ¥ã«ã¯æ éãªæ¤è¨ã¨ç¶¿å¯ãªè¨ç»ãä¸å¯æ¬ ã§ãã
20 Anonymous writes
ãAPI Design Patternsãã®ç¬¬20ç« ãAnonymous writesãã¯ãAPIã«ãããå¿åãã¼ã¿ã®æ¸ãè¾¼ã¿ã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯å¾æ¥ã®ãªã½ã¼ã¹æåã®APIãã¶ã¤ã³ã§ã¯å¯¾å¿ãé£ããå¿åãã¼ã¿ã®åãæ±ãã«ã¤ãã¦ãæ°ããã¢ããã¼ããææ¡ãããããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨éç¨ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
å¿åãã¼ã¿ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãããã¾ã§ã®APIãã¶ã¤ã³ãã¿ã¼ã³ã§ã¯å ¨ã¦ã®ãã¼ã¿ããªã½ã¼ã¹ã¨ãã¦æ±ã£ã¦ãããã¨ãææãããã® approach ãå ¨ã¦ã®ã·ããªãªã«é©ãã¦ããããã§ã¯ãªãã¨ããåé¡æèµ·ããè°è«ãå§ãã¦ãã¾ããç¹ã«ãæç³»åãã¼ã¿ããã°ã¨ã³ããªã®ãããªãåå¥ã«èå¥ãæä½ããå¿ è¦ã®ãªããã¼ã¿ã®åãæ±ãã«ã¤ãã¦ãæ°ããã¢ããã¼ãã®å¿ è¦æ§ã強調ãã¦ãã¾ãã
ãã®åé¡ã¯ãç¹ã«å¤§è¦æ¨¡ãªãã¼ã¿åæã·ã¹ãã ãã¯ã©ã¦ããã¤ãã£ããªç°å¢ã«ããã¦é¡èã§ããä¾ãã°ãIoTããã¤ã¹ãã大éã®ã»ã³ãµã¼ãã¼ã¿ãåéããå ´åãããã¤ã¯ããµã¼ãã¹éã®ã¤ãã³ããã°ãè¨é²ããå ´åãªã©ãåã ã®ãã¼ã¿ãã¤ã³ããããéè¨çµæãå¾ååæãéè¦ã¨ãªãã·ããªãªãå¤ã ããã¾ãã
èè ã¯ããã®ãããªå¿åãã¼ã¿ãæ±ãããã®æ°ããã«ã¹ã¿ã ã¡ã½ãããwriteããææ¡ãã¦ãã¾ãããã®ã¡ã½ããã®ä¸»ãªç¹å¾´ã¯ä»¥ä¸ã®éãã§ãã
- ãã¼ã¿ã¯ä¸æã®èå¥åãæãããåå¥ã«ã¢ãã¬ã¹æå®ã§ããªãã
- æ¸ãè¾¼ã¾ãããã¼ã¿ã¯ã主ã«éè¨ãåæã®ç®çã§ä½¿ç¨ãããã
- åã ã®ãã¼ã¿ã¨ã³ããªã®åå¾ãæ´æ°ãåé¤ã¯æ³å®ããã¦ããªãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ããã°ãã¼ã¿åæã·ã¹ãã ãã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨é常ã«è¦ªåæ§ãé«ããç¹ã«ã¯ã©ã¦ããã¤ãã£ããªç°å¢ã§ã®å¿ç¨ãæå¾ ããã¾ãã
write ã¡ã½ããã®å®è£
èè ã¯ãwrite ã¡ã½ããã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
æ»ãå¤: write ã¡ã½ãã㯠void ãè¿ãã¹ãã§ããããã¯ãåã ã®ãã¼ã¿ã¨ã³ããªãèå¥å¯è½ã§ãªããããæ°ããä½æããããªã½ã¼ã¹ãè¿ãå¿ è¦ããªãããã§ãã
ãã¤ãã¼ã: ãã¼ã¿ã¯
entry
ãã£ã¼ã«ããéãã¦éä¿¡ããã¾ããããã¯æ¨æºã® create ã¡ã½ããã®resource
ãã£ã¼ã«ãã«ç¸å½ãã¾ããURLæ§é : ã³ã¬ã¯ã·ã§ã³ãã¿ã¼ã²ããã¨ããã¹ãã§ããä¾ãã°ã
/chatRooms/1/statEntries:write
ã®ãããªå½¢å¼ã§ããä¸è²«æ§: write ã¡ã½ããã¯å³åº§ã«å¿çãè¿ãã¹ãã§ããããã¼ã¿ãå³åº§ã«èªã¿åãå¯è½ã§ããå¿ è¦ã¯ããã¾ãããããã¯ã大è¦æ¨¡ãªãã¼ã¿å¦çãã¤ãã©ã¤ã³ã®ç¹æ§ãåæ ãã¦ãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®write ã¡ã½ããã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type ChatRoomStatEntry struct { Name string `json:"name"` Value interface{} `json:"value"` } type WriteChatRoomStatEntryRequest struct { Parent string `json:"parent"` Entry ChatRoomStatEntry `json:"entry"` } func (s *Service) WriteChatRoomStatEntry(ctx context.Context, req *WriteChatRoomStatEntryRequest) error { // ãã¼ã¿ã®æ¤è¨¼ if err := validateEntry(req.Entry); err != nil { return err } // ãã¼ã¿å¦çãã¤ãã©ã¤ã³ã¸ã®éä¿¡ if err := s.dataPipeline.Send(ctx, req.Parent, req.Entry); err != nil { return err } // å³åº§ã«æåãè¿ã return nil }
ãã®å®è£ ä¾ã§ã¯ããã¼ã¿ã®æ¤è¨¼ãè¡ã£ãå¾ãéåæã®ãã¼ã¿å¦çãã¤ãã©ã¤ã³ã«ãã¼ã¿ãéä¿¡ãã¦ãã¾ããã¡ã½ããã¯å³åº§ã«å¿çãè¿ããã¯ã©ã¤ã¢ã³ãã¯ãã¼ã¿ãå¦çãããã®ãå¾ ã¤å¿ è¦ãããã¾ããã
ä¸è²«æ§ã¨éç¨ä¸ã®èæ ®äºé
èè ã¯ãwrite ã¡ã½ããã®ä¸è²«æ§ã¢ãã«ã«ã¤ãã¦éè¦ãªææããã¦ãã¾ããå¾æ¥ã®ãªã½ã¼ã¹æåã®APIã§ã¯ããã¼ã¿ã®æ¸ãè¾¼ã¿å¾å³åº§ã«ãã®ãã¼ã¿ãèªã¿åãå¯è½ã§ãããã¨ãæå¾ ããã¾ãããwrite ã¡ã½ããã§ã¯ãã®å³æä¸è²«æ§ã¯ä¿è¨¼ããã¾ããã
ããã¯ã大è¦æ¨¡ãªãã¼ã¿å¦çã·ã¹ãã ã®ç¾å®çãªéç¨ãåæ ãã¦ãã¾ããä¾ãã°ãæç³»åãã¼ã¿ãã¼ã¹ãããã°ãã¼ã¿å¦çã·ã¹ãã ã§ã¯ããã¼ã¿ã®åãè¾¼ã¿ã¨å¦çã«æéå·®ãããã®ãä¸è¬çã§ããèè ã¯ããã®éåææ§ãæ示çã«è¨è¨ã«çµã¿è¾¼ããã¨ã§ãããå¹ççã§æ¡å¼µæ§ã®é«ãã·ã¹ãã ãæ§ç¯ã§ããã¨ä¸»å¼µãã¦ãã¾ãã
éç¨ã®è¦³ç¹ããè¦ãã¨ããã®è¨è¨ã«ã¯ä»¥ä¸ã®ãããªå©ç¹ãããã¾ãã
ã¹ã±ã¼ã©ããªãã£ã®åä¸: ãã¼ã¿ã®åãè¾¼ã¿ã¨å¦çãåé¢ãããã¨ã§ããããããç¬ç«ãã¦ã¹ã±ã¼ã«ããããã¨ãã§ãã¾ãã
ã·ã¹ãã ã®å復å: ãã¼ã¿å¦çãã¤ãã©ã¤ã³ã«ä¸æçãªåé¡ãçºçãã¦ãããã¼ã¿ã®åãè¾¼ã¿èªä½ã¯ç¶ç¶ã§ãã¾ãã
ãããã¡ãªã³ã°ã¨è² è·å¹³æºå: åãè¾¼ãã ãã¼ã¿ããããã¡ãªã³ã°ãããã¨ã§ãä¸æµã®ã·ã¹ãã ã¸ã®è² è·ãå¹³æºåã§ãã¾ãã
éç¨ã®æè»æ§: ãã¼ã¿å¦çãã¸ãã¯ãå¤æ´ããéã«ãAPIã¤ã³ã¿ã¼ãã§ã¼ã¹ãå¤æ´ããã«æ¸ã¿ã¾ãã
èè ã¯ãã¯ã©ã¤ã¢ã³ãã«ãã¼ã¿ã®å¦çç¶æ³ãä¼ããããã«ãHTTP 202 Accepted ã¹ãã¼ã¿ã¹ã³ã¼ãã®ä½¿ç¨ãæ¨å¥¨ãã¦ãã¾ããããã¯ããã¼ã¿ãåãå ¥ããããããã¾ã å®å ¨ã«å¦çããã¦ããªããã¨ã示ãé©åãªæ¹æ³ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®è¦ªåæ§: write ã¡ã½ããã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ãCQRSãã¿ã¼ã³ã¨é常ã«ç¸æ§ãè¯ãã§ããä¾ãã°ããã¤ã¯ããµã¼ãã¹éã®éåæéä¿¡ããã¤ãã³ãã¹ããªã¼ã ã®çæã«æ´»ç¨ã§ãã¾ãã
観測å¯è½æ§ã®åä¸: å¿åãã¼ã¿ã®æ¸ãè¾¼ã¿ãæ示çã«è¨è¨ã«çµã¿è¾¼ããã¨ã§ãã·ã¹ãã ã®æ¯ãèãããã詳細ã«è¦³æ¸¬ã§ããããã«ãªãã¾ããä¾ãã°ãåãµã¼ãã¹ã®å é¨ç¶æ ã®å¤åãæç³»åãã¼ã¿ã¨ãã¦è¨é²ããå¾ã§åæãããã¨ã容æã«ãªãã¾ãã
ã³ã³ãã©ã¤ã¢ã³ã¹ã¨ç£æ»: å¿åãã¼ã¿ã®æ¸ãè¾¼ã¿ãæ¨æºåãããã¨ã§ãã·ã¹ãã å ¨ä½ã®åä½ãã°ãä¸è²«ããæ¹æ³ã§åéã§ãã¾ããããã¯ãã³ã³ãã©ã¤ã¢ã³ã¹è¦ä»¶ã®éµå®ããã·ã¹ãã ã®ç£æ»ã«å½¹ç«ã¡ã¾ãã
ããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°: éè¨ãã¼ã¿ã®åéãæé©åãããã¨ã§ãã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãããã¡ã¤ã«ã詳細ã«ææ¡ããããã«ããã¯ã®ç¹å®ãæé©åã容æã«ãªãã¾ãã
A/Bãã¹ãã¨ãã£ã¼ãã£ã¼ãã©ã°: å¿åãã¼ã¿ãæ´»ç¨ãããã¨ã§ãæ°æ©è½ã®æ®µéçãªãã¼ã«ã¢ã¦ãããA/Bãã¹ãã®çµæåéãå¹ççã«è¡ããã¨ãã§ãã¾ãã
çµè«
第20ç« ãAnonymous writesãã¯ãAPIã«ãããå¿åãã¼ã¿ã®åãæ±ãã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããwrite ã¡ã½ããã¯ãå¾æ¥ã®ãªã½ã¼ã¹æåã®APIãã¶ã¤ã³ãè£å®ããããæè»ã§æ¡å¼µæ§ã®é«ãã·ã¹ãã è¨è¨ãå¯è½ã«ãã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
å ¨ã¦ã®ãã¼ã¿ããªã½ã¼ã¹ã¨ãã¦æ±ãå¿ è¦ã¯ãªããå¿åãã¼ã¿ã®æ¦å¿µãå°å ¥ãããã¨ã§ãããå¹ççãªãã¼ã¿å¦çãå¯è½ã«ãªãã¾ãã
write ã¡ã½ããã¯ãå³æä¸è²«æ§ãç ç²ã«ãã代ããã«ãé«ãã¹ã±ã¼ã©ããªãã£ã¨æè»æ§ãæä¾ãã¾ãã
å¿åãã¼ã¿ã®åãæ±ãã¯ã大è¦æ¨¡ãªãã¼ã¿åæã·ã¹ãã ãã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨é常ã«è¦ªåæ§ãé«ãã§ãã
ã·ã¹ãã ã®è¦³æ¸¬å¯è½æ§ãã³ã³ãã©ã¤ã¢ã³ã¹ãããã©ã¼ãã³ã¹ãã¥ã¼ãã³ã°ãªã©ãéç¨é¢ã§ãå¤ãã®å©ç¹ãããã¾ãã
write ã¡ã½ããã®å°å ¥ã«ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¦çãã¤ãã©ã¤ã³ã®è¨è¨ãèæ ®ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããæè»ã§æ¡å¼µæ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿å¦çãè¤éãªã¤ãã³ãé§åã·ã¹ãã ãæ±ãå ´åããã®è¨è¨ãã¿ã¼ã³ã¯é常ã«æç¨ã§ãã
ããããwrite ã¡ã½ããã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããå³æä¸è²«æ§ãéè¦ãªã¦ã¼ã¹ã±ã¼ã¹ã§ã¯ãå¾æ¥ã®ãªã½ã¼ã¹æåã®ã¢ããã¼ããé©ãã¦ããå ´åãããã¾ããã¾ããå¿åãã¼ã¿ã®åãæ±ãã¯ããã¼ã¿ã®è¿½è·¡ããããã°ãè¤éã«ããå¯è½æ§ããããããé©åãªã¢ãã¿ãªã³ã°ã¨ãã°è¨é²ã®æ¦ç¥ãä¸å¯æ¬ ã§ãã
æå¾ã«ãå¿åãã¼ã¿ã®åãæ±ãã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããwrite ã¡ã½ããã®å°å ¥ã¯ãåã«APIã®æ©è½ãæ¡å¼µããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ãã¼ã¿ããã¼ãå¦çãã¤ãã©ã¤ã³ãããã¦éç¨ãã©ã¯ãã£ã¹ã«ã大ããªå½±é¿ãä¸ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§è¤éãªã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããå¿åãã¼ã¿ã®é©åãªåãæ±ãã¯ãã·ã¹ãã ã®æ¡å¼µæ§ãæè»æ§ãããã¦éç¨å¹çã大ããåä¸ãããå¯è½æ§ãããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®æ¦å¿µãæ·±ãç解ããé©åã«å¿ç¨ãããã¨ã§ãããå ç¢ã§å¹ççãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
21 Pagination
ãAPI Design Patternsãã®ç¬¬21ç« ãPaginationãã¯ãAPIã«ããããã¼ã¸ãã¼ã·ã§ã³ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãã¼ã¸ãã¼ã·ã§ã³ãåãªãæ©è½ã®è¿½å ã§ã¯ãªããAPIã®ä½¿ãããããå¹çæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãã¼ã¸ãã¼ã·ã§ã³ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãéã®ãã¼ã¸ãã¼ã·ã§ã³ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããç¹ã«ã1å件ã®ãã¼ã¿ãä¸åº¦ã«è¿ããã¨ãããã¨ã®åé¡ç¹ãææãããã¼ã¸ãã¼ã·ã§ã³ããã®åé¡ã«ã©ã®ããã«å¯¾å¦ãããã説æãã¦ãã¾ãããã¼ã¸ãã¼ã·ã§ã³ã¯ã大éã®ãã¼ã¿ã管çå¯è½ãªããã£ã³ã¯ãã«åå²ããã¯ã©ã¤ã¢ã³ããå¿ è¦ã«å¿ãã¦ãã¼ã¿ãåå¾ã§ããããã«ããæ¹æ³ã§ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ã大éã®ãã¼ã¿ãå¹ççã«å¦çãããããã¯ã¼ã¯å¸¯åå¹ ãæé©åããå¿ è¦ãããã¾ãããã¼ã¸ãã¼ã·ã§ã³ã¯ããã®ãããªç°å¢ã§ã®ãã¼ã¿è»¢éãæé©åããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ã¨å¿çæ§ãåä¸ãããéè¦ãªæ段ã¨ãªãã¾ãã
èè ã¯ããã¼ã¸ãã¼ã·ã§ã³ã®åºæ¬çãªæ§é ã¨ãã¦ä»¥ä¸ã®è¦ç´ ãææ¡ãã¦ãã¾ãã
pageToken
: 次ã®ãã¼ã¸ãåå¾ããããã®ãã¼ã¯ã³maxPageSize
: ã¯ã©ã¤ã¢ã³ããè¦æ±ããæ大ãã¼ã¸ãµã¤ãºnextPageToken
: ãµã¼ãã¼ãè¿ã次ã®ãã¼ã¸ã®ãã¼ã¯ã³
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ãAPIã¯å¤§è¦æ¨¡ãªãã¼ã¿ã»ãããå¹ççã«ç®¡çããã¯ã©ã¤ã¢ã³ãã«æ®µéçã«æä¾ãããã¨ãã§ãã¾ãã
ãã¼ã¸ãã¼ã·ã§ã³ã®å®è£
èè ã¯ããã¼ã¸ãã¼ã·ã§ã³ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
æ大ãã¼ã¸ãµã¤ãº vs æ£ç¢ºãªãã¼ã¸ãµã¤ãº: èè ã¯ãæ£ç¢ºãªãã¼ã¸ãµã¤ãºã§ã¯ãªãæ大ãã¼ã¸ãµã¤ãºã使ç¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã«ããããµã¼ãã¼ã¯è¦æ±ããããµã¤ãºãããå°ãããã¼ã¸ãè¿ããã¨ãã§ããããã©ã¼ãã³ã¹ã¨å¹çæ§ãåä¸ãã¾ãã
ãã¼ã¸ãã¼ã¯ã³ã®ä¸éææ§: ãã¼ã¸ãã¼ã¯ã³ã¯ãã¯ã©ã¤ã¢ã³ãã«ã¨ã£ã¦æå³ãæããªãä¸éæãªæååã§ããã¹ãã§ããããã«ããããµã¼ãã¼å´ã§å®è£ ã®è©³ç´°ãå¤æ´ããæè»æ§ã確ä¿ããã¾ãã
ä¸è²«æ§ã®ç¢ºä¿: ãã¼ã¸ãã¼ã·ã§ã³ä¸ã«ãã¼ã¿ãå¤æ´ãããå¯è½æ§ããããããå®å ¨ãªä¸è²«æ§ãä¿è¨¼ãããã¨ã¯é£ããå ´åãããã¾ããèè ã¯ããã®å¶éãæ確ã«ææ¸åãããã¨ãæ¨å¥¨ãã¦ãã¾ãã
ãã¼ã¸ãã¼ã¯ã³ã®æå¹æé: ãã¼ã¸ãã¼ã¯ã³ã«æå¹æéãè¨å®ãããã¨ã§ããªã½ã¼ã¹ã®å¹ççãªç®¡çãå¯è½ã«ãªãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãã¼ã¸ãã¼ã·ã§ã³ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type ListResourcesRequest struct { PageToken string `json:"pageToken"` MaxPageSize int `json:"maxPageSize"` } type ListResourcesResponse struct { Resources []*Resource `json:"resources"` NextPageToken string `json:"nextPageToken"` } func (s *Service) ListResources(ctx context.Context, req *ListResourcesRequest) (*ListResourcesResponse, error) { // ãã¼ã¸ãã¼ã¯ã³ã®ãã³ã¼ãã¨æ¤è¨¼ offset, err := decodePageToken(req.PageToken) if err != nil { return nil, err } // ãªã½ã¼ã¹ã®åå¾ limit := min(req.MaxPageSize, 100) // æ大100件ã«å¶é resources, err := s.repository.GetResources(ctx, offset, limit+1) if err != nil { return nil, err } // 次ã®ãã¼ã¸ãã¼ã¯ã³ã®çæ var nextPageToken string if len(resources) > limit { nextPageToken = encodePageToken(offset + limit) resources = resources[:limit] } return &ListResourcesResponse{ Resources: resources, NextPageToken: nextPageToken, }, nil }
ãã®å®è£ ä¾ã§ã¯ããã¼ã¸ãã¼ã¯ã³ã使ç¨ãã¦ãªãã»ããã管çããæ大ãã¼ã¸ãµã¤ãºãå¶éãã¦ãã¾ããã¾ãã次ã®ãã¼ã¸ããããã©ãããå¤æããããã«ãè¦æ±ãããå¶éããã1ã¤å¤ãã®ãªã½ã¼ã¹ãåå¾ãã¦ãã¾ãã
ãã¼ã¸ãã¼ã·ã§ã³ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããã¼ã¸ãã¼ã·ã§ã³ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: ãã¼ã¸ãã¼ã·ã§ã³ã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãéã®ããã©ã¼ãã³ã¹ãå¤§å¹ ã«åä¸ããã¾ããããããé©åã«å®è£ ããã¦ããªãå ´åï¼ä¾ï¼ãªãã»ãããã¼ã¹ã®ãã¼ã¸ãã¼ã·ã§ã³ï¼ããã¼ã¿ãã¼ã¹ã¸ã®è² è·ãå¢å¤§ããå¯è½æ§ãããã¾ãã
ä¸è²«æ§ã¨å¯ç¨æ§ã®ãã©ã³ã¹: å®å ¨ãªä¸è²«æ§ãä¿è¨¼ãããã¨ããã¨ãã·ã¹ãã ã®å¯ç¨æ§ãä½ä¸ããå¯è½æ§ãããã¾ããèè ã¯ããã®ãã¬ã¼ããªããæ確ã«ç解ããé©åãªãã©ã³ã¹ãåããã¨ã®éè¦æ§ã強調ãã¦ãã¾ãã
ã¯ã©ã¤ã¢ã³ãå´ã®è¤éæ§: ãã¼ã¸ãã¼ã·ã§ã³ã¯ãã¯ã©ã¤ã¢ã³ãå´ã®å®è£ ãè¤éã«ããå¯è½æ§ãããã¾ããç¹ã«ãå ¨ãã¼ã¿ãåå¾ããå¿ è¦ãããå ´åãã¯ã©ã¤ã¢ã³ãã¯è¤æ°ã®ãªã¯ã¨ã¹ãã管çããå¿ è¦ãããã¾ãã
ãã£ãã·ã¥æ¦ç¥: ãã¼ã¸ãã¼ã·ã§ã³ã¯ããã£ãã·ã¥æ¦ç¥ã«å½±é¿ãä¸ãã¾ããåãã¼ã¸ãåå¥ã«ãã£ãã·ã¥ããå¿ è¦ãããããã¼ã¿ã®æ´æ°é »åº¦ã«ãã£ã¦ã¯ãã£ãã·ã¥ã®æå¹æ§ãä½ä¸ããå¯è½æ§ãããã¾ãã
ãããã®å½±é¿ã¨ãã¬ã¼ããªããèæ ®ããªããããã¼ã¸ãã¼ã·ã§ã³ã®å®è£ ãæ¤è¨ããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ãã¼ã¸ãã¼ã·ã§ã³ã¯ããã¤ã¯ããµã¼ãã¹éã§ã®ãã¼ã¿è»¢éãæé©åããä¸ã§éè¦ãªå½¹å²ãæããã¾ããåãµã¼ãã¹ã大éã®ãã¼ã¿ãå¹ççã«å¦çãããããã¯ã¼ã¯å¸¯åå¹ ãæé©åãããã¨ã§ãã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ãåä¸ãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®é£æº: ãã¼ã¸ãã¼ã·ã§ã³ã¯ãã¤ãã³ãã¹ããªã¼ã ã®å¦çã«ãå¿ç¨ã§ãã¾ãã大éã®ã¤ãã³ããå¦çããéã«ããã¼ã¸ãã¼ã·ã§ã³ã使ç¨ãããã¨ã§ãæ¶è²»è ã管çå¯è½ãªãã£ã³ã¯ã§ã¤ãã³ããå¦çã§ããããã«ãªãã¾ãã
ãã¼ã¿ã®ä¸è²«æ§ã¨é®®åº¦: ãã¼ã¸ãã¼ã·ã§ã³ä¸ã«ãã¼ã¿ãå¤æ´ãããå¯è½æ§ãããããããã¼ã¿ã®ä¸è²«æ§ã¨é®®åº¦ã®ãã©ã³ã¹ãåãå¿ è¦ãããã¾ããç¹ã«ããªã¢ã«ã¿ã¤ã æ§ãæ±ããããã·ã¹ãã ã§ã¯ããã®ç¹ã«æ³¨æãå¿ è¦ã§ãã
ã¯ã¨ãªããã©ã¼ãã³ã¹ã®æé©å: ãã¼ã¸ãã¼ã·ã§ã³ã®å®è£ æ¹æ³ã«ãã£ã¦ã¯ããã¼ã¿ãã¼ã¹ã¸ã®è² è·ãå¢å¤§ããå¯è½æ§ãããã¾ããç¹ã«ããªãã»ãããã¼ã¹ã®ãã¼ã¸ãã¼ã·ã§ã³ã¯å¤§è¦æ¨¡ãªãã¼ã¿ã»ããã§åé¡ãçºçããå¯è½æ§ãããã¾ããã«ã¼ã½ã«ãã¼ã¹ã®ãã¼ã¸ãã¼ã·ã§ã³ãªã©ãããå¹ççãªæ¹æ³ãæ¤è¨ããå¿ è¦ãããã¾ãã
ã¬ã¹ãã³ã¹ã¿ã¤ã ã®ä¸è²«æ§: ãã¼ã¸ãµã¤ãºãåºå®ãããã¨ã§ãåãªã¯ã¨ã¹ãã®ã¬ã¹ãã³ã¹ã¿ã¤ã ãããä¸è²«ãããã®ã«ãããã¨ãã§ãã¾ããããã¯ãã·ã¹ãã ã®äºæ¸¬å¯è½æ§ã¨ä¿¡é ¼æ§ãåä¸ãããä¸ã§éè¦ã§ãã
ã¨ã©ã¼å¦çã¨ãªãã©ã¤æ¦ç¥: ãã¼ã¸ãã¼ã·ã§ã³ã使ç¨ããéã¯ããããã¯ã¼ã¯ã¨ã©ã¼ãã¿ã¤ã ã¢ã¦ãã«å¯¾ããé©åãªã¨ã©ã¼å¦çã¨ãªãã©ã¤æ¦ç¥ãéè¦ã«ãªãã¾ããç¹ã«ãé·æéã«ããããã¼ã¿åå¾ããã»ã¹ã§ã¯ããã®ç¹ã«æ³¨æãå¿ è¦ã§ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: ãã¼ã¸ãã¼ã·ã§ã³ã®ä½¿ç¨ãã¿ã¼ã³ãç£è¦ãããã¨ã§ãã·ã¹ãã ã®ä½¿ç¨ç¶æ³ãããã«ããã¯ãç¹å®ãããã¨ãã§ãã¾ããä¾ãã°ãç¹å®ã®ãã¼ã¸ãµã¤ãºããã£ã«ã¿æ¡ä»¶ãé »ç¹ã«ä½¿ç¨ããã¦ããå ´åããããã«å¯¾ãã¦æé©åãè¡ããã¨ãã§ãã¾ãã
ãã¼ã¸ãã¼ã·ã§ã³ã¨å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£
ãã¼ã¸ãã¼ã·ã§ã³ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¿ã¢ãã«ã¨ã¤ã³ããã¯ã¹è¨è¨: å¹ççãªãã¼ã¸ãã¼ã·ã§ã³ãå®ç¾ããããã«ã¯ãé©åãªãã¼ã¿ã¢ãã«ã¨ã¤ã³ããã¯ã¹è¨è¨ãä¸å¯æ¬ ã§ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãå ´åããã®ç¹ãéè¦ã«ãªãã¾ãã
ãã£ãã·ã¥æ¦ç¥: ãã¼ã¸ãã¼ã·ã§ã³ã使ç¨ããå ´åãåãã¼ã¸ãåå¥ã«ãã£ãã·ã¥ããå¿ è¦ãããã¾ããããã«ããããã£ãã·ã¥æ¦ç¥ãè¤éã«ãªãå¯è½æ§ãããã¾ããç¹ã«ããã¼ã¿ã®æ´æ°é »åº¦ãé«ãå ´åããã£ãã·ã¥ã®æå¹æ§ãä½ä¸ããå¯è½æ§ãããã¾ãã
è² è·åæ£ã¨ã¹ã±ã¼ãªã³ã°: ãã¼ã¸ãã¼ã·ã§ã³ã使ç¨ãããã¨ã§ãã·ã¹ãã ã®è² è·ãããåçã«åæ£ããããã¨ãã§ãã¾ããããã«ãããã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ãåä¸ãã¾ãã
ããã¯ã¨ã³ããµã¼ãã¹ã®è¨è¨: ãã¼ã¸ãã¼ã·ã§ã³ãå¹ççã«å®è£ ããããã«ã¯ãããã¯ã¨ã³ããµã¼ãã¹ã®è¨è¨ãé©åã«è¡ãå¿ è¦ãããã¾ããç¹ã«ããã¼ã¿ãã¼ã¹ã¯ã¨ãªã®æé©åãããã¼ã¸ãã¼ã¯ã³ã®çæã¨ç®¡çãéè¦ã«ãªãã¾ãã
APIè¨è¨ã®ä¸è²«æ§: ãã¼ã¸ãã¼ã·ã§ã³ã®è¨è¨ã¯ãAPIå ¨ä½ã®è¨è¨ã¨ä¸è²«æ§ãä¿ã¤å¿ è¦ãããã¾ããä¾ãã°ããã¼ã¸ãã¼ã·ã§ã³ãã©ã¡ã¼ã¿ã®å½åè¦åããã¬ã¹ãã³ã¹å½¢å¼ãªã©ãçµ±ä¸ãããã¨ãéè¦ã§ãã
çµè«
第21ç« ãPaginationãã¯ãAPIã«ããããã¼ã¸ãã¼ã·ã§ã³ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®ä½¿ãããããå¹çæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã¼ã¸ãã¼ã·ã§ã³ã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãéã«ä¸å¯æ¬ ãªæ©è½ã§ãã
æ大ãã¼ã¸ãµã¤ãºã使ç¨ããæ£ç¢ºãªãã¼ã¸ãµã¤ãºãä¿è¨¼ããªããã¨ã§ãã·ã¹ãã ã®æè»æ§ã¨å¹çæ§ãåä¸ãã¾ãã
ãã¼ã¸ãã¼ã¯ã³ã¯ä¸éæã§ããã¹ãã§ãã¯ã©ã¤ã¢ã³ãã¯ãã®å 容ãç解ãããæä½ãããããå¿ è¦ã¯ããã¾ããã
ãã¼ã¿ã®ä¸è²«æ§ã¨å¯ç¨æ§ã®ãã©ã³ã¹ãåããã¨ãéè¦ã§ããå®å ¨ãªä¸è²«æ§ãä¿è¨¼ãããã¨ã¯é£ããå ´åãããããã®å¶éãæ確ã«ææ¸åããå¿ è¦ãããã¾ãã
ãã¼ã¸ãã¼ã·ã§ã³ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ãããã©ã¼ãã³ã¹ãã¹ã±ã¼ã©ããªãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ä½¿ãããããå¹ççã§ãã¹ã±ã¼ã©ãã«ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãå ´åãããªã½ã¼ã¹ãå¶éããã¦ããç°å¢ï¼ã¢ãã¤ã«ã¢ããªã±ã¼ã·ã§ã³ãªã©ï¼ã§ã®APIã®ä½¿ç¨ãæ³å®ãã¦ããå ´åããã¼ã¸ãã¼ã·ã§ã³ã¯æ¥µãã¦éè¦ãªå½¹å²ãæããã¾ãã
ãããããã¼ã¸ãã¼ã·ã§ã³ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ããã¼ã¿ã®ä¸è²«æ§ãã¯ã©ã¤ã¢ã³ãå´ã®è¤éæ§ããã£ãã·ã¥æ¦ç¥ãªã©ã®å´é¢ã§èª²é¡ãçããå¯è½æ§ãããã¾ãããããã®èª²é¡ã«é©åã«å¯¾å¦ããããã«ã¯ãã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããã¼ã¸ãã¼ã·ã§ã³ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ãããã¼ã¸ãã¼ã·ã§ã³ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§å¹ççãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
22 Filtering
ãAPI Design Patternsãã®ç¬¬22ç« ãFilteringãã¯ãAPIã«ããããã£ã«ã¿ãªã³ã°æ©è½ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãã£ã«ã¿ãªã³ã°ãåãªã便å©ãªæ©è½ã§ã¯ãªããAPIã®å¹çæ§ã使ãããããããã¦å ¨ä½çãªã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãã£ã«ã¿ãªã³ã°ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãæ¨æºçãªãªã¹ãæä½ã ãã§ã¯ç¹å®ã®æ¡ä»¶ã«åè´ãããªã½ã¼ã¹ã®ã¿ãåå¾ãããã¨ãå°é£ã§ããã¨ããåé¡æèµ·ããè°è«ãå§ãã¦ãã¾ãã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãç¾ä»£ã®ã·ã¹ãã ã«ããã¦ãã¯ã©ã¤ã¢ã³ããå ¨ã¦ã®ãªã½ã¼ã¹ãåå¾ãã¦ããå¿ è¦ãªãã¼ã¿ããã£ã«ã¿ãªã³ã°ããã¨ããã¢ããã¼ãã¯ãéå¹ççã§ãããã·ã¹ãã ãªã½ã¼ã¹ã®ç¡é§é£ãã«ã¤ãªããã¾ãã
ãã®åé¡ã¯ãç¹ã«ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦é¡èã§ããä¾ãã°ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ã大éã®ãã¼ã¿ãå¹ççã«å¦çãããããã¯ã¼ã¯å¸¯åå¹ ãæé©åããå¿ è¦ãããã¾ãããµã¼ãã¼ãµã¤ãã§ã®ãã£ã«ã¿ãªã³ã°ã¯ããã®ãããªç°å¢ã§ã®ãã¼ã¿è»¢éãæé©åããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ã¨å¿çæ§ãåä¸ãããéè¦ãªæ段ã¨ãªãã¾ãã
èè
ã¯ããã£ã«ã¿ãªã³ã°ã®åºæ¬çãªå®è£
ã¨ãã¦ãæ¨æºçãªãªã¹ããªã¯ã¨ã¹ãã«filter
ãã£ã¼ã«ãã追å ãããã¨ãææ¡ãã¦ãã¾ãããã®ãã£ã¼ã«ããéãã¦ãã¯ã©ã¤ã¢ã³ãã¯å¿
è¦ãªãã¼ã¿ã®æ¡ä»¶ãæå®ãããµã¼ãã¼ã¯ãã®æ¡ä»¶ã«åè´ãããªã½ã¼ã¹ã®ã¿ãè¿ããã¨ãã§ãã¾ãã
ãã£ã«ã¿ãªã³ã°ã®å®è£
èè ã¯ããã£ã«ã¿ãªã³ã°ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã£ã«ã¿ã¼è¡¨ç¾ã®æ§é : èè ã¯ãæ§é åããããã£ã«ã¿ã¼ï¼ä¾ï¼JSONãªãã¸ã§ã¯ãï¼ã§ã¯ãªããæååãã¼ã¹ã®ãã£ã«ã¿ã¼è¡¨ç¾ãæ¨å¥¨ãã¦ãã¾ããããã«ãããAPIã®æè»æ§ãåä¸ããå°æ¥çãªæ¡å¼µã容æã«ãªãã¾ãã
å®è¡æéã®èæ ®: ãã£ã«ã¿ã¼å¼ã®è©ä¾¡ã¯ãåä¸ã®ãªã½ã¼ã¹ã®ã³ã³ããã¹ãå ã§å®çµãã¹ãã§ãããå¤é¨ãã¼ã¿ã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãè¤éãªè¨ç®ãå«ãã¹ãã§ã¯ããã¾ãããããã«ããããã£ã«ã¿ãªã³ã°æä½ã®äºæ¸¬å¯è½æ§ã¨å¹çæ§ã確ä¿ããã¾ãã
é åè¦ç´ ã®ã¢ãã¬ã¹æå®: èè ã¯ãé åå ã®ç¹å®ã®ä½ç½®ã®è¦ç´ ãåç §ãããã£ã«ã¿ãªã³ã°ãé¿ãã代ããã«é åå ã®è¦ç´ ã®åå¨ããã§ãã¯ããã¢ããã¼ããæ¨å¥¨ãã¦ãã¾ããããã«ããããã¼ã¿ã®é åºã«ä¾åããªãæè»ãªãã£ã«ã¿ãªã³ã°ãå¯è½ã«ãªãã¾ãã
å³æ ¼æ§: ãã£ã«ã¿ã¼å¼ã®è§£éã¯å³æ ¼ã§ããã¹ãã§ãããã¾ããªè¡¨ç¾ãåã®ä¸ä¸è´ã¯è¨±å®¹ãããã¨ã©ã¼ã¨ãã¦æ±ãã¹ãã§ããããã«ããããã£ã«ã¿ãªã³ã°ã®ä¿¡é ¼æ§ã¨äºæ¸¬å¯è½æ§ãåä¸ãã¾ãã
ã«ã¹ã¿ã é¢æ°: åºæ¬çãªãã£ã«ã¿ãªã³ã°æ©è½ã§ã¯ä¸ååãªå ´åã«åãã¦ãã«ã¹ã¿ã é¢æ°ã®å°å ¥ãææ¡ãã¦ãã¾ããããã«ãããè¤éãªãã£ã«ã¿ãªã³ã°è¦ä»¶ã«ã対å¿ã§ãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãã£ã«ã¿ãªã³ã°å®è£ ã®ä¾ã以ä¸ã«ç¤ºãã¾ãã
type ListResourcesRequest struct { Filter string `json:"filter"` MaxPageSize int `json:"maxPageSize"` PageToken string `json:"pageToken"` } func (s *Service) ListResources(ctx context.Context, req *ListResourcesRequest) (*ListResourcesResponse, error) { filter, err := parseFilter(req.Filter) if err != nil { return nil, fmt.Errorf("invalid filter: %w", err) } resources, err := s.repository.GetResources(ctx) if err != nil { return nil, err } var filteredResources []*Resource for _, resource := range resources { if filter.Evaluate(resource) { filteredResources = append(filteredResources, resource) } } // ãã¼ã¸ãã¼ã·ã§ã³ã®å¦ç // ... return &ListResourcesResponse{ Resources: filteredResources, NextPageToken: nextPageToken, }, nil }
ãã®å®è£ ä¾ã§ã¯ããã£ã«ã¿ã¼æååããã¼ã¹ããåãªã½ã¼ã¹ã«å¯¾ãã¦è©ä¾¡é¢æ°ãé©ç¨ãã¦ãã¾ãããã£ã«ã¿ã¼ã®è§£æã¨è©ä¾¡ã¯å³æ ¼ã«è¡ãããç¡å¹ãªãã£ã«ã¿ã¼ãåã®ä¸ä¸è´ã¯ã¨ã©ã¼ã¨ãã¦æ±ããã¾ãã
ãã£ã«ã¿ãªã³ã°ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããã£ã«ã¿ãªã³ã°æ©è½ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: ãµã¼ãã¼ãµã¤ãã§ã®ãã£ã«ã¿ãªã³ã°ã¯ããããã¯ã¼ã¯å¸¯åå¹ ã®ä½¿ç¨ãæé©åããã¯ã©ã¤ã¢ã³ãã®å¦çè² è·ã軽æ¸ãã¾ããããããè¤éãªãã£ã«ã¿ã¼å¼ã®è©ä¾¡ã¯ãµã¼ãã¼ãªã½ã¼ã¹ãæ¶è²»ããå¯è½æ§ãããã¾ãã
æè»æ§ã¨è¤éæ§ã®ãã©ã³ã¹: æååãã¼ã¹ã®ãã£ã«ã¿ã¼è¡¨ç¾ã¯é«ãæè»æ§ãæä¾ãã¾ããã解æã¨è©ä¾¡ã®è¤éããå¢å ãã¾ããããã¯ãã¨ã©ã¼ãã³ããªã³ã°ã¨ã»ãã¥ãªãã£ã®è¦³ç¹ããæ éã«ç®¡çããå¿ è¦ãããã¾ãã
ä¸è²«æ§ã¨å¯ç¨æ§: ãã£ã«ã¿ãªã³ã°çµæã®ä¸è²«æ§ãä¿è¨¼ãããã¨ã¯ãç¹ã«åæ£ã·ã¹ãã ã«ããã¦èª²é¡ã¨ãªãã¾ãããã¼ã¿ã®æ´æ°ã¨ãã£ã«ã¿ãªã³ã°æä½ã®ã¿ã¤ãã³ã°ã«ãã£ã¦ã¯ãçµæãç°ãªãå¯è½æ§ãããã¾ãã
ã»ãã¥ãªãã£ã®èæ ®: ãã£ã«ã¿ã¼å¼ã®è©ä¾¡ã¯ãæ½å¨çãªã»ãã¥ãªãã£ãªã¹ã¯ãä¼´ãã¾ããã¤ã³ã¸ã§ã¯ã·ã§ã³æ»æãé度ã«è¤éãªã¯ã¨ãªã«ããDoSæ»æã®å¯è½æ§ã«æ³¨æããå¿ è¦ãããã¾ãã
ãããã®ãã¬ã¼ããªããé©åã«ç®¡çãããã¨ãããã£ã«ã¿ãªã³ã°æ©è½ã®æåçãªå®è£ ã®éµã¨ãªãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ãã£ã«ã¿ãªã³ã°ã¯ãã¤ã¯ããµã¼ãã¹éã®ãã¼ã¿äº¤æãæé©åããä¸ã§éè¦ãªå½¹å²ãæããã¾ããåãµã¼ãã¹ãå¿ è¦æå°éã®ãã¼ã¿ã®ã¿ãè¦æ±ã»æä¾ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®å¹çæ§ãåä¸ãã¾ãã
ã¯ã¨ãªæé©å: ãã£ã«ã¿ãªã³ã°æ©è½ã¯ããã¼ã¿ãã¼ã¹ã¯ã¨ãªã®æé©åã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããå¹ççãªã¤ã³ããã¯ã¹è¨è¨ãã¯ã¨ãªãã©ã³ã®æé©åãããã£ã«ã¿ãªã³ã°ã®ããã©ã¼ãã³ã¹ã«å¤§ããªå½±é¿ãä¸ãã¾ãã
ãã£ãã·ã¥æ¦ç¥: ãã£ã«ã¿ãªã³ã°çµæã®ãã£ãã·ã³ã°ã¯ãã·ã¹ãã ã®ããã©ã¼ãã³ã¹ãå¤§å¹ ã«åä¸ãããå¯è½æ§ãããã¾ãããããããã£ãã·ã¥ã®æå¹æ§ã¨ãã¼ã¿ã®é®®åº¦ã®ãã©ã³ã¹ãåããã¨ã課é¡ã¨ãªãã¾ãã
ãã¼ã¸ã§ãã³ã°ã¨å¾æ¹äºææ§: ãã£ã«ã¿ã¼æ§æã®é²åã¯ãAPIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã«å½±é¿ãä¸ãã¾ããæ°æ©è½ã®è¿½å ãå¤æ´ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ããªããããæ éã«ç®¡çããå¿ è¦ãããã¾ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: ãã£ã«ã¿ãªã³ã°æä½ã®ããã©ã¼ãã³ã¹ã¨ä½¿ç¨ãã¿ã¼ã³ãç£è¦ãããã¨ã§ãã·ã¹ãã ã®æé©åæ©ä¼ãç¹å®ã§ãã¾ããä¾ãã°ãé »ç¹ã«ä½¿ç¨ããããã£ã«ã¿ã¼ãã¿ã¼ã³ã«å¯¾ãã¦ç¹å¥ãªæé©åãè¡ããã¨ãå¯è½ã«ãªãã¾ãã
ãã£ã«ã¿ãªã³ã°ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã£
ãã£ã«ã¿ãªã³ã°æ©è½ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¿ã¢ãã«ã¨ã¹ãã¼ãè¨è¨: å¹ççãªãã£ã«ã¿ãªã³ã°ãå®ç¾ããããã«ã¯ãé©åãªãã¼ã¿ã¢ãã«ã¨ã¹ãã¼ãè¨è¨ãä¸å¯æ¬ ã§ãããã£ã«ã¿ãªã³ã°ãé »ç¹ã«è¡ããããã£ã¼ã«ãã«å¯¾ãã¦ã¯ãé©åãªã¤ã³ããã¯ã¹ãè¨å®ããå¿ è¦ãããã¾ãã
åæ£ã·ã¹ãã ã«ããããã£ã«ã¿ãªã³ã°: ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ããã£ã«ã¿ãªã³ã°ã¯ãã°ãã°è¤æ°ã®ãµã¼ãã¹ã«ã¾ããã£ã¦è¡ãããå¿ è¦ãããã¾ãããã®ãããªå ´åããã£ã«ã¿ãªã³ã°ãã¸ãã¯ã®é ç½®ã¨å®è¡æ¹æ³ãæ éã«è¨è¨ããå¿ è¦ãããã¾ãã
ãªã¢ã«ã¿ã¤ã ã·ã¹ãã ã¨ã®çµ±å: ã¹ããªã¼ãã³ã°ãã¼ã¿ãå®æéæ§ã®é«ãã·ã¹ãã ã«ããã¦ããã£ã«ã¿ãªã³ã°ã¯ããè¤éã«ãªãã¾ãããã¼ã¿ã®å°çã¨å¦çã®ã¿ã¤ãã³ã°ãèæ ®ãããã£ã«ã¿ãªã³ã°æ¦ç¥ãå¿ è¦ã¨ãªãã¾ãã
ã»ãã¥ãªãã£ã¢ã¼ããã¯ãã£: ãã£ã«ã¿ãªã³ã°æ©è½ã¯ããã¼ã¿ã¢ã¯ã»ã¹å¶å¾¡ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããã¦ã¼ã¶ã¼ã®æ¨©éã«åºã¥ãã¦ããã£ã«ã¿ãªã³ã°å¯è½ãªãã¼ã¿ã®ç¯å²ãå¶éããå¿ è¦ãããã¾ãã
ã¨ã©ã¼å¦çã¨ã¬ã¸ãªã¨ã³ã¹: ãã£ã«ã¿ãªã³ã°æä½ã®å¤±æãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ãæå°éã«æãããããé©åãªã¨ã©ã¼å¦çã¨ãã©ã¼ã«ããã¯æ©æ§ãå®è£ ããå¿ è¦ãããã¾ãã
çµè«
第22ç« ãFilteringãã¯ãAPIã«ããããã£ã«ã¿ãªã³ã°æ©è½ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®ä½¿ãããããå¹çæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®ããã©ã¼ãã³ã¹ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã£ã«ã¿ãªã³ã°ã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãç¾ä»£ã®ã·ã¹ãã ã«ããã¦ä¸å¯æ¬ ãªæ©è½ã§ãã
æååãã¼ã¹ã®ãã£ã«ã¿ã¼è¡¨ç¾ã使ç¨ãããã¨ã§ãAPIã®æè»æ§ã¨æ¡å¼µæ§ãåä¸ãã¾ãã
ãã£ã«ã¿ã¼å¼ã®è©ä¾¡ã¯ãåä¸ã®ãªã½ã¼ã¹ã®ã³ã³ããã¹ãå ã§å®çµããå¤é¨ãã¼ã¿ã½ã¼ã¹ã¸ã®ã¢ã¯ã»ã¹ãé¿ããã¹ãã§ãã
ãã£ã«ã¿ã¼å¼ã®è§£éã¯å³æ ¼ã§ããã¹ãã§ãããã¾ããªè¡¨ç¾ãåã®ä¸ä¸è´ã¯ã¨ã©ã¼ã¨ãã¦æ±ãã¹ãã§ãã
ã«ã¹ã¿ã é¢æ°ã®å°å ¥ã«ãããè¤éãªãã£ã«ã¿ãªã³ã°è¦ä»¶ã«ã対å¿ã§ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ä½¿ãããããå¹ççã§ãã¹ã±ã¼ã©ãã«ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãå ´åãããªã½ã¼ã¹ãå¶éããã¦ããç°å¢ï¼ã¢ãã¤ã«ã¢ããªã±ã¼ã·ã§ã³ãªã©ï¼ã§ã®APIã®ä½¿ç¨ãæ³å®ãã¦ããå ´åãé©åãªãã£ã«ã¿ãªã³ã°æ©è½ã®å®è£ ã¯æ¥µãã¦éè¦ã§ãã
ãããããã£ã«ã¿ãªã³ã°æ©è½ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãããã©ã¼ãã³ã¹ãã»ãã¥ãªãã£ããã¼ã¿ã®ä¸è²«æ§ãªã©ã®å´é¢ã§èª²é¡ãçããå¯è½æ§ãããã¾ãããããã®èª²é¡ã«é©åã«å¯¾å¦ããããã«ã¯ãã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããã£ã«ã¿ãªã³ã°æ©è½ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ä½¿ãããããåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®å¹çæ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ãããã£ã«ã¿ãªã³ã°æ©è½ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§å¹ççãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
23 Importing and exporting
ãAPI Design Patternsãã®ç¬¬23ç« ãImporting and exportingãã¯ãAPIã«ããããã¼ã¿ã®ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãæ©è½ãåãªããã¼ã¿ç§»åã®æ段ã§ã¯ãªããAPIã®å¹çæ§ãæè»æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãç¾ä»£ã®ã·ã¹ãã ã«ããã¦ãå¹ççãªãã¼ã¿ã®ç§»åãä¸å¯æ¬ ã§ããã¨ããåé¡æèµ·ããè°è«ãå§ãã¦ãã¾ããå¾æ¥ã®ã¢ããã¼ãã§ã¯ãã¯ã©ã¤ã¢ã³ãã¢ããªã±ã¼ã·ã§ã³ãAPIãããã¼ã¿ãåå¾ãããããå¤é¨ã¹ãã¬ã¼ã¸ã«ä¿åããï¼ã¾ãã¯ãã®éï¼ã¨ããæ¹æ³ãä¸è¬çã§ããããããããã®ã¢ããã¼ãã«ã¯å¤§ããªåé¡ãããã¾ããç¹ã«ããã¼ã¿ãAPIãµã¼ãã¼ã¨ã¹ãã¬ã¼ã¸ã·ã¹ãã ã®è¿ãã«ä½ç½®ãã¦ããã«ãããããããã¯ã©ã¤ã¢ã³ãã¢ããªã±ã¼ã·ã§ã³ãé éå°ã«ããå ´åã大éã®ãã¼ã¿è»¢éãå¿ è¦ã¨ãªããå¹çãèããä½ä¸ãã¾ãã
èè
ã¯ããã®åé¡ã解決ããããã«ãAPIãµã¼ãã¼ãç´æ¥å¤é¨ã¹ãã¬ã¼ã¸ã·ã¹ãã ã¨ããåãããã«ã¹ã¿ã ã¡ã½ãããå°å
¥ãããã¨ãææ¡ãã¦ãã¾ããå
·ä½çã«ã¯ãimport
ã¨export
ã¨ãã2ã¤ã®ã«ã¹ã¿ã ã¡ã½ããã§ãããããã®ã¡ã½ããã¯ããã¼ã¿ã®è»¢éã ãã§ãªããAPIãªã½ã¼ã¹ã¨ãã¤ããã¼ã¿éã®å¤æãæ
å½ãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãã¤ã¯ããµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ã大éã®ãã¼ã¿ãå¹ççã«å¦çãããããã¯ã¼ã¯å¸¯åå¹ ãæé©åããå¿ è¦ãããã¾ããã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ãé©åã«è¨è¨ãããã¨ã§ããµã¼ãã¹éã®ãã¼ã¿ç§»åãæé©åããã·ã¹ãã å ¨ä½ã®ããã©ã¼ãã³ã¹ã¨å¿çæ§ãåä¸ããããã¨ãã§ãã¾ãã
ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®å®è£
èè ã¯ãã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«æ³¨ç®ãã¹ãç¹ã¯ä»¥ä¸ã®éãã§ãã
æ§é ã®åé¢: èè ã¯ããã¼ã¿ã®è»¢éã¨å¤æãå¥ã ã®è¨å®ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ç®¡çãããã¨ãææ¡ãã¦ãã¾ããå ·ä½çã«ã¯ã
DataSource
/DataDestination
ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãã¼ã¿ã®ç§»åããInputConfig
/OutputConfig
ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãã¼ã¿ã®å¤æã管çãã¾ãããã®åé¢ã«ãããã·ã¹ãã ã®æè»æ§ã¨åå©ç¨æ§ãå¤§å¹ ã«åä¸ãã¾ããé·æéå®è¡æä½ï¼LROï¼: ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãæä½ã¯æéããããå¯è½æ§ããããããèè ã¯ãããã®æä½ãLROã¨ãã¦å®è£ ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã«ãããã¯ã©ã¤ã¢ã³ãã¯æä½ã®é²è¡ç¶æ³ã追跡ããå®äºãå¾ ã¤ãã¨ãã§ãã¾ãã
ä¸è²«æ§ã®èæ ®: ã¨ã¯ã¹ãã¼ãæä½ä¸ã«ãã¼ã¿ãå¤æ´ãããå¯è½æ§ããããããèè ã¯ãã¼ã¿ã®ä¸è²«æ§ã«ã¤ãã¦æ éã«æ¤è¨ãã¦ãã¾ããå®å ¨ãªä¸è²«æ§ãä¿è¨¼ã§ããªãå ´åããã¹ã¡ã¢ãï¼ä¸æçãªä¸æ´åï¼ãçºçããå¯è½æ§ããããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
èå¥åã®æ±ã: ã¤ã³ãã¼ãæã«èå¥åãã©ã®ããã«æ±ããã«ã¤ãã¦ãèè ã¯æ éãªã¢ããã¼ããææ¡ãã¦ãã¾ããç¹ã«ãæ¢åã®ãªã½ã¼ã¹ã¨ã®è¡çªãé¿ãããããã¤ã³ãã¼ãæã«æ°ããèå¥åãçæãããã¨ãæ¨å¥¨ãã¦ãã¾ãã
失æã¨ãªãã©ã¤ã®å¦ç: ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãæä½ã®å¤±æã¨ãªãã©ã¤ã«ã¤ãã¦ãèè ã¯è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ããç¹ã«ãã¤ã³ãã¼ãæä½ã®ãªãã©ã¤æã«éè¤ãªã½ã¼ã¹ãä½æãããªãããã
importRequestId
ã®ä½¿ç¨ãææ¡ãã¦ãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type ImportExportService struct { // ãµã¼ãã¹ã®ä¾åé¢ä¿ } func (s *ImportExportService) ExportResources(ctx context.Context, req *ExportRequest) (*longrunning.Operation, error) { op := &longrunning.Operation{ Name: fmt.Sprintf("operations/export_%s", uuid.New().String()), } go s.runExport(ctx, req, op) return op, nil } func (s *ImportExportService) runExport(ctx context.Context, req *ExportRequest, op *longrunning.Operation) { // ã¨ã¯ã¹ãã¼ããã¸ãã¯ã®å®è£ // 1. ãªã½ã¼ã¹ã®åå¾ // 2. ãã¼ã¿ã®å¤æï¼OutputConfigã«åºã¥ãï¼ // 3. å¤é¨ã¹ãã¬ã¼ã¸ã¸ã®æ¸ãè¾¼ã¿ï¼DataDestinationã«åºã¥ãï¼ // 4. é²æã®æ´æ° } func (s *ImportExportService) ImportResources(ctx context.Context, req *ImportRequest) (*longrunning.Operation, error) { op := &longrunning.Operation{ Name: fmt.Sprintf("operations/import_%s", uuid.New().String()), } go s.runImport(ctx, req, op) return op, nil } func (s *ImportExportService) runImport(ctx context.Context, req *ImportRequest, op *longrunning.Operation) { // ã¤ã³ãã¼ããã¸ãã¯ã®å®è£ // 1. å¤é¨ã¹ãã¬ã¼ã¸ããã®ãã¼ã¿èªã¿åãï¼DataSourceã«åºã¥ãï¼ // 2. ãã¼ã¿ã®å¤æï¼InputConfigã«åºã¥ãï¼ // 3. ãªã½ã¼ã¹ã®ä½æï¼importRequestIdã使ç¨ãã¦éè¤ãé²ãï¼ // 4. é²æã®æ´æ° }
ãã®å®è£ ä¾ã§ã¯ãã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãæä½ãéåæã§å®è¡ããLROãéãã¦é²æã追跡ã§ããããã«ãã¦ãã¾ããã¾ãããã¼ã¿ã®è»¢éã¨å¤æãåé¢ããæè»æ§ã確ä¿ãã¦ãã¾ãã
ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ãã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£: APIãµã¼ãã¼ãç´æ¥å¤é¨ã¹ãã¬ã¼ã¸ã¨ããåããããã¨ã§ããã¼ã¿è»¢éã®å¹çãå¤§å¹ ã«åä¸ãã¾ããããããããã¯APIãµã¼ãã¼ã®è² è·ãå¢å ãããå¯è½æ§ãããã¾ãã
ä¸è²«æ§ã¨å¯ç¨æ§ã®ãã©ã³ã¹: ã¨ã¯ã¹ãã¼ãä¸ã®ãã¼ã¿ä¸è²«æ§ãä¿è¨¼ãããã¨ã¯é£ããããã¹ã¡ã¢ããçºçããå¯è½æ§ãããã¾ããå®å ¨ãªä¸è²«æ§ãæ±ããã¨ãã·ã¹ãã ã®å¯ç¨æ§ãä½ä¸ããå¯è½æ§ãããã¾ãã
ã»ãã¥ãªãã£ã®èæ ®: APIãµã¼ãã¼ãå¤é¨ã¹ãã¬ã¼ã¸ã«ç´æ¥ã¢ã¯ã»ã¹ãããã¨ã§ãæ°ããªã»ãã¥ãªãã£ä¸ã®èª²é¡ãçããå¯è½æ§ãããã¾ããé©åãªã¢ã¯ã»ã¹å¶å¾¡ã¨èªè¨¼ã¡ã«ããºã ãä¸å¯æ¬ ã§ãã
éç¨ã®è¤éã: ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã®å°å ¥ã«ãããã·ã¹ãã ã®éç¨ãè¤éã«ãªãå¯è½æ§ãããã¾ããç¹ã«ã失æãããªãºã¬ã¼ã·ã§ã³ã®å¦çã¨ãªã«ããªã¼ã«ã¯æ³¨æãå¿ è¦ã§ãã
ããã¯ã¢ãã/ãªã¹ãã¢ã¨ã®éã: èè ã¯ãã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ãããã¯ã¢ãã/ãªã¹ãã¢æ©è½ã¨ã¯ç°ãªããã¨ã強調ãã¦ãã¾ãããã®éããç解ããé©åã«ä½¿ãåãããã¨ãéè¦ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ããã¤ã¯ããµã¼ãã¹éã®ãã¼ã¿ç§»åãæé©åããä¸ã§éè¦ãªå½¹å²ãæããã¾ããåãµã¼ãã¹ãç¬èªã®ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ãæã¤ãã¨ã§ããµã¼ãã¹éã®ãã¼ã¿äº¤æãå¹çåããã¾ãã
ã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã®æ´»ç¨: ã¯ã©ã¦ãã¹ãã¬ã¼ã¸ãµã¼ãã¹ï¼ä¾ï¼Amazon S3ãGoogle Cloud Storageï¼ã¨ã®ç´æ¥çµ±åã«ããããã¼ã¿ã®ç§»åã¨å¦çãå¹çåã§ãã¾ãã
大è¦æ¨¡ãã¼ã¿å¦ç: ããã°ãã¼ã¿åæãæ©æ¢°å¦ç¿ã®ããã®ãã¼ã¿æºåã«ããã¦ãå¹ççãªã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ä¸å¯æ¬ ã§ãã
ã³ã³ãã©ã¤ã¢ã³ã¹ã¨ãã¼ã¿ã¬ããã³ã¹: ãã¼ã¿ã®ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæä½ãAPIã¬ãã«ã§å¶å¾¡ãããã¨ã§ããã¼ã¿ã®æµããä¸å 管çããã³ã³ãã©ã¤ã¢ã³ã¹è¦ä»¶ã¸ã®å¯¾å¿ã容æã«ãã¾ãã
é害復æ§ã¨ã·ã¹ãã 移è¡: é©åã«è¨è¨ãããã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ãç½å®³å¾©æ§ãã·ã¹ãã 移è¡ã·ããªãªã«ããã¦ãæç¨ã§ãã
çµè«
第23ç« ãImporting and exportingãã¯ãAPIã«ããããã¼ã¿ã®ã¤ã³ãã¼ãã¨ã¨ã¯ã¹ãã¼ãã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®å¹çæ§ãæè»æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ãAPIãµã¼ãã¼ã¨å¤é¨ã¹ãã¬ã¼ã¸éã®ç´æ¥çãªãã¼ã¿ç§»åãå¯è½ã«ããå¹çãå¤§å¹ ã«åä¸ããã¾ãã
ãã¼ã¿ã®è»¢éï¼DataSource/DataDestinationï¼ã¨å¤æï¼InputConfig/OutputConfigï¼ãåé¢ãããã¨ã§ãã·ã¹ãã ã®æè»æ§ã¨åå©ç¨æ§ãåä¸ãã¾ãã
é·æéå®è¡æä½ï¼LROï¼ã¨ãã¦å®è£ ãããã¨ã§ãã¯ã©ã¤ã¢ã³ãã¯éåæã§æä½ã®é²è¡ç¶æ³ã追跡ã§ãã¾ãã
ãã¼ã¿ã®ä¸è²«æ§ãèå¥åã®æ±ãã失æã¨ãªãã©ã¤ã®å¦çã«ã¯ç¹å¥ãªæ³¨æãå¿ è¦ã§ãã
ã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ããã¯ã¢ãã/ãªã¹ãã¢æ©è½ã¨ã¯ç°ãªããã¨ãç解ããé©åã«ä½¿ãåãããã¨ãéè¦ã§ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯å¹ççã§æè»æ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ã大è¦æ¨¡ãªãã¼ã¿ã»ãããæ±ãå ´åããè¤éãªãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãæ¡ç¨ãã¦ããå ´åãé©åãªã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã®å®è£ ã¯æ¥µãã¦éè¦ã§ãã
ãããããã®æ©è½ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãã»ãã¥ãªãã£ããã¼ã¿ã®ä¸è²«æ§ãã·ã¹ãã ã®è¤éæ§ã®å¢å ãªã©ã®å´é¢ã§èª²é¡ãçããå¯è½æ§ãããã¾ãããããã®èª²é¡ã«é©åã«å¯¾å¦ããããã«ã¯ãã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ãã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«ãã¼ã¿ç§»åã®å¹çãåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®æè»æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ããé©åã«è¨è¨ãããã¤ã³ãã¼ã/ã¨ã¯ã¹ãã¼ãæ©è½ã¯ãã·ã¹ãã ã®é²åã¨æ¡å¼µã容æã«ããé·æçãªä¿å®æ§ãåä¸ããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§å¹ççãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
Part 6 Safety and security
æå¾ã®ãã¼ãã§ã¯ãAPIã®å®å ¨æ§ã¨ã»ãã¥ãªãã£ã«é¢ããéè¦ãªãããã¯ãæ±ããã¦ãã¾ãããã¼ã¸ã§ãã³ã°ã¨äºææ§ã®ç¶æãã½ããåé¤ããªã¯ã¨ã¹ãã®éè¤æé¤ããªã¯ã¨ã¹ãã®æ¤è¨¼ããªã½ã¼ã¹ã®ãªãã¸ã§ã³ç®¡çããªã¯ã¨ã¹ãã®å試è¡ããªã¯ã¨ã¹ãã®èªè¨¼ãªã©ãAPIã®ä¿¡é ¼æ§ã¨å®å ¨æ§ã確ä¿ããããã®æ§ã ãªææ³ã詳細ã«è§£èª¬ããã¦ãã¾ãããããã®è¦ç´ ã¯ãAPIã®é·æçãªéç¨ã¨é²åã«ããã¦æ¥µãã¦éè¦ã§ãã
24 Versioning and compatibility
ãAPI Design Patternsãã®ç¬¬24ç« ãVersioning and compatibilityãã¯ãAPIã®ãã¼ã¸ã§ãã³ã°ã¨äºææ§ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãã¼ã¸ã§ãã³ã°ã¨äºææ§ã®ç®¡çãåãªãæè¡çãªè©³ç´°ã§ã¯ãªããAPIã®é·æçãªæåã¨é²åã«ç´æ¥å½±é¿ãä¸ããéè¦ãªæ¦ç¥ç決å®ã§ãããã¨ãæ確ã«ç¤ºãã¦ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã®å¿ è¦æ§ã¨äºææ§ã®æ¦å¿µ
èè ã¯ãã½ããã¦ã§ã¢éçºãç¹ã«APIã®é²åãé¿ããããªãç¾å®ããè°è«ãå§ãã¦ãã¾ããæ°æ©è½ã®è¿½å ããã°ã®ä¿®æ£ãã»ãã¥ãªãã£ã®åä¸ãªã©ãAPIãå¤æ´ããçç±ã¯å¸¸ã«åå¨ãã¾ããããããAPIã¯ãã®å ¬éæ§ã¨å³æ ¼æ§ããã«ãå¤æ´ãé£ããã¨ããç¹æ§ãæã£ã¦ãã¾ãããã®ç·å¼µé¢ä¿ã解決ããããã®ä¸»è¦ãªæ段ã¨ãã¦ãèè ã¯ãã¼ã¸ã§ãã³ã°ãææ¡ãã¦ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã®æ¬è³ªã¯ãAPIã®å¤æ´ã管çå¯è½ãªå½¢ã§å°å ¥ããæ¢åã®ã¯ã©ã¤ã¢ã³ãã«å½±é¿ãä¸ãããã¨ãªãæ°æ©è½ãæä¾ãããã¨ã§ããèè ã¯ããã¼ã¸ã§ãã³ã°ã®ä¸»ãªç®çããã¦ã¼ã¶ã¼ã«å¯è½ãªéãå¤ãã®æ©è½ãæä¾ãã¤ã¤ãæå°éã®ä¸ä¾¿ãã§æ¸ã¾ãããã¨ãã¨å®ç¾©ãã¦ãã¾ãããã®å®ç¾©ã¯ãAPIãã¶ã¤ã³ã«ãããéè¦ãªæéã¨ãªãã¾ãã
äºææ§ã®æ¦å¿µã«ã¤ãã¦ã詳細ã«èª¬æããã¦ãã¾ããèè ã¯ãäºææ§ãã2ã¤ã®ç°ãªãã³ã³ãã¼ãã³ããæ£å¸¸ã«éä¿¡ã§ããè½åãã¨å®ç¾©ãã¦ãã¾ããAPIã®ã³ã³ããã¹ãã§ã¯ãããã¯ä¸»ã«ã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼éã®éä¿¡ãæãã¾ããç¹ã«ãå¾æ¹äºææ§ï¼æ°ãããã¼ã¸ã§ã³ã®APIãå¤ãã¯ã©ã¤ã¢ã³ãã³ã¼ãã¨æ£å¸¸ã«åä½ããè½åï¼ãéè¦ã§ãã
ãã®æ¦å¿µã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãäºãã«ä¾åãåãç°å¢ã§ã¯ãä¸ã¤ã®APIã®å¤æ´ãå ¨ä½ã®ã·ã¹ãã ã«æ³¢åçãªå½±é¿ãä¸ããå¯è½æ§ãããã¾ããé©åãªãã¼ã¸ã§ãã³ã°æ¦ç¥ã¯ããã®ãããªç°å¢ã§ã®ã·ã¹ãã ã®å®å®æ§ã¨é²åã両ç«ãããããã«ä¸å¯æ¬ ã§ãã
å¾æ¹äºææ§ã®å®ç¾©
èè ã¯ãå¾æ¹äºææ§ã®å®ç¾©ãåç´ã§ã¯ãªããã¨ãææãã¦ãã¾ããä¸è¦ããã¨ãæ¢åã®ã³ã¼ããå£ããªããã¨ãã¨ããå®ç¾©ã§ååã«æãã¾ãããå®éã«ã¯ããè¤éã§ããèè ã¯ãå¾æ¹äºææ§ã®å®ç¾©ããAPIãå©ç¨ããã¦ã¼ã¶ã¼ã®ãããã¡ã¤ã«ã¨æå¾ ãã«å¤§ããä¾åããã¨ä¸»å¼µãã¦ãã¾ãã
ä¾ãã°ãæ°ããæ©è½ã®è¿½å ã¯é常å¾æ¹äºææ§ãããã¨èãããã¾ããããªã½ã¼ã¹ãå¶éããã¦ããIoTããã¤ã¹ã®ãããªç°å¢ã§ã¯ãæ°ãããã£ã¼ã«ãã®è¿½å ã§ããã¡ã¢ãªãªã¼ãã¼ããã¼ãå¼ãèµ·ããå¯è½æ§ãããã¾ããã¾ãããã°ä¿®æ£ã«ã¤ãã¦ãããããæ¢åã®ã¯ã©ã¤ã¢ã³ãã®åä½ã«å½±é¿ãä¸ããå¯è½æ§ãããå ´åãå¾æ¹äºææ§ãæãªãå¯è½æ§ãããã¾ãã
èè ã¯ã以ä¸ã®ãããªã·ããªãªã«ã¤ãã¦è©³ç´°ã«è°è«ãã¦ãã¾ãã
- æ°æ©è½ã®è¿½å
- ãã°ä¿®æ£
- æ³çè¦ä»¶ã«ããå¼·å¶çãªå¤æ´
- ããã©ã¼ãã³ã¹ã®æé©å
- åºç¤ã¨ãªãã¢ã«ã´ãªãºã ãæè¡ã®å¤æ´
- ä¸è¬çãªæå³çå¤æ´
ãããã®åã·ããªãªã«ããã¦ãå¤æ´ãå¾æ¹äºææ§ãæã¤ãã©ããã¯ãAPIã®ã¦ã¼ã¶ã¼ãã¼ã¹ã®ç¹æ§ã¨æå¾ ã«å¤§ããä¾åãã¾ããä¾ãã°ãéèæ©é¢åãã®APIã¨ãã¹ã¿ã¼ãã¢ããåãã®APIã§ã¯ãå®å®æ§ã¨æ°æ©è½ã«å¯¾ããè¦æ±ã大ããç°ãªãå¯è½æ§ãããã¾ãã
ãã®è°è«ã¯ãAPIãã¶ã¤ã³ãåãªãæè¡çãªåé¡ã§ã¯ãªãããã¸ãã¹æ¦ç¥ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ã示ãã¦ãã¾ããAPIãã¶ã¤ãã¼ã¯ãæè¡çãªå´é¢ã ãã§ãªããã¦ã¼ã¶ã¼ã®ãã¼ãºããã¸ãã¹ç®æ¨ãæ³çè¦ä»¶ãªã©ãç·åçã«èæ ®ãã¦ãã¼ã¸ã§ãã³ã°æ¦ç¥ã決å®ããå¿ è¦ãããã¾ãã
ãã¼ã¸ã§ãã³ã°æ¦ç¥
èè ã¯ãããã¤ãã®ä¸»è¦ãªãã¼ã¸ã§ãã³ã°æ¦ç¥ã«ã¤ãã¦è©³ç´°ã«èª¬æãã¦ãã¾ãã
æ°¸ç¶çå®å®æ§ï¼Perpetual stabilityï¼: åãã¼ã¸ã§ã³ãæ°¸ç¶çã«å®å®ãããå¾æ¹äºææ§ã®ãªãå¤æ´ã¯å¸¸ã«æ°ãããã¼ã¸ã§ã³ã§å°å ¥ããæ¦ç¥ã
ã¢ã¸ã£ã¤ã«ä¸å®å®æ§ï¼Agile instabilityï¼: ã¢ã¯ãã£ããªãã¼ã¸ã§ã³ã®ãæ»èµ°çªããç¶æããå®æçã«å¤ããã¼ã¸ã§ã³ãå»æ¢ããæ¦ç¥ã
ã»ãã³ãã£ãã¯ãã¼ã¸ã§ãã³ã°ï¼Semantic versioningï¼: ã¡ã¸ã£ã¼ããã¤ãã¼ããããã®3ã¤ã®æ°åã使ç¨ãã¦å¤æ´ã®æ§è³ªãæ確ã«ç¤ºãæ¦ç¥ã
åæ¦ç¥ã«ã¯ãããããé·æã¨çæãããã¾ããä¾ãã°ãæ°¸ç¶çå®å®æ§ã¯é«ãå®å®æ§ãæä¾ãã¾ãããæ°æ©è½ã®å°å ¥ãé ããªãå¯è½æ§ãããã¾ããä¸æ¹ãã¢ã¸ã£ã¤ã«ä¸å®å®æ§ã¯æ°æ©è½ã®è¿ éãªå°å ¥ãå¯è½ã«ãã¾ãããã¯ã©ã¤ã¢ã³ãã«é »ç¹ãªæ´æ°ãå¼·ããå¯è½æ§ãããã¾ããã»ãã³ãã£ãã¯ãã¼ã¸ã§ãã³ã°ã¯æè»æ§ã¨æ確æ§ãæä¾ãã¾ãããå¤æ°ã®ãã¼ã¸ã§ã³ã®ç®¡çãå¿ è¦ã«ãªãå¯è½æ§ãããã¾ãã
ãããã®æ¦ç¥ã®é¸æã¯ãAPIã®ã¦ã¼ã¹ã±ã¼ã¹ãã¦ã¼ã¶ã¼ãã¼ã¹ãéçºãªã½ã¼ã¹ããã¸ãã¹ç®æ¨ãªã©ãå¤ãã®è¦å ã«ä¾åãã¾ããä¾ãã°ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãæ¡ç¨ãã¦ããçµç¹ã§ã¯ãåãµã¼ãã¹ãç¬ç«ãã¦ãã¼ã¸ã§ãã³ã°ãè¡ãå¿ è¦ãããã¾ãããå ¨ä½çãªä¸è²«æ§ãç¶æããå¿ è¦ãããã¾ãããã®ãããªç°å¢ã§ã¯ãã»ãã³ãã£ãã¯ãã¼ã¸ã§ãã³ã°ãé©ãã¦ããå¯è½æ§ãé«ãã§ãã
Golangã®ã³ã³ããã¹ãã§ã¯ã以ä¸ã®ãããªãã¼ã¸ã§ãã³ã°æ¦ç¥ã®å®è£ ä¾ãèãããã¾ãã
type APIVersion struct { Major int Minor int Patch int } type APIClient struct { Version APIVersion // ãã®ä»ã®ã¯ã©ã¤ã¢ã³ãè¨å® } func (c *APIClient) Call(endpoint string, params map[string]interface{}) (interface{}, error) { // ãã¼ã¸ã§ã³ã«åºã¥ãã¦APIã³ã¼ã«ãèª¿æ´ if c.Version.Major == 1 { // v1ã®ãã¸ã㯠} else if c.Version.Major == 2 { // v2ã®ãã¸ã㯠} else { return nil, fmt.Errorf("unsupported API version: %v", c.Version) } // å®éã®APIå¼ã³åºããã¸ã㯠}
ãã®ãããªå®è£ ã«ãããã¯ã©ã¤ã¢ã³ãã¯ç¹å®ã®APIãã¼ã¸ã§ã³ãæå®ãã¦æä½ãè¡ããã¨ãã§ãããµã¼ãã¼å´ã§ã¯åãã¼ã¸ã§ã³ã«å¿ããé©åãªå¦çãè¡ããã¨ãã§ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã®ãã¬ã¼ããªã
èè ã¯ããã¼ã¸ã§ãã³ã°æ¦ç¥ãé¸æããéã®ä¸»è¦ãªãã¬ã¼ããªãã«ã¤ãã¦è°è«ãã¦ãã¾ãã
ç²åº¦ vs åç´æ§: ããç´°ãããã¼ã¸ã§ã³ç®¡çã¯æè»æ§ãæä¾ãã¾ãããè¤éããå¢å ãã¾ãã
å®å®æ§ vs æ°æ©è½: é«ãå®å®æ§ãç¶æããããæ°æ©è½ãè¿ éã«å°å ¥ãããã®ãã©ã³ã¹ã
æºè¶³åº¦ vs æ®éæ§: ä¸é¨ã®ã¦ã¼ã¶ã¼ãé常ã«æºè¶³ãããããããå¤ãã®ã¦ã¼ã¶ã¼ã«åãå ¥ããããæ¹éãåããã
ãããã®ãã¬ã¼ããªãã¯ãAPIã®è¨è¨ã¨é²åã«å¤§ããªå½±é¿ãä¸ãã¾ããä¾ãã°ãé«åº¦ã«è¦å¶ãããç£æ¥åãã®APIã§ã¯ãå®å®æ§ã¨äºæ¸¬å¯è½æ§ãæãéè¦ããããã¾ãããä¸æ¹ãæ¥éã«é²åãããã¯ããã¸ã¼åéã§ã¯ãæ°æ©è½ã®è¿ éãªå°å ¥ãåªå ãããããããã¾ããã
éç¨ã®è¦³ç¹ããã¯ããããã®ãã¬ã¼ããªãã¯ä»¥ä¸ã®ãããªå½±é¿ãæã¡ã¾ãã
ã¤ã³ãã©ã¹ãã©ã¯ãã£ã®è¤éã: å¤æ°ã®ãã¼ã¸ã§ã³ãåæã«ãµãã¼ãããå¿ è¦ãããå ´åãã¤ã³ãã©ã¹ãã©ã¯ãã£ã®ç®¡çãè¤éã«ãªãã¾ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: åãã¼ã¸ã§ã³ã®ä½¿ç¨ç¶æ³ãããã©ã¼ãã³ã¹ãã¨ã©ã¼ã¬ã¼ããåå¥ã«ç£è¦ããå¿ è¦ãããã¾ãã
ãããã¤ã¡ã³ãã®æ¦ç¥: æ°ãã¼ã¸ã§ã³ã®ãã¼ã«ã¢ã¦ãã¨å¤ããã¼ã¸ã§ã³ã®æ®µéçãªå»æ¢ãã©ã®ããã«ç®¡çãããã
ããã¥ã¡ã³ãã¼ã·ã§ã³ã¨ãµãã¼ã: åãã¼ã¸ã§ã³ã®ããã¥ã¡ã³ããç¶æãããµãã¼ããæä¾ããå¿ è¦ãããã¾ãã
çµè«
第24ç« ãVersioning and compatibilityãã¯ãAPIã®ãã¼ã¸ã§ãã³ã°ã¨äºææ§ç®¡çã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããååã¯ãAPIã®é·æçãªæåã¨é²åã確ä¿ããä¸ã§é常ã«éè¦ã§ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãã¼ã¸ã§ãã³ã°ã¯ãAPIã®é²åãå¯è½ã«ãã¤ã¤ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã¸ã®å½±é¿ãæå°éã«æããããã®éè¦ãªãã¼ã«ã§ãã
å¾æ¹äºææ§ã®å®ç¾©ã¯ãAPIã®ã¦ã¼ã¶ã¼ãã¼ã¹ã¨å½¼ãã®æå¾ ã«å¤§ããä¾åãã¾ãã
ãã¼ã¸ã§ãã³ã°æ¦ç¥ã®é¸æã«ã¯ãç²åº¦vsåç´æ§ãå®å®æ§vsæ°æ©è½ãæºè¶³åº¦vsæ®éæ§ãªã©ã®ãã¬ã¼ããªããããã¾ãã
é©åãªãã¼ã¸ã§ãã³ã°æ¦ç¥ã¯ãAPIã®ä½¿ç¨ç®çãã¦ã¼ã¶ã¼ãã¼ã¹ãéçºãªã½ã¼ã¹ããã¸ãã¹ç®æ¨ãªã©ãå¤ãã®è¦å ãèæ ®ãã¦é¸æããå¿ è¦ãããã¾ãã
ãã¼ã¸ã§ãã³ã°ã¯APIã®è¨è¨ã ãã§ãªããã¤ã³ãã©ã¹ãã©ã¯ãã£ãéç¨ããµãã¼ããªã©ãã·ã¹ãã å ¨ä½ã«å½±é¿ãä¸ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯é·æçã«æç¶å¯è½ã§é²åå¯è½ãªAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã¯ãé©åãªãã¼ã¸ã§ãã³ã°æ¦ç¥ãå ¨ä½çãªã·ã¹ãã ã®å®å®æ§ã¨é²åå¯è½æ§ã確ä¿ããä¸ã§æ¥µãã¦éè¦ã§ãã
ãã¼ã¸ã§ãã³ã°ã¨äºææ§ã®ç®¡çã¯ãæè¡çãªåé¡ã§ããã¨åæã«ãæ¦ç¥çãªæ±ºå®ã§ãããã¾ããAPIè¨è¨è ã¯ãæè¡çãªå´é¢ã ãã§ãªãããã¸ãã¹ç®æ¨ãã¦ã¼ã¶ã¼ã®ãã¼ãºãæ³çè¦ä»¶ãéç¨ä¸ã®å¶ç´ãªã©ãå¤ãã®è¦å ãèæ ®ãã¦ãã¼ã¸ã§ãã³ã°æ¦ç¥ã決å®ããå¿ è¦ãããã¾ããé©åã«å®è£ ããããã¼ã¸ã§ãã³ã°æ¦ç¥ã¯ãAPIã®é·æçãªæåã¨ãããã«ä¾åããã·ã¹ãã å ¨ä½ã®å®å®æ§ã¨é²åå¯è½æ§ã確ä¿ããéè¦ãªåºç¤ã¨ãªãã¾ãã
æå¾ã«ããã¼ã¸ã§ãã³ã°ã¨äºææ§ã®ç®¡çã¯ç¶ç¶çãªããã»ã¹ã§ãããã¨ãèªèãããã¨ãéè¦ã§ããæè¡ã®é²åãã¦ã¼ã¶ã¼ã®ãã¼ãºã®å¤åãæ°ããªæ³çè¦ä»¶ã®åºç¾ãªã©ã«å¿ãã¦ããã¼ã¸ã§ãã³ã°æ¦ç¥ãå®æçã«è¦ç´ããå¿ è¦ã«å¿ãã¦èª¿æ´ãããã¨ãæ±ãããã¾ãããã®ç¶ç¶çãªç®¡çã¨é©å¿ããAPIã®é·æçãªæåã¨ãããã«ä¾åããã·ã¹ãã å ¨ä½ã®å¥å ¨æ§ã確ä¿ããéµã¨ãªãã¾ãã
25 Soft deletion
ãAPI Design Patternsãã®ç¬¬25ç« ãSoft deletionãã¯ãAPIã«ãããã½ããåé¤ã®æ¦å¿µããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ã½ããåé¤ãåãªããã¼ã¿ç®¡çã®ææ³ã§ã¯ãªããAPIã®æè»æ§ããã¼ã¿ã®ä¿å ¨æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®éç¨æ§ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ã½ããåé¤ã®åæ©ã¨æ¦è¦
èè ã¯ãã½ããåé¤ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¾æ¥ã®ãã¼ãåé¤ï¼ãã¼ã¿ã®å®å ¨ãªåé¤ï¼ã«ã¯ã誤ã£ã¦åé¤ããããã¼ã¿ã復å ã§ããªãã¨ããé大ãªæ¬ ç¹ãããã¾ããèè ã¯ããã®åé¡ã«å¯¾ãã解決çã¨ãã¦ã½ããåé¤ãææ¡ãã¦ãã¾ããã½ããåé¤ã¯ããã¼ã¿ãå®éã«åé¤ããããåé¤ããããã¨ãã¼ã¯ãããã¨ã§ãå¿ è¦ã«å¿ãã¦å¾ã§å¾©å ã§ããããã«ããææ³ã§ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ãç¸äºã«ä¾åãåãç°å¢ã§ã¯ãä¸ã¤ã®ãµã¼ãã¹ã§ãã¼ã¿ã誤ã£ã¦åé¤ãããã¨ãã·ã¹ãã å ¨ä½ã«æ³¢åçãªå½±é¿ãä¸ããå¯è½æ§ãããã¾ããã½ããåé¤ãé©åã«å®è£ ãããã¨ã§ããã®ãããªãªã¹ã¯ã軽æ¸ããã·ã¹ãã ã®å復åãé«ãããã¨ãã§ãã¾ãã
èè
ã¯ãã½ããåé¤ã®åºæ¬çãªå®è£
ã¨ãã¦ããªã½ã¼ã¹ã« deleted
ãã©ã°ã追å ãããã¨ãææ¡ãã¦ãã¾ãããã®ãã©ã°ã«ããããªã½ã¼ã¹ãåé¤ããããã©ããã示ããã¨ãã§ãã¾ããããã«ãexpireTime
ãã£ã¼ã«ãã追å ãããã¨ã§ãã½ããåé¤ããããªã½ã¼ã¹ã®èªåçãªå®å
¨åé¤ï¼ãã¼ãåé¤ï¼ã®ã¹ã±ã¸ã¥ã¼ãªã³ã°ãå¯è½ã«ãªãã¾ãã
ã½ããåé¤ã®å®è£
èè ã¯ãã½ããåé¤ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
æ¨æºã¡ã½ããã®ä¿®æ£: æ¨æºçãªCRUDæä½ãç¹ã«åé¤ï¼Deleteï¼æä½ãä¿®æ£ããã½ããåé¤ããµãã¼ãããå¿ è¦ãããã¾ãã
ãªã¹ãæä½ã®èª¿æ´: æ¨æºçãªãªã¹ãæä½ã§ã¯ãããã©ã«ãã§ã½ããåé¤ããããªã½ã¼ã¹ãé¤å¤ãããªãã·ã§ã³ã§ããããå«ããæ©è½ãæä¾ãã¾ãã
ã¢ã³ããªã¼ãæä½: ã½ããåé¤ããããªã½ã¼ã¹ã復å ããããã®æ°ããã«ã¹ã¿ã ã¡ã½ãããå°å ¥ãã¾ãã
å®å ¨åé¤ï¼Expungeï¼æä½: ã½ããåé¤ããããªã½ã¼ã¹ãå®å ¨ã«åé¤ããããã®æ°ããã«ã¹ã¿ã ã¡ã½ãããå°å ¥ãã¾ãã
æå¹æéã®ç®¡ç: ã½ããåé¤ããããªã½ã¼ã¹ã®èªåçãªå®å ¨åé¤ãã¹ã±ã¸ã¥ã¼ã«ããããã®ä»çµã¿ãå®è£ ãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ã½ããåé¤ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type Resource struct { ID string `json:"id"` Name string `json:"name"` Deleted bool `json:"deleted"` ExpireTime time.Time `json:"expireTime,omitempty"` } type ResourceService interface { Get(ctx context.Context, id string) (*Resource, error) List(ctx context.Context, includeDeleted bool) ([]*Resource, error) Delete(ctx context.Context, id string) error Undelete(ctx context.Context, id string) error Expunge(ctx context.Context, id string) error } func (s *resourceService) Delete(ctx context.Context, id string) error { resource, err := s.Get(ctx, id) if err != nil { return err } resource.Deleted = true resource.ExpireTime = time.Now().Add(30 * 24 * time.Hour) // 30æ¥å¾ã«èªååé¤ return s.update(ctx, resource) } func (s *resourceService) List(ctx context.Context, includeDeleted bool) ([]*Resource, error) { resources, err := s.getAll(ctx) if err != nil { return nil, err } if !includeDeleted { return filterNonDeleted(resources), nil } return resources, nil }
ãã®å®è£
ä¾ã§ã¯ãResource
æ§é ä½ã« Deleted
ãã©ã°ã¨ ExpireTime
ãã£ã¼ã«ãã追å ããDelete
ã¡ã½ããã§ã½ããåé¤ãå®è£
ãã¦ãã¾ããã¾ããList
ã¡ã½ããã§ã¯ includeDeleted
ãã©ã¡ã¼ã¿ã使ç¨ãã¦ãã½ããåé¤ããããªã½ã¼ã¹ãå«ãããã©ãããå¶å¾¡ãã¦ãã¾ãã
ã½ããåé¤ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ãã½ããåé¤ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ãã¼ã¿ã¹ãã¬ã¼ã¸ã®å¢å : ã½ããåé¤ããããªã½ã¼ã¹ã¯ãã¼ã¿ãã¼ã¹ã«æ®ãç¶ãããããã¹ãã¬ã¼ã¸ã®ä½¿ç¨éãå¢å ãã¾ããããã¯ã大è¦æ¨¡ãªã·ã¹ãã ã§ã¯ç¡è¦ã§ããªãåé¡ã¨ãªãå¯è½æ§ãããã¾ãã
ããã©ã¼ãã³ã¹ã¸ã®å½±é¿: ã½ããåé¤ããããªã½ã¼ã¹ãé¤å¤ããããã®è¿½å çãªãã£ã«ã¿ãªã³ã°ãå¿ è¦ã¨ãªããããç¹ã«ãªã¹ãæä½ã®ããã©ã¼ãã³ã¹ã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ãã
è¤éæ§ã®å¢å : ã½ããåé¤ãå°å ¥ãããã¨ã§ãAPIã®è¤éæ§ãå¢å ãã¾ããããã¯ãéçºè ã®å¦ç¿æ²ç·ãæ¥ã«ãããã°ã®å¯è½æ§ãå¢ããå¯è½æ§ãããã¾ãã
ãã¼ã¿ã®æ´åæ§: ã½ããåé¤ããããªã½ã¼ã¹ã¸ã®åç §ãã©ã®ããã«æ±ããã¨ããåé¡ãããã¾ããããã¯ãç¹ã«è¤éãªé¢ä¿æ§ãæã¤ãªã½ã¼ã¹éã§éè¦ãªèª²é¡ã¨ãªãã¾ãã
ã»ãã¥ãªãã£ã¨ãã©ã¤ãã·ã¼: ã½ããåé¤ããããã¼ã¿ãäºæ³ä»¥ä¸ã«é·ãä¿æãããå¯è½æ§ããããããã¯ãã¼ã¿ä¿è·è¦å¶ï¼ä¾ï¼GDPRï¼ã¨ã®é¢é£ã§èª²é¡ã¨ãªãå¯è½æ§ãããã¾ãã
ãããã®ãã¬ã¼ããªããé©åã«ç®¡çãããã¨ããã½ããåé¤ã®æåçãªå®è£ ã®éµã¨ãªãã¾ããä¾ãã°ãã¹ãã¬ã¼ã¸ã¨ããã©ã¼ãã³ã¹ã®åé¡ã«å¯¾ãã¦ã¯ãå®æçãªã¯ãªã¼ã³ã¢ããã¸ã§ããå®è£ ããé·æéã½ããåé¤ç¶æ ã«ãããªã½ã¼ã¹ãèªåçã«å®å ¨åé¤ãããã¨ãèãããã¾ããã¾ãããã¼ã¿ã®æ´åæ§ã®åé¡ã«å¯¾ãã¦ã¯ãé¢é£ãªã½ã¼ã¹ã®åé¤ããªã·ã¼ãæ éã«è¨è¨ããã«ã¹ã±ã¼ãåé¤ããªãã¡ã¬ã³ã¹ã®ç¡å¹åãªã©ã®æ¦ç¥ãé©åã«é¸æããå¿ è¦ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ã½ããåé¤ã¯ããã¤ã¯ããµã¼ãã¹éã®ãã¼ã¿æ´åæ§ãç¶æããä¸ã§éè¦ãªå½¹å²ãæããã¾ããä¾ãã°ããããµã¼ãã¹ã§ã½ããåé¤ããããªã½ã¼ã¹ããä»ã®ãµã¼ãã¹ã§ã¯ã¾ã åç §ããã¦ããå¯è½æ§ãããã¾ãããã®ãããªå ´åãã½ããåé¤ã«ããããµã¼ãã¹éã®æ´åæ§ãä¿ã¡ã¤ã¤ãå¿ è¦ã«å¿ãã¦ãã¼ã¿ã復å ãããã¨ãå¯è½ã«ãªãã¾ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®é£æº: ã½ããåé¤ãã¢ã³ããªã¼ããå®å ¨åé¤ãªã©ã®æä½ãã¤ãã³ãã¨ãã¦çºè¡ãããã¨ã§ãé¢é£ããã·ã¹ãã ã³ã³ãã¼ãã³ããé©åã«åå¿ããå ¨ä½çãªä¸è²«æ§ãç¶æãããã¨ãã§ãã¾ãã
ãã¼ã¿ã¬ããã³ã¹ã¨ã³ã³ãã©ã¤ã¢ã³ã¹: ã½ããåé¤ã¯ããã¼ã¿ä¿æããªã·ã¼ããã¼ã¿ä¿è·è¦å¶ã¸ã®å¯¾å¿ã容æã«ãã¾ããä¾ãã°ãã¦ã¼ã¶ã¼ãã¼ã¿ã®ãå¿ãããã権å©ãï¼GDPRï¼ã«å¯¾å¿ããéãã½ããåé¤ãæ´»ç¨ãããã¨ã§ããã¼ã¿ãå³åº§ã«å©ç¨ä¸å¯è½ã«ãã¤ã¤ãæ³çè¦ä»¶ã«åºã¥ãã¦ä¸å®æéä¿æãããã¨ãå¯è½ã«ãªãã¾ãã
ç£æ»ã¨ãã¬ã¼ãµããªãã£: ã½ããåé¤ãå®è£ ãããã¨ã§ããªã½ã¼ã¹ã®ã©ã¤ããµã¤ã¯ã«å ¨ä½ã追跡ãããã¨ã容æã«ãªãã¾ããããã¯ãã·ã¹ãã ã®å¤æ´å±¥æ´ãææ¡ããåé¡ãçºçããå ´åã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ã容æã«ãã¾ãã
ããã¯ã¢ããã¨ç½å®³å¾©æ§: ã½ããåé¤ã¯ã誤ã£ã¦åé¤ããããã¼ã¿ã®å¾©æ§ã容æã«ãã¾ããããã¯ãç¹ã«éè¦ãªãã¸ãã¹ãã¼ã¿ãæ±ãã·ã¹ãã ã«ããã¦ããã¼ã¿æ失ã®ãªã¹ã¯ãå¤§å¹ ã«è»½æ¸ãã¾ãã
ããã©ã¼ãã³ã¹æé©å: ã½ããåé¤ã®å®è£ ã«ã¯ãé©åãªã¤ã³ããã¯ã¹æ¦ç¥ãä¸å¯æ¬ ã§ããä¾ãã°ã
deleted
ãã©ã°ã«ã¤ã³ããã¯ã¹ãä½æãããã¨ã§ãéåé¤ãªã½ã¼ã¹ã®æ¤ç´¢ããã©ã¼ãã³ã¹ãç¶æãããã¨ãã§ãã¾ããã¹ãã¬ã¼ã¸ç®¡ç: ã½ããåé¤ããããªã½ã¼ã¹ã®èªåçãªå®å ¨åé¤ï¼ã¨ã¯ã¹ãã¤ã¢ï¼ãå®è£ ãããã¨ã§ãã¹ãã¬ã¼ã¸ä½¿ç¨éã管çãã¤ã¤ãä¸å®æéã®ãã¼ã¿å¾©å å¯è½æ§ã確ä¿ã§ãã¾ããããã¯ãã³ã¹ãã¨ãã¼ã¿ä¿è·ã®ãã©ã³ã¹ãåãä¸ã§éè¦ã§ãã
ã½ããåé¤ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã£
ã½ããåé¤ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¿ã¢ãã«ã¨ã¹ãã¼ãè¨è¨: ã½ããåé¤ããµãã¼ãããããã«ãå ¨ã¦ã®ãªã½ã¼ã¹ã«
deleted
ãã©ã°ã¨expireTime
ãã£ã¼ã«ãã追å ããå¿ è¦ãããã¾ããããã¯ããã¼ã¿ãã¼ã¹ã¹ãã¼ãã®è¨è¨ã«å½±é¿ãä¸ãã¾ããã¯ã¨ãªããã©ã¼ãã³ã¹: ã½ããåé¤ããããªã½ã¼ã¹ãé¤å¤ããããã«ãã»ã¨ãã©ã®ã¯ã¨ãªã«è¿½å ã®æ¡ä»¶ãå¿ è¦ã«ãªãã¾ããããã¯ãç¹ã«å¤§è¦æ¨¡ãªãã¼ã¿ã»ããã§ããã©ã¼ãã³ã¹ã«å½±é¿ãä¸ããå¯è½æ§ãããã¾ããé©åãªã¤ã³ããã¯ã¹æ¦ç¥ãéè¦ã«ãªãã¾ãã
ãã¼ã¸ã§ãã³ã°ã¨äºææ§: ã½ããåé¤ã®å°å ¥ã¯ãAPIã®å¤§ããªå¤æ´ã¨ãªãå¯è½æ§ãããã¾ããæ¢åã®ã¯ã©ã¤ã¢ã³ãã¨ã®äºææ§ãç¶æãã¤ã¤ããã®æ©è½ãã©ã®ããã«å°å ¥ããããæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ãã£ãã·ã¥æ¦ç¥: ã½ããåé¤ããããªã½ã¼ã¹ã®ãã£ãã·ã¥ç®¡çã¯è¤éã«ãªãå¯è½æ§ãããã¾ãããã£ãã·ã¥ã®ç¡å¹åæ¦ç¥ãé©åã«è¨è¨ããå¿ è¦ãããã¾ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRS: ã½ããåé¤ã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ãCQRSï¼Command Query Responsibility Segregationï¼ãã¿ã¼ã³ã¨çµã¿åããããã¨ã§ãããå¼·åã«ãªãã¾ããåé¤ã¤ãã³ããè¨é²ããèªã¿åãã¢ãã«ãé©åã«æ´æ°ãããã¨ã§ãã·ã¹ãã ã®æè»æ§ã¨ä¸è²«æ§ãåä¸ããããã¨ãã§ãã¾ãã
çµè«
第25ç« ãSoft deletionãã¯ãAPIã«ãããã½ããåé¤ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ããã¼ã¿ã®ä¿å ¨æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®éç¨æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ã½ããåé¤ã¯ããã¼ã¿ã®èª¤åé¤ããã®ä¿è·ã¨å¾©å å¯è½æ§ãæä¾ããéè¦ãªæ©è½ã§ãã
æ¨æºçãªCRUDæä½ãç¹ã«åé¤ã¨ãªã¹ãæä½ãé©åã«ä¿®æ£ããå¿ è¦ãããã¾ãã
ã¢ã³ããªã¼ãã¨å®å ¨åé¤ï¼Expungeï¼ã®ããã®æ°ããã«ã¹ã¿ã ã¡ã½ãããå¿ è¦ã§ãã
ã½ããåé¤ããããªã½ã¼ã¹ã®èªåçãªå®å ¨åé¤ï¼ã¨ã¯ã¹ãã¤ã¢ï¼ã管çããã¡ã«ããºã ãéè¦ã§ãã
ã½ããåé¤ã®å°å ¥ã«ã¯ãã¹ãã¬ã¼ã¸ä½¿ç¨éã®å¢å ãããã©ã¼ãã³ã¹ã¸ã®å½±é¿ãè¤éæ§ã®å¢å ãªã©ã®ãã¬ã¼ããªããããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããå ç¢ã§æè»æ§ã®ããAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ããã¼ã¿ã®éè¦æ§ãé«ãã·ã¹ãã ããè¤éãªãã¼ã¿é¢ä¿ãæã¤ã·ã¹ãã ã§ã¯ãã½ããåé¤ã®é©åãªå®è£ ã極ãã¦éè¦ã§ãã
ããããã½ããåé¤ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãããã©ã¼ãã³ã¹ãã¹ãã¬ã¼ã¸ä½¿ç¨éããã¼ã¿ã®æ´åæ§ãã»ãã¥ãªãã£ã¨ãã©ã¤ãã·ã¼ã®è¦³ç¹ãããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ãã½ããåé¤ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«ãã¼ã¿ã®åé¤æ¹æ³ãå¤æ´ããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ãã¼ã¿ã©ã¤ããµã¤ã¯ã«ç®¡çãããã¯ã¢ããã¨å¾©æ§æ¦ç¥ãã³ã³ãã©ã¤ã¢ã³ã¹å¯¾å¿ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ã½ããåé¤ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®å復åãé«ãããã¼ã¿ç®¡çã®æè»æ§ãåä¸ããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
26 Request deduplication
ãAPI Design Patternsãã®ç¬¬26ç« ãRequest deduplicationãã¯ãAPIã«ããããªã¯ã¨ã¹ãã®éè¤æé¤ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã¯ã¨ã¹ãã®éè¤æé¤ãåãªãæé©åã§ã¯ãªããAPIã®ä¿¡é ¼æ§ãä¸è²«æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®å ç¢æ§ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ããããã¯ã¼ã¯ã®ä¸ç¢ºå®æ§ããè°è«ãå§ãã¦ãã¾ããç¾ä»£ã®ã·ã¹ãã ãç¹ã«ã¯ã©ã¦ããã¤ãã£ããªç°å¢ãã¢ãã¤ã«ã¢ããªã±ã¼ã·ã§ã³ã«ããã¦ããããã¯ã¼ã¯ã®ä¿¡é ¼æ§ã¯å¸¸ã«èª²é¡ã¨ãªãã¾ãããªã¯ã¨ã¹ãã失æããå ´åãã¯ã©ã¤ã¢ã³ãã¯é常ãªãã©ã¤ãè¡ãã¾ããããããæå³ããªãå¯ä½ç¨ãå¼ãèµ·ããå¯è½æ§ãããã¾ããç¹ã«éã¹ãçãªã¡ã½ããï¼ä¾ãã°ããªã½ã¼ã¹ã®ä½æãæ´æ°ï¼ã§ã¯ãåãæä½ãè¤æ°åå®è¡ããããã¨ã§ããã¼ã¿ã®æ´åæ§ãæãªãããå¯è½æ§ãããã¾ãã
ãã®åé¡ã«å¯¾å¦ãããããèè ã¯ãªã¯ã¨ã¹ãèå¥åï¼request identifierï¼ã®ä½¿ç¨ãææ¡ãã¦ãã¾ããããã¯ãã¯ã©ã¤ã¢ã³ããçæããä¸æã®èå¥åã§ãAPIãµã¼ãã¼ã¯ãã®èå¥åã使ç¨ãã¦éè¤ãªã¯ã¨ã¹ããæ¤åºããé©åã«å¦çãã¾ãã
ãã®æ¦å¿µã¯ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãä¸ã¤ã®ãªã¯ã¨ã¹ãã®å¤±æãé£éçãªå½±é¿ãåã¼ãå¯è½æ§ãããã¾ãããªã¯ã¨ã¹ãã®éè¤æé¤ãé©åã«å®è£ ãããã¨ã§ãã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ã¨ä¿¡é ¼æ§ãåä¸ããããã¨ãã§ãã¾ãã
èè ã¯ããªã¯ã¨ã¹ãéè¤æé¤ã®åºæ¬çãªæµãã以ä¸ã®ããã«ææ¡ãã¦ãã¾ãã
- ã¯ã©ã¤ã¢ã³ãããªã¯ã¨ã¹ãèå¥åãå«ããªã¯ã¨ã¹ããéä¿¡ããã
- ãµã¼ãã¼ã¯èå¥åããã§ãã¯ãã以åã«å¦çããããã©ããã確èªããã
- æ°ãããªã¯ã¨ã¹ãã®å ´åã¯é常éãå¦çããçµæããã£ãã·ã¥ããã
- éè¤ãªã¯ã¨ã¹ãã®å ´åã¯ããã£ãã·ã¥ãããçµæãè¿ãã
ãã®æ¹æ³ã«ããããããã¯ã¼ã¯ã®ä¸ç¢ºå®æ§ã«èµ·å ããåé¡ã軽æ¸ãã¤ã¤ãã¯ã©ã¤ã¢ã³ãã«ä¸è²«ããå¿çãæä¾ãããã¨ãã§ãã¾ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã®å®è£
èè ã¯ããªã¯ã¨ã¹ãéè¤æé¤ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
ãªã¯ã¨ã¹ãèå¥å: ã¯ã©ã¤ã¢ã³ããçæããä¸æã®æååãããã¯é常ãUUIDããã®ä»ã®ã©ã³ãã ãªæååã使ç¨ããã¾ãã
ã¬ã¹ãã³ã¹ã®ãã£ãã·ã³ã°: å¦çããããªã¯ã¨ã¹ãã®çµæããã£ãã·ã¥ããåãèå¥åã§å度ãªã¯ã¨ã¹ãããã£ãå ´åã«ä½¿ç¨ãã¾ãã
ä¸è²«æ§ã®ç¶æ: ãã£ãã·ã¥ãããå¿çã¯ããã®å¾ã®ãã¼ã¿ã®å¤æ´ã«é¢ããããå ã®ãªã¯ã¨ã¹ãæç¹ã®ç¶æ ãåæ ããå¿ è¦ãããã¾ãã
è¡çªã®ç®¡ç: ãªã¯ã¨ã¹ãèå¥åã®è¡çªï¼ç°ãªããªã¯ã¨ã¹ãã«åãèå¥åã使ç¨ãããå ´åï¼ã«å¯¾å¦ããããããªã¯ã¨ã¹ãã®å 容ãä½µãã¦ãã§ãã¯ããå¿ è¦ãããã¾ãã
ãã£ãã·ã¥ã®æå¹æé: ãã£ãã·ã¥ãããå¿çã«é©åãªæå¹æéãè¨å®ããã¡ã¢ãªä½¿ç¨éã管çãã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãªã¯ã¨ã¹ãéè¤æé¤ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type RequestWithID struct { ID string `json:"requestId"` Payload interface{} `json:"payload"` } type ResponseCache struct { sync.RWMutex cache map[string]cachedResponse } type cachedResponse struct { response interface{} contentHash string expireTime time.Time } func (rc *ResponseCache) Process(req RequestWithID, processor func(interface{}) (interface{}, error)) (interface{}, error) { rc.RLock() cached, exists := rc.cache[req.ID] rc.RUnlock() if exists { contentHash := calculateHash(req.Payload) if contentHash != cached.contentHash { return nil, errors.New("request ID collision detected") } return cached.response, nil } response, err := processor(req.Payload) if err != nil { return nil, err } rc.Lock() rc.cache[req.ID] = cachedResponse{ response: response, contentHash: calculateHash(req.Payload), expireTime: time.Now().Add(5 * time.Minute), } rc.Unlock() return response, nil }
ãã®å®è£
ä¾ã§ã¯ããªã¯ã¨ã¹ãèå¥åã¨ãã¤ãã¼ããå«ãRequestWithID
æ§é ä½ãå®ç¾©ããResponseCache
æ§é ä½ã§ãã£ãã·ã¥ã管çãã¦ãã¾ããProcess
ã¡ã½ããã¯ãéè¤ãã§ãã¯ããã£ãã·ã¥ã®åå¾ã¾ãã¯æ´æ°ãããã¦å®éã®å¦çãè¡ãã¾ããã¾ãããªã¯ã¨ã¹ãèå¥åã®è¡çªãæ¤åºããããããã¤ãã¼ãã®ããã·ã¥ãä½µãã¦ä¿åãã¦ãã¾ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããªã¯ã¨ã¹ãéè¤æé¤ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ã¡ã¢ãªä½¿ç¨é: ãã£ãã·ã¥ã®å°å ¥ã«ãããã¡ã¢ãªä½¿ç¨éãå¢å ãã¾ããé©åãªãã£ãã·ã¥æå¹æéã®è¨å®ãéè¦ã§ãã
ä¸è²«æ§ã¨é®®åº¦ã®ãã©ã³ã¹: ãã£ãã·ã¥ãããå¿çã¯ãææ°ã®ãã¼ã¿ç¶æ ãåæ ãã¦ããªãå¯è½æ§ãããã¾ããããã¯ãã¯ã©ã¤ã¢ã³ãã®æå¾ ã¨ä¸è´ããªãå ´åãããã¾ãã
è¤éæ§ã®å¢å : ãªã¯ã¨ã¹ãéè¤æé¤ã®å®è£ ã¯ãAPIã®è¤éæ§ãå¢å ããã¾ããããã¯ãéçºã¨ãããã°ã®é£ãããå¢ãå¯è½æ§ãããã¾ãã
ããã©ã¼ãã³ã¹ã¸ã®å½±é¿: ãã£ãã·ã¥ã®ãã§ãã¯ã¨ç®¡çã«ã¯ãªã¼ãã¼ããããããã¾ãããéè¤ãªã¯ã¨ã¹ãã®å¦çãåé¿ãããã¨ã§ããã©ã¼ãã³ã¹ãåä¸ããå¯è½æ§ãããã¾ãã
åæ£ã·ã¹ãã ã«ããã課é¡: ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãªã©ã®åæ£ã·ã¹ãã ã§ã¯ããã£ãã·ã¥ã®ä¸è²«æ§ç¶æãè¤éã«ãªãã¾ãã
ãããã®ãã¬ã¼ããªããé©åã«ç®¡çãããã¨ãããªã¯ã¨ã¹ãéè¤æé¤ã®æåçãªå®è£ ã®éµã¨ãªãã¾ããä¾ãã°ããã£ãã·ã¥ã®ããã©ã¼ãã³ã¹ã¨ä¸è²«æ§ã®ãã©ã³ã¹ãåãããã«ããã£ãã·ã¥æ¦ç¥ãæ éã«è¨è¨ããå¿ è¦ãããã¾ããã¾ããåæ£ãã£ãã·ã¥ã·ã¹ãã ï¼ä¾ï¼Redisï¼ã®ä½¿ç¨ãæ¤è¨ãããã¤ã¯ããµã¼ãã¹éã§ãã£ãã·ã¥ãå ±æãããã¨ãæå¹ãªæ¦ç¥ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
èé害æ§ã®åä¸: ãªã¯ã¨ã¹ãéè¤æé¤ã¯ããããã¯ã¼ã¯ã®ä¸æçãªé害ãã¯ã©ã¤ã¢ã³ãã®äºæãã¬åä½ã«å¯¾ããã·ã¹ãã ã®èæ§ãé«ãã¾ããããã¯ç¹ã«ãéèåå¼ãéè¦ãªãã¼ã¿æ´æ°ãæ±ãã·ã¹ãã ã§éè¦ã§ãã
ã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã¨ã®çµ±å: ãªã¯ã¨ã¹ãéè¤æé¤ã¯ãã¤ãã³ãé§åã¢ã¼ããã¯ãã£ã«ããã¦ãéè¦ã§ããä¾ãã°ãã¡ãã»ã¼ã¸ãã¥ã¼ã使ç¨ããã·ã¹ãã ã§ãã¡ãã»ã¼ã¸ã®éè¤å¦çãé²ãããã«åæ§ã®æè¡ãé©ç¨ã§ãã¾ãã
ã°ãã¼ãã«ã¦ãã¼ã¯èå¥åã®çæ: ã¯ã©ã¤ã¢ã³ãå´ã§ã®ã¦ãã¼ã¯ãªèå¥åçæã¯ãåæ£ã·ã¹ãã ã«ãããéè¦ãªèª²é¡ã§ããUUIDv4ãULIDãªã©ã®å¹ççã§è¡çªã®å¯è½æ§ãä½ãèå¥åçæã¢ã«ã´ãªãºã ã®ä½¿ç¨ãæ¤è¨ãã¹ãã§ãã
ç£è¦ã¨ãªãã¶ã¼ãããªãã£: ãªã¯ã¨ã¹ãéè¤æé¤ã®å¹æã測å®ããã·ã¹ãã ã®æåãç解ããããã«ãé©åãªç£è¦ã¨ãã®ã³ã°ãä¸å¯æ¬ ã§ããéè¤ãªã¯ã¨ã¹ãã®é »åº¦ããã£ãã·ã¥ãããçãèå¥åã®è¡çªåæ°ãªã©ã®ææ¨ã追跡ãããã¨ã§ãã·ã¹ãã ã®å¥å ¨æ§ãè©ä¾¡ã§ãã¾ãã
ã»ãã¥ãªãã£ã®èæ ®: ãªã¯ã¨ã¹ãèå¥åã®äºæ¸¬å¯è½æ§ãæä½å¯è½æ§ã«æ³¨æãæãå¿ è¦ãããã¾ããæªæã®ããã¦ã¼ã¶ã¼ãèå¥åãæ¨æ¸¬ã¾ãã¯åå©ç¨ãããã¨ã§ãã·ã¹ãã ãæªç¨ããå¯è½æ§ãããã¾ãã
ãã£ãã·ã¥æ¦ç¥ã®æé©å: ãã£ãã·ã¥ã®ããã©ã¼ãã³ã¹ã¨é®®åº¦ã®ãã©ã³ã¹ãåãããã«ãé層çãã£ãã·ã¥ããã£ãã·ã¥ã®äºåèªã¿è¾¼ã¿ãªã©ã®é«åº¦ãªæè¡ãæ¤è¨ãããã¨ãã§ãã¾ãã
ãã¼ã¸ã§ãã³ã°ã¨ã®çµ±å: APIã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨ãªã¯ã¨ã¹ãéè¤æé¤ã¡ã«ããºã ãçµ±åããæ¹æ³ãèæ ®ããå¿ è¦ãããã¾ããæ°ãããã¼ã¸ã§ã³ã®APIã§éè¤æé¤ã®å®è£ ãå¤æ´ãããå ´åãå¤ããã¼ã¸ã§ã³ã¨ã®äºææ§ãã©ã®ããã«ç¶æããããæ¤è¨ããªããã°ãªãã¾ããã
ãªã¯ã¨ã¹ãéè¤æé¤ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã£
ãªã¯ã¨ã¹ãéè¤æé¤ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
åæ£ãã£ãã·ã¥ã·ã¹ãã : ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ã¯ãä¸å¤®é権çãªãã£ãã·ã¥ã·ã¹ãã ï¼ä¾ï¼Redisï¼ã®ä½¿ç¨ãæ¤è¨ããå¿ è¦ãããã¾ããããã«ãããç°ãªããµã¼ãã¹éã§ãã£ãã·ã¥æ å ±ãå ±æããã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ãç¶æã§ãã¾ãã
éåæå¦çã¨ã®çµ±å: é·æéå®è¡ãããæä½ãéåæå¦çãå«ãã·ã¹ãã ã§ã¯ããªã¯ã¨ã¹ãéè¤æé¤ã¡ã«ããºã ãããæ éã«è¨è¨ããå¿ è¦ãããã¾ããä¾ãã°ãå¦çã®éå§æç¹ã§ãã£ãã·ã¥ã¨ã³ããªãä½æããå¦çã®å®äºæã«æ´æ°ãããªã©ã®æ¦ç¥ãèãããã¾ãã
ãã©ã¼ã«ããã¯æ¦ç¥: ãã£ãã·ã¥ã·ã¹ãã ã®é害ã«åãã¦ãé©åãªãã©ã¼ã«ããã¯æ¦ç¥ãå®è£ ããå¿ è¦ãããã¾ããä¾ãã°ããã£ãã·ã¥ãå©ç¨ã§ããªãå ´åã¯ãä¸æçã«éè¤æé¤ãç¡å¹ã«ãã代ããã«ã¹ãçæ§ãä¿è¨¼ããä»ã®æ¹æ³ã使ç¨ãããªã©ã§ãã
ãã£ãã·ã¥ã®æ´åæ§ç¶æ: åæ£ã·ã¹ãã ã«ããã¦ã¯ããã£ãã·ã¥ã®æ´åæ§ãç¶æãããã¨ã課é¡ã¨ãªãã¾ããã¤ãã³ãã½ã¼ã·ã³ã°ãCQRSãªã©ã®ãã¿ã¼ã³ã使ç¨ãã¦ããã£ãã·ã¥ã®æ´æ°ã¨å®éã®ãã¼ã¿æ´æ°ãåæãããæ¹æ³ãæ¤è¨ããå¿ è¦ãããã¾ãã
ã¹ã±ã¼ã©ããªãã£ã®èæ ®: ãªã¯ã¨ã¹ãéè¤æé¤ã¡ã«ããºã ãã·ã¹ãã ã®ã¹ã±ã¼ã©ããªãã£ã®ããã«ããã¯ã«ãªããªããã注æãå¿ è¦ã§ããè² è·åæ£ãããã·ã¹ãã ã§ã¯ããã£ãã·ã¥ã®åæ£ãè¤è£½ãé©åã«è¨è¨ããå¿ è¦ãããã¾ãã
çµè«
第26ç« ãRequest deduplicationãã¯ãAPIã«ããããªã¯ã¨ã¹ãéè¤æé¤ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®ä¿¡é ¼æ§ãä¸è²«æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®å ç¢æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã¯ããããã¯ã¼ã¯ã®ä¸ç¢ºå®æ§ã«èµ·å ããåé¡ã軽æ¸ããéã¹ãçãªæä½ã®å®å ¨æ§ãåä¸ãããéè¦ãªã¡ã«ããºã ã§ãã
ã¯ã©ã¤ã¢ã³ãçæã®ã¦ãã¼ã¯ãªèå¥åã¨ããµã¼ãã¼å´ã§ã®ã¬ã¹ãã³ã¹ãã£ãã·ã³ã°ãããã®å®è£ ã®æ ¸å¿ã¨ãªãã¾ãã
ãã£ãã·ã¥ã®ä¸è²«æ§ãèå¥åã®è¡çªç®¡çãé©åãªãã£ãã·ã¥æå¹æéã®è¨å®ããå®è£ ä¸ã®éè¦ãªèæ ®ç¹ã¨ãªãã¾ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã®å°å ¥ã«ã¯ãã¡ã¢ãªä½¿ç¨éã®å¢å ãè¤éæ§ã®å¢å ãä¸è²«æ§ã¨é®®åº¦ã®ãã©ã³ã¹ãªã©ã®ãã¬ã¼ããªããããã¾ãã
åæ£ã·ã¹ãã ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ã¯ããã£ãã·ã¥ã®ä¸è²«æ§ç¶æã¨åæ£ãç¹ã«éè¦ãªèª²é¡ã¨ãªãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããä¿¡é ¼æ§ãé«ããä¸è²«æ§ã®ããAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ããããã¯ã¼ã¯ã®ä¿¡é ¼æ§ãä½ãç°å¢ããéè¦ãªãã¼ã¿æ´æ°ãæ±ãã·ã¹ãã ã§ã¯ããªã¯ã¨ã¹ãéè¤æé¤ã®é©åãªå®è£ ã極ãã¦éè¦ã§ãã
ãããããªã¯ã¨ã¹ãéè¤æé¤ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãããã©ã¼ãã³ã¹ãã¡ã¢ãªä½¿ç¨éãã·ã¹ãã ã®è¤éæ§ã®å¢å ãã»ãã¥ãªãã£ã®è¦³ç¹ãããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããªã¯ã¨ã¹ãéè¤æé¤ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«åã ã®ãªã¯ã¨ã¹ãã®éè¤ãé²ãã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãªã¯ã¨ã¹ãéè¤æé¤ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®å復åãé«ãããã¼ã¿ã®æ´åæ§ãä¿è·ããã¦ã¼ã¶ã¼ä½é¨ãåä¸ãããå¯è½æ§ãããã¾ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ããªç°å¢ã§ã¯ããã®æ©è½ã®éè¦æ§ãããé¡èã«ãªãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
ããã«ããªã¯ã¨ã¹ãéè¤æé¤ã¡ã«ããºã ã¯ãã·ã¹ãã ã®å¯è¦³æ¸¬æ§ã¨éç¨æ§ã®åä¸ã«ãè²¢ç®ãã¾ããé©åã«å®è£ ããããªã¯ã¨ã¹ãéè¤æé¤ã·ã¹ãã ã¯ãéè¤ãªã¯ã¨ã¹ãã®é »åº¦ããã¿ã¼ã³ãåå ã«é¢ããè²´éãªæ´å¯ãæä¾ããã·ã¹ãã ã®æåããããã¯ã¼ã¯ã®ä¿¡é ¼æ§ã«é¢ããåé¡ãæ©æã«æ¤åºãããã¨ãå¯è½ã«ãã¾ãããããã®æ å ±ã¯ãã·ã¹ãã ã®æé©åãåé¡ã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ã«é常ã«æç¨ã§ãã
æå¾ã«ããªã¯ã¨ã¹ãéè¤æé¤ã®å®è£ ã¯ãAPIã®è¨è¨å²å¦ã¨å¯æ¥ã«é¢é£ãã¦ãã¾ããéãã¯ã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼ã®è²¬ä»»åæ ãã¨ã©ã¼å¦çæ¦ç¥ããªãã©ã¤ããªã·ã¼ãªã©ãAPIã®åºæ¬çãªè¨è¨ååã«å½±é¿ãä¸ãã¾ãããããã£ã¦ããªã¯ã¨ã¹ãéè¤æé¤ã¡ã«ããºã ã®å°å ¥ãæ¤è¨ããéã¯ãAPIã®å ¨ä½çãªè¨è¨å²å¦ã¨ã®æ´åæ§ãæ éã«è©ä¾¡ããå¿ è¦ã«å¿ãã¦èª¿æ´ãè¡ããã¨ãéè¦ã§ãã
ãã®ãããªå æ¬çãªã¢ããã¼ããåããã¨ã§ããªã¯ã¨ã¹ãéè¤æé¤ã¯åãªãæè¡çãªè§£æ±ºçãè¶ ããã·ã¹ãã å ¨ä½ã®å質ã¨ä¿¡é ¼æ§ãåä¸ãããéè¦ãªè¦ç´ ã¨ãªãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã¯ããã®æ©è½ã®éè¦æ§ãèªèããé©åã«å®è£ ãããã¨ã§ãããå ç¢ã§å¹ççãããã¦ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
27 Request validation
ãAPI Design Patternsãã®ç¬¬27ç« ãRequest validationãã¯ãAPIã«ããããªã¯ã¨ã¹ãæ¤è¨¼ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã¯ã¨ã¹ãæ¤è¨¼ãåãªã便å©æ©è½ã§ã¯ãªããAPIã®å®å ¨æ§ãä¿¡é ¼æ§ãããã¦å ¨ä½çãªã¦ã¼ã¶ã¼ä½é¨ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãAPIã®è¤éãã¨ããã«ä¼´ã誤ç¨ã®ãªã¹ã¯ããè°è«ãå§ãã¦ãã¾ããæãåç´ã«è¦ããAPIã§ããããã®å é¨åä½ã¯è¤éã§ãããã¦ã¼ã¶ã¼ãæå³ããéãã«åä½ãããã©ãããäºåã«ç¢ºèªãããã¨ã¯å°é£ã§ããç¹ã«ãæ¬çªç°å¢ã§æªæ¤è¨¼ã®ãªã¯ã¨ã¹ããå®è¡ãããã¨ã®ãªã¹ã¯ã¯é«ããèè ã¯ãããè»ã®ä¿®çã«ä¾ãã¦ãã¾ããç´ äººãè»ãããããã¨ã§æ·±å»ãªåé¡ãå¼ãèµ·ããå¯è½æ§ãããã®ã¨åæ§ã«ãæªæ¤è¨¼ã®APIãªã¯ã¨ã¹ãã¯æ¬çªã·ã¹ãã ã«äºæãã¬å½±é¿ãä¸ããå¯è½æ§ãããã¾ãã
ãã®åé¡ã«å¯¾å¦ãããããèè
ã¯validateOnly
ãã£ã¼ã«ãã®å°å
¥ãææ¡ãã¦ãã¾ããããã¯ããªã¯ã¨ã¹ããå®éã«å®è¡ããã«æ¤è¨¼ã®ã¿ãè¡ãããã®ãã©ã°ã§ãããã®æ©è½ã«ãããã¦ã¼ã¶ã¼ã¯å®å
¨ã«ãªã¯ã¨ã¹ãã®çµæããã¬ãã¥ã¼ããæ½å¨çãªåé¡ãäºåã«ææ¡ãããã¨ãã§ãã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããè¤æ°ã®ãµã¼ãã¹ãç¸äºã«ä¾åãåãè¤éãªã·ã¹ãã ã§ã¯ãä¸ã¤ã®èª¤ã£ããªã¯ã¨ã¹ããé£éçã«åé¡ãå¼ãèµ·ããå¯è½æ§ãããã¾ãããªã¯ã¨ã¹ãæ¤è¨¼ãé©åã«å®è£ ãããã¨ã§ããã®ãããªãªã¹ã¯ãå¤§å¹ ã«è»½æ¸ããã·ã¹ãã å ¨ä½ã®å®å®æ§ã¨ä¿¡é ¼æ§ãåä¸ããããã¨ãã§ãã¾ãã
èè ã¯ããªã¯ã¨ã¹ãæ¤è¨¼ã®åºæ¬çãªæµãã以ä¸ã®ããã«ææ¡ãã¦ãã¾ãã
- ã¯ã©ã¤ã¢ã³ãã
validateOnly: true
ãã©ã°ãå«ããªã¯ã¨ã¹ããéä¿¡ããã - ãµã¼ãã¼ã¯ãªã¯ã¨ã¹ããé常éãå¦çããããå®éã®ãã¼ã¿å¤æ´ãå¯ä½ç¨ãä¼´ãæä½ã¯è¡ããªãã
- ãµã¼ãã¼ã¯ãå®éã®ãªã¯ã¨ã¹ããè¡ãããå ´åã¨åæ§ã®ã¬ã¹ãã³ã¹ãçæããè¿å´ããã
ãã®æ¹æ³ã«ãããã¦ã¼ã¶ã¼ã¯å®å ¨ã«ãªã¯ã¨ã¹ãã®çµæããã¬ãã¥ã¼ããæ½å¨çãªåé¡ï¼æ¨©éä¸è¶³ããã¼ã¿ã®ä¸æ´åãªã©ï¼ãäºåã«ææ¡ãããã¨ãã§ãã¾ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã®å®è£
èè ã¯ããªã¯ã¨ã¹ãæ¤è¨¼ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
validateOnly
ãã©ã°: ãªã¯ã¨ã¹ããªãã¸ã§ã¯ãã«ãªãã·ã§ã³ã®ãã¼ãªã¢ã³ãã£ã¼ã«ãã¨ãã¦è¿½å ãã¾ããããã©ã«ãã¯false
ã§ããã¹ãã§ããæ¤è¨¼ã®ç¯å²: å¯è½ãªéãå¤ãã®æ¤è¨¼ãè¡ãã¹ãã§ããããã«ã¯ã権éãã§ãã¯ããã¼ã¿ã®æ´åæ§ãã§ãã¯ãåç §æ´åæ§ãã§ãã¯ãªã©ãå«ã¾ãã¾ãã
å¤é¨ä¾åé¢ä¿ã®æ±ã: å¤é¨ãµã¼ãã¹ã¨ã®éä¿¡ãå¿ è¦ãªå ´åããããã®ãµã¼ãã¹ãæ¤è¨¼ã¢ã¼ãããµãã¼ããã¦ããªãéãããã®é¨åã®æ¤è¨¼ã¯çç¥ããå¿ è¦ãããã¾ãã
ã¬ã¹ãã³ã¹ã®çæ: å®éã®ãªã¯ã¨ã¹ãã¨åæ§ã®ã¬ã¹ãã³ã¹ãçæãã¹ãã§ãããã ãããµã¼ãã¼çæã®èå¥åãªã©ã®ä¸é¨ã®ãã£ã¼ã«ãã¯ç©ºç½ã¾ãã¯ä»®ã®å¤ã§åããå¿ è¦ãããã¾ãã
å®å ¨æ§ã¨ã¹ãçæ§: æ¤è¨¼ãªã¯ã¨ã¹ãã¯å¸¸ã«å®å ¨ï¼ãã¼ã¿ãå¤æ´ããªãï¼ãã¤ã¹ãçï¼åããªã¯ã¨ã¹ãã§å¸¸ã«åãçµæãè¿ãï¼ã§ããã¹ãã§ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãªã¯ã¨ã¹ãæ¤è¨¼ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type CreateChatRoomRequest struct { Resource ChatRoom `json:"resource"` ValidateOnly bool `json:"validateOnly,omitempty"` } func (s *Service) CreateChatRoom(ctx context.Context, req CreateChatRoomRequest) (*ChatRoom, error) { if err := s.validateCreateChatRoom(ctx, req); err != nil { return nil, err } if req.ValidateOnly { return &ChatRoom{ ID: "placeholder-id", Name: req.Resource.Name, // ãã®ä»ã®ãã£ã¼ã«ã }, nil } // å®éã®ãªã½ã¼ã¹ä½æãã¸ã㯠return s.actuallyCreateChatRoom(ctx, req.Resource) } func (s *Service) validateCreateChatRoom(ctx context.Context, req CreateChatRoomRequest) error { // 権éãã§ã㯠if err := s.checkPermissions(ctx, "create_chat_room"); err != nil { return err } // ãã¼ã¿æ¤è¨¼ if err := validateChatRoomData(req.Resource); err != nil { return err } // å¤é¨ä¾åé¢ä¿ã®ãã§ãã¯ï¼å¯è½ãªå ´åï¼ // ... return nil }
ãã®å®è£
ä¾ã§ã¯ãvalidateOnly
ãã©ã°ã«åºã¥ãã¦å®éã®å¦çãè¡ããã©ãããå¶å¾¡ãã¦ãã¾ããæ¤è¨¼ãã§ã¼ãºã¯å¸¸ã«å®è¡ãããã¨ã©ã¼ãããå ´åã¯æ©æã«è¿å´ããã¾ããæ¤è¨¼ã¢ã¼ãã®å ´åãå®éã®ãªã½ã¼ã¹ä½æã¯è¡ããããã¬ã¼ã¹ãã«ãã¼ã®ã¬ã¹ãã³ã¹ãè¿ãã¾ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããªã¯ã¨ã¹ãæ¤è¨¼ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
è¤éæ§ã®å¢å : ãªã¯ã¨ã¹ãæ¤è¨¼æ©è½ã®è¿½å ã¯ãAPIã®è¤éæ§ãå¢å ããã¾ããããã¯ãå®è£ ã¨ãã¹ãã®è² æ ãå¢ããå¯è½æ§ãããã¾ãã
ããã©ã¼ãã³ã¹ã¸ã®å½±é¿: æ¤è¨¼ãªã¯ã¨ã¹ãã¯ãå®éã®å¦çãè¡ããªãããä¸è¬çã«é«éã§ããã大éã®æ¤è¨¼ãªã¯ã¨ã¹ãããã£ãå ´åãã·ã¹ãã ã«è² è·ããããå¯è½æ§ãããã¾ãã
å¤é¨ä¾åé¢ä¿ã®æ±ã: å¤é¨ãµã¼ãã¹ã¨ã®é£æºãå¿ è¦ãªå ´åãå®å ¨ãªæ¤è¨¼ãé£ãããªãå¯è½æ§ãããã¾ããããã¯ãã·ã¹ãã ã®ä¸é¨ã®åä½ãæ£ç¢ºã«äºæ¸¬ã§ããªããªããã¨ãæå³ãã¾ãã
ä¸ç¢ºå®ãªçµæã®æ±ã: ã©ã³ãã æ§ãæéä¾åã®å¦çãå«ããªã¯ã¨ã¹ãã®æ¤è¨¼ã¯ãå®éã®çµæãæ£ç¢ºã«äºæ¸¬ãããã¨ãé£ããå ´åãããã¾ãã
ãããã®ãã¬ã¼ããªããé©åã«ç®¡çãããã¨ãããªã¯ã¨ã¹ãæ¤è¨¼ã®æåçãªå®è£ ã®éµã¨ãªãã¾ããä¾ãã°ãå¤é¨ä¾åé¢ä¿ã®æ±ãã«ã¤ãã¦ã¯ãã¢ãã¯ãã¹ã¿ãã使ç¨ãã¦å¯è½ãªéãç¾å®çãªæ¤è¨¼ãè¡ããã¨ãèãããã¾ããã¾ããä¸ç¢ºå®ãªçµæã«ã¤ãã¦ã¯ãå¯è½ãªçµæã®ç¯å²ã示ããªã©ãã¦ã¼ã¶ã¼ã«é©åãªæ å ±ãæä¾ãããã¨ãéè¦ã§ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ãªã¹ã¯ç®¡çã¨ã³ã¹ãåæ¸: ãªã¯ã¨ã¹ãæ¤è¨¼ã¯ãæ¬çªç°å¢ã§ã®ä¸é©åãªãªã¯ã¨ã¹ãã«ãããªã¹ã¯ãå¤§å¹ ã«è»½æ¸ãã¾ããããã¯ãç¹ã«éèç³»ã®APIãéè¦ãªãã¼ã¿ãæ±ãã·ã¹ãã ã§é常ã«éè¦ã§ãã
éçºå¹çã®åä¸: éçºè ãAPIã®åä½ãäºåã«ç¢ºèªã§ãããã¨ã§ãéçºãµã¤ã¯ã«ãç縮ãããå質ãåä¸ãã¾ããããã¯ãç¹ã«è¤éãªãã¤ã¯ããµã¼ãã¹ç°å¢ã§éè¦ã§ãã
ããã¥ã¡ã³ãã¼ã·ã§ã³ã®è£å®: ãªã¯ã¨ã¹ãæ¤è¨¼ã¯ãåçãªããã¥ã¡ã³ãã¼ã·ã§ã³ã®ä¸å½¢æ ã¨è¦ãªããã¨ãã§ãã¾ããéçºè ã¯ãAPIã®åä½ãå®éã«è©¦ããã¨ã§ãããã¥ã¡ã³ãã ãã§ã¯åããã«ããç´°ããªæåãç解ã§ãã¾ãã
ã»ãã¥ãªãã£ã®å¼·å: æ¤è¨¼ã¢ã¼ãã使ç¨ãããã¨ã§ãæ½å¨çãªèå¼±æ§ãä¸é©åãªã¢ã¯ã»ã¹è©¦è¡ãäºåã«çºè¦ã§ããå¯è½æ§ãããã¾ããããã¯ãã»ãã¥ãªãã£ç£æ»ã®ä¸é¨ã¨ãã¦æ´»ç¨ã§ãã¾ãã
éç¨ã®ç°¡ç´ å: æ¬çªç°å¢ã§ã®åé¡ãäºåã«åé¿ã§ãããã¨ã§ãã¤ã³ã·ãã³ã対å¿ã®é »åº¦ãæ¸å°ããéç¨è² è·ã軽æ¸ããã¾ãã
段éçãªãããã¤ã¡ã³ãæ¦ç¥ã¨ã®çµ±å: æ°æ©è½ã®ãã¼ã«ã¢ã¦ãæã«ãæ¤è¨¼ã¢ã¼ããæ´»ç¨ãã¦æ½å¨çãªåé¡ãæ©æã«çºè¦ãããã¨ãã§ãã¾ããããã¯ãã«ããªã¢ãªãªã¼ã¹ããã«ã¼/ã°ãªã¼ã³ãããã¤ã¡ã³ããªã©ã®æ¦ç¥ã¨çµã¿åããã¦å¹æçã§ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã£
ãªã¯ã¨ã¹ãæ¤è¨¼ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã§ã®å®è£ : è¤æ°ã®ãµã¼ãã¹ã«ã¾ããããªã¯ã¨ã¹ãã®æ¤è¨¼ã¯ãç¹ã«æ³¨æãå¿ è¦ã§ãããµã¼ãã¹éã®ä¾åé¢ä¿ãèæ ®ããæ´åæ§ã®ããæ¤è¨¼çµæãæä¾ããå¿ è¦ãããã¾ãã
ãã£ãã·ã¥æ¦ç¥: æ¤è¨¼ãªã¯ã¨ã¹ãã®çµæããã£ãã·ã¥ãããã¨ã§ãããã©ã¼ãã³ã¹ãåä¸ããããã¨ãã§ãã¾ãããã ãããã£ãã·ã¥ã®æå¹æéãæ´æ°æ¦ç¥ãæ éã«è¨è¨ããå¿ è¦ãããã¾ãã
éåæå¦çã¨ã®çµ±å: é·æéå®è¡ãããæä½ãéåæå¦çãå«ãã·ã¹ãã ã§ã¯ãæ¤è¨¼ã¢ã¼ãã®åä½ãæ éã«è¨è¨ããå¿ è¦ãããã¾ããä¾ãã°ãéåæå¦çã®äºæ¸¬ãããçµæãã·ãã¥ã¬ã¼ãããæ¹æ³ãèããå¿ è¦ãããã¾ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: æ¤è¨¼ãªã¯ã¨ã¹ãã®ä½¿ç¨ãã¿ã¼ã³ãé »åº¦ãç£è¦ãããã¨ã§ãAPIã®ä½¿ç¨ç¶æ³ãæ½å¨çãªåé¡ãããæ·±ãç解ã§ãã¾ãããããã®ææ¨ã¯ãã·ã¹ãã ã®æé©åãã¦ã¼ã¶ããªãã£ã®åä¸ã«æ´»ç¨ã§ãã¾ãã
ãã¹ãæ¦ç¥: ãªã¯ã¨ã¹ãæ¤è¨¼æ©è½èªä½ããã¹ãã®å¯¾è±¡ã¨ãªãã¾ããç¹ã«ãå®éã®å¦çã¨æ¤è¨¼ã¢ã¼ãã®çµæã®ä¸è²«æ§ã確ä¿ããããã®ãã¹ãæ¦ç¥ãéè¦ã§ãã
çµè«
第27ç« ãRequest validationãã¯ãAPIã«ããããªã¯ã¨ã¹ãæ¤è¨¼ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®å®å ¨æ§ãä¿¡é ¼æ§ãããã¦å ¨ä½çãªã¦ã¼ã¶ã¼ä½é¨ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã¯ãAPIã®è¤éãã«èµ·å ãããªã¹ã¯ã軽æ¸ããéè¦ãªã¡ã«ããºã ã§ãã
validateOnly
ãã©ã°ã使ç¨ãããã¨ã§ãã¦ã¼ã¶ã¼ã¯å®å ¨ã«ãªã¯ã¨ã¹ãã®çµæããã¬ãã¥ã¼ã§ãã¾ããæ¤è¨¼ãªã¯ã¨ã¹ãã¯ãå¯è½ãªéãå®éã®ãªã¯ã¨ã¹ãã¨åæ§ã®å¦çãè¡ãã¾ããããã¼ã¿ã®å¤æ´ãå¯ä½ç¨ãä¼´ãæä½ã¯é¿ããã¹ãã§ãã
å¤é¨ä¾åé¢ä¿ãä¸ç¢ºå®ãªçµæãå«ããªã¯ã¨ã¹ãã®æ¤è¨¼ã«ã¯ç¹å¥ãªé æ ®ãå¿ è¦ã§ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã®å°å ¥ã«ã¯ãè¤éæ§ã®å¢å ãããã©ã¼ãã³ã¹ã¸ã®å½±é¿ãªã©ã®ãã¬ã¼ããªããããã¾ãããããããä¸åã価å¤ãæä¾ããå¯è½æ§ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããå®å ¨ã§ä¿¡é ¼æ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ãéè¦ãªãã¼ã¿ãæ±ãã·ã¹ãã ãè¤éãªãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãæ¡ç¨ãã¦ããç°å¢ã§ã¯ããªã¯ã¨ã¹ãæ¤è¨¼ã®é©åãªå®è£ ã極ãã¦éè¦ã§ãã
ãããããªã¯ã¨ã¹ãæ¤è¨¼ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãããã©ã¼ãã³ã¹ãè¤éæ§ã®ç®¡çãå¤é¨ä¾åé¢ä¿ã®æ±ããªã©ã®è¦³ç¹ãããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããªã¯ã¨ã¹ãæ¤è¨¼ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«åã ã®ãªã¯ã¨ã¹ãã®å®å ¨æ§ãåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãéç¨å¹çãããã¦éçºçç£æ§ã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãªã¯ã¨ã¹ãæ¤è¨¼ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®å復åãé«ããéçºãµã¤ã¯ã«ãç縮ããã¦ã¼ã¶ã¼ä½é¨ãåä¸ãããå¯è½æ§ãããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§ä½¿ããããã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ããããç¹ã«ãæ¥éã«å¤åãããã¸ãã¹è¦ä»¶ãè¤éãªæè¡ã¹ã¿ãã¯ãæã¤ç¾ä»£ã®ã½ããã¦ã§ã¢éçºç°å¢ã«ããã¦ããªã¯ã¨ã¹ãæ¤è¨¼ã¯éè¦ãªå½¹å²ãæããå¯è½æ§ãããã¾ãã
æå¾ã«ããªã¯ã¨ã¹ãæ¤è¨¼ã¯åãªãæè¡çãªæ©è½ã§ã¯ãªããAPIã®è¨è¨å²å¦ãåæ ãããã®ã§ãããã¾ããããã¯ãã¦ã¼ã¶ã¼ãã¬ã³ããªã¼ãªã¤ã³ã¿ã¼ãã§ã¼ã¹ãéææ§ãããã¦äºæ¸¬å¯è½æ§ã¸ã® commitment ã示ãã¦ãã¾ããé©åã«å®è£ ããããªã¯ã¨ã¹ãæ¤è¨¼æ©è½ã¯ãAPIæä¾è ã¨ãã®æ¶è²»è ã®éã®ä¿¡é ¼é¢ä¿ãå¼·åããããå¹æçãªã³ã©ãã¬ã¼ã·ã§ã³ãä¿é²ãã¾ãã
ãã®æ©è½ã¯ãããã§ã¤ã«ãã¡ã¹ããã®ååã¨ãæ´åãã¦ãããåé¡ãæ©æã«çºè¦ããä¿®æ£ããããã®å¼·åãªãã¼ã«ã¨ãªãã¾ããéçºè ã¯ãæ¬çªç°å¢ã«å¤æ´ããããã¤ããåã«ããã®å½±é¿ãå®å ¨ã«è©ä¾¡ãããã¨ãã§ãã¾ããããã«ãããã¤ãã¬ã¼ã·ã§ã³ã®ãµã¤ã¯ã«ãç縮ãããã¤ããã¼ã·ã§ã³ã®ãã¼ã¹ãå éããå¯è½æ§ãããã¾ãã
ã¾ãããªã¯ã¨ã¹ãæ¤è¨¼ã¯ãAPIã®ãã¼ã¸ã§ãã³ã°ãé²åã®æ¦ç¥ã¨ãå¯æ¥ã«é¢é£ãã¦ãã¾ããæ°ãããã¼ã¸ã§ã³ã®APIããªãªã¼ã¹ããéãéçºè ã¯æ¤è¨¼ã¢ã¼ãã使ç¨ãã¦ãæ¢åã®ã¯ã©ã¤ã¢ã³ãã¸ã®å½±é¿ãäºåã«è©ä¾¡ãããã¨ãã§ãã¾ããããã«ãããç ´å£çãªå¤æ´ã®ãªã¹ã¯ãæå°éã«æãã¤ã¤ãAPIãç¶ç¶çã«æ¹åãããã¨ãå¯è½ã«ãªãã¾ãã
ããã«ããã®æ©è½ã¯ãAPIã®æè²çå´é¢ãæã£ã¦ãã¾ããéçºè ã¯ãæ¤è¨¼ã¢ã¼ããéãã¦APIã®åä½ãå®é¨çã«å¦ã¶ãã¨ãã§ãããããããã¥ã¡ã³ããè£å®ããåçãªå¦ç¿ãã¼ã«ã¨ãªãã¾ããããã¯ãAPI ã®æ¡ç¨ãä¿é²ããæ£ãã使ç¨æ³ã奨å±ãããã¨ã«ã¤ãªããã¾ãã
æçµçã«ããªã¯ã¨ã¹ãæ¤è¨¼ã®å®è£ ã¯ãAPIè¨è¨è ãã¦ã¼ã¶ã¼ã®è¦ç¹ã«ç«ã¡ããã®çµé¨ã常ã«èæ ®ãã¦ãããã¨ã示ã象徴çãªæ©è½ã¨è¨ããã§ããããããã¯ãåã«æ©è½ãæä¾ããã ãã§ãªããã¦ã¼ã¶ã¼ã®æåãç©æ¥µçã«æ¯æ´ããã¨ãããããåºç¯ãªAPIè¨è¨å²å¦ã®ä¸é¨ã¨ãªãã¾ãã
ãã®ãããªå æ¬çãªã¢ããã¼ããåããã¨ã§ããªã¯ã¨ã¹ãæ¤è¨¼ã¯åãªãæè¡çæ©è½ãè¶ ããAPIã®å質ãä¿¡é ¼æ§ãããã¦å ¨ä½çãªä¾¡å¤ã大ããåä¸ãããéè¦ãªè¦ç´ ã¨ãªãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã¯ããã®æ©è½ã®éè¦æ§ãèªèããé©åã«å®è£ ãããã¨ã§ããã使ãããããä¿¡é ¼æ§ãé«ããããã¦ç¶ç¶çãªé²åãå¯è½ãªAPIãæ§ç¯ãããã¨ãã§ããã§ããããããã¯ãæ¥éã«å¤åãã常ã«æ°ãã課é¡ãçã¾ããç¾ä»£ã®ã½ããã¦ã§ã¢éçºç°å¢ã«ããã¦ãç¹ã«éè¦ãªä¾¡å¤ã¨ãªãã¾ãã
28 Resource revisions
ãAPI Design Patternsãã®ç¬¬28ç« ãResource revisionsãã¯ãAPIã«ããããªã½ã¼ã¹ã®ãªãã¸ã§ã³ç®¡çã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã½ã¼ã¹ãªãã¸ã§ã³ãåãªãæ©è½ã®è¿½å ã§ã¯ãªããAPIã®æè»æ§ããã¼ã¿ã®æ´åæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®éç¨æ§ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãã®ç« ã§ã¯ããªã½ã¼ã¹ã®å¤æ´å±¥æ´ãå®å ¨ã«ä¿åããéå»ã®ç¶æ ãåå¾ã¾ãã¯å¾©å ããæ¹æ³ã«ã¤ãã¦èª¬æãã¦ãã¾ããå ·ä½çã«ã¯ãåã ã®ãªãã¸ã§ã³ã®èå¥æ¹æ³ããªãã¸ã§ã³ã®ä½ææ¦ç¥ï¼æé»çã¾ãã¯æ示çï¼ãå©ç¨å¯è½ãªãªãã¸ã§ã³ã®ãªã¹ãåã¨ç¹å®ã®ãªãã¸ã§ã³ã®åå¾æ¹æ³ã以åã®ãªãã¸ã§ã³ã¸ã®å¾©å ã®ä»çµã¿ãããã¦ãªãã¸ã§ã³å¯è½ãªãªã½ã¼ã¹ã®åãªã½ã¼ã¹ã®æ±ãæ¹ã«ã¤ãã¦è©³ãã解説ãã¦ãã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ã®å¿ è¦æ§ããè°è«ãå§ãã¦ãã¾ããå¤ãã®APIã§ã¯ããªã½ã¼ã¹ã®ç¾å¨ã®ç¶æ ã®ã¿ãä¿æããéå»ã®å¤æ´å±¥æ´ãç¡è¦ãã¦ãã¾ããããããå¥ç´æ¸ã購買注ææ¸ãæ³çææ¸ãåºåãã£ã³ãã¼ã³ãªã©ã®ãªã½ã¼ã¹ã§ã¯ãå¤æ´å±¥æ´ã追跡ããå¿ è¦æ§ãé«ããªãã¾ããããã«ãããåé¡ãçºçããéã«ãã©ã®å¤æ´ãåå ã§ããããç¹å®ãããããªãã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ãå調ãã¦åä½ããç°å¢ã§ã¯ãåãµã¼ãã¹ã管çãããªã½ã¼ã¹ã®å¤æ´å±¥æ´ãé©åã«è¿½è·¡ããå¿ è¦ã«å¿ãã¦éå»ã®ç¶æ ãåç §ã¾ãã¯å¾©å ã§ãããã¨ããã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ã¨ä¿¡é ¼æ§ã確ä¿ããä¸ã§éè¦ã«ãªãã¾ãã
èè ã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ã®åºæ¬çãªæ§é ã¨ãã¦ãæ¢åã®ãªã½ã¼ã¹ã«2ã¤ã®æ°ãããã£ã¼ã«ãã追å ãããã¨ãææ¡ãã¦ãã¾ãã
- revisionId: ãªãã¸ã§ã³ã®ä¸æã®èå¥å
- revisionCreateTime: ãªãã¸ã§ã³ãä½æãããæå»
ãããã®ãã£ã¼ã«ãã追å ãããã¨ã§ããªã½ã¼ã¹ã®è¤æ°ã®ã¹ãããã·ã§ãããæç³»åã§ç®¡çã§ããããã«ãªãã¾ããããã«ããããªã½ã¼ã¹ã®å¤æ´å±¥æ´ã追跡ããå¿ è¦ã«å¿ãã¦éå»ã®ç¶æ ãåç §ã¾ãã¯å¾©å ãããã¨ãå¯è½ã«ãªãã¾ãã
ãã®æ¦å¿µãè¦è¦çã«è¡¨ç¾ããããã«ãèè ã¯ä»¥ä¸ã®ãããªå³ãæ示ãã¦ãã¾ãã
Figure 28.1 Adding support for revisions to a Message resource
ãã®å³ã¯ãé常ã®Messageãªã½ã¼ã¹ã«revisionIdã¨revisionCreateTimeãã£ã¼ã«ãã追å ãããã¨ã§ããªãã¸ã§ã³ç®¡çããµãã¼ãããæ¹æ³ã示ãã¦ãã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®å®è£
èè ã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªãã¤ã³ãã¯ä»¥ä¸ã®éãã§ãã
ãªãã¸ã§ã³èå¥å: ãªãã¸ã§ã³ã®ä¸ææ§ã確ä¿ããããã«ãã©ã³ãã ãªèå¥åï¼ä¾ï¼UUIDï¼ã使ç¨ãããã¨ãæ¨å¥¨ãã¦ãã¾ããããã«ããããªãã¸ã§ã³ã®é åºãæéã«ä¾åããã«ãåãªãã¸ã§ã³ãä¸æã«èå¥ã§ãã¾ãã
ãªãã¸ã§ã³ã®ä½ææ¦ç¥: èè ã¯ãæé»çãªãªãã¸ã§ã³ä½æï¼ãªã½ã¼ã¹ãå¤æ´ããããã³ã«èªåçã«æ°ãããªãã¸ã§ã³ãä½æï¼ã¨æ示çãªãªãã¸ã§ã³ä½æï¼ã¦ã¼ã¶ã¼ãæ示çã«ãªãã¸ã§ã³ã®ä½æãè¦æ±ï¼ã®2ã¤ã®æ¦ç¥ãææ¡ãã¦ãã¾ããåã¢ããã¼ãã«ã¯ããããé·æã¨çæããããã·ã¹ãã ã®è¦ä»¶ã«å¿ãã¦é¸æããå¿ è¦ãããã¾ãã
ãªãã¸ã§ã³ã®åå¾ã¨ä¸è¦§è¡¨ç¤º: ç¹å®ã®ãªãã¸ã§ã³ãåå¾ããããã®ã¡ã½ããã¨ãå©ç¨å¯è½ãªãªãã¸ã§ã³ãä¸è¦§è¡¨ç¤ºããããã®ã¡ã½ããã®å®è£ ã«ã¤ãã¦èª¬æãã¦ãã¾ãããããã®ã¡ã½ããã«ãããã¦ã¼ã¶ã¼ã¯ãªã½ã¼ã¹ã®å¤æ´å±¥æ´ãåç §ããå¿ è¦ã«å¿ãã¦ç¹å®ã®æç¹ã®ç¶æ ãåå¾ã§ãã¾ãã
ãªãã¸ã§ã³ã®å¾©å : 以åã®ãªãã¸ã§ã³ã®ç¶æ ã«ãªã½ã¼ã¹ãæ»ãããã®å¾©å æä½ã®å®è£ æ¹æ³ã解説ãã¦ãã¾ãããã®æä½ã¯ã誤ã£ãå¤æ´ãå ã«æ»ããããç¹å®ã®æç¹ã®ç¶æ ã«æ»ãããããéã«éè¦ã§ãã
åãªã½ã¼ã¹ã®æ±ã: ãªãã¸ã§ã³å¯è½ãªãªã½ã¼ã¹ãåãªã½ã¼ã¹ãæã¤å ´åã®åãæ±ãã«ã¤ãã¦ãè°è«ãã¦ãã¾ããåãªã½ã¼ã¹ããªãã¸ã§ã³ã«å«ãããã©ããã¯ãã·ã¹ãã ã®è¦ä»¶ãããã©ã¼ãã³ã¹ã®èæ ®äºé ã«å¿ãã¦æ±ºå®ããå¿ è¦ãããã¾ãã
ãããã®ååãé©ç¨ãããGolangã§ã®ãªã½ã¼ã¹ãªãã¸ã§ã³ã®å®è£ ä¾ã以ä¸ã«ç¤ºãã¾ãã
type Resource struct { ID string `json:"id"` Content string `json:"content"` RevisionID string `json:"revisionId"` RevisionCreateTime time.Time `json:"revisionCreateTime"` } type ResourceService interface { GetResource(ctx context.Context, id string, revisionID string) (*Resource, error) ListResourceRevisions(ctx context.Context, id string) ([]*Resource, error) CreateResourceRevision(ctx context.Context, id string) (*Resource, error) RestoreResourceRevision(ctx context.Context, id string, revisionID string) (*Resource, error) } func (s *resourceService) CreateResourceRevision(ctx context.Context, id string) (*Resource, error) { resource, err := s.getLatestResource(ctx, id) if err != nil { return nil, err } newRevision := &Resource{ ID: resource.ID, Content: resource.Content, RevisionID: generateUUID(), RevisionCreateTime: time.Now(), } if err := s.saveRevision(ctx, newRevision); err != nil { return nil, err } return newRevision, nil }
ãã®å®è£
ä¾ã§ã¯ãResource
æ§é ä½ã«ãªãã¸ã§ã³é¢é£ã®ãã£ã¼ã«ãã追å ããResourceService
ã¤ã³ã¿ã¼ãã§ã¼ã¹ã§ãªãã¸ã§ã³ç®¡çã«é¢é£ããã¡ã½ãããå®ç¾©ãã¦ãã¾ããCreateResourceRevision
ã¡ã½ããã¯ãæ°ãããªãã¸ã§ã³ãä½æããä¿åããå¦çã示ãã¦ãã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®å½±é¿ã¨ãã¬ã¼ããªã
èè ã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ã®å°å ¥ãã·ã¹ãã å ¨ä½ã«ä¸ããå½±é¿ã¨ãã¬ã¼ããªãã«ã¤ãã¦ã詳細ã«è«ãã¦ãã¾ãã
ã¹ãã¬ã¼ã¸ä½¿ç¨éã®å¢å : ãªãã¸ã§ã³ãä¿åãããã¨ã§ãã¹ãã¬ã¼ã¸ã®ä½¿ç¨éãå¤§å¹ ã«å¢å ãã¾ããç¹ã«ãé »ç¹ã«å¤æ´ããããªã½ã¼ã¹ã大è¦æ¨¡ãªãªã½ã¼ã¹ã®å ´åããã®å½±é¿ã¯ç¡è¦ã§ãã¾ããã
ããã©ã¼ãã³ã¹ã¸ã®å½±é¿: ãªãã¸ã§ã³ã®ä½æãåå¾ã«ã¯è¿½å ã®ãªã¼ãã¼ããããçºçãã¾ããç¹ã«ã大éã®ãªãã¸ã§ã³ãåå¨ããå ´åããªãã¸ã§ã³ã®ä¸è¦§è¡¨ç¤ºãç¹å®ã®ãªãã¸ã§ã³ã®åå¾ã«æéããããå¯è½æ§ãããã¾ãã
è¤éæ§ã®å¢å : ãªãã¸ã§ã³ç®¡çæ©è½ã®è¿½å ã«ãããAPIã®è¤éæ§ãå¢å ãã¾ããããã¯ãéçºè ã®å¦ç¿æ²ç·ãæ¥ã«ãããã°ã®å¯è½æ§ãå¢ããå¯è½æ§ãããã¾ãã
ä¸è²«æ§ã®èª²é¡: ç¹ã«åæ£ã·ã¹ãã ã«ããã¦ããªãã¸ã§ã³ã®ä¸è²«æ§ãç¶æãããã¨ã¯é£ããå ´åãããã¾ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ã«ã¾ããããªã½ã¼ã¹ã®å ´åãå ¨ä½çãªä¸è²«æ§ã確ä¿ããã®ãå°é£ã«ãªãå¯è½æ§ãããã¾ãã
ãªãã¸ã§ã³ç®¡çã®ãªã¼ãã¼ããã: ãªãã¸ã§ã³ã®ä¿ææéãå¤ããªãã¸ã§ã³ã®åé¤ããªã·ã¼ããªãã¸ã§ã³æ°ã®å¶éãªã©ã追å çãªç®¡çã¿ã¹ã¯ãçºçãã¾ãã
ãããã®ãã¬ã¼ããªããé©åã«ç®¡çãããã¨ãããªã½ã¼ã¹ãªãã¸ã§ã³ã®æåçãªå®è£ ã®éµã¨ãªãã¾ããä¾ãã°ãã¹ãã¬ã¼ã¸ä½¿ç¨éã®å¢å ã«å¯¾ãã¦ã¯ãå§ç¸®æè¡ã®ä½¿ç¨ããéè¦ã§ãªããªãã¸ã§ã³ã®å®æçãªåé¤ãªã©ã®æ¦ç¥ãèãããã¾ããããã©ã¼ãã³ã¹ã¸ã®å½±é¿ã«é¢ãã¦ã¯ãå¹ççãªã¤ã³ããã¯ã¹è¨è¨ããå¿ è¦ã«å¿ãã¦ãã£ãã·ã¥ãæ´»ç¨ãããã¨ã§è»½æ¸ã§ããå¯è½æ§ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ã以ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ç£æ»ã¨ã³ã³ãã©ã¤ã¢ã³ã¹: ãªã½ã¼ã¹ãªãã¸ã§ã³ã¯ãå¤æ´å±¥æ´ã®è¿½è·¡ãå¿ è¦ãªè¦å¶ç°å¢ï¼éèãµã¼ãã¹ãå»çæ å ±ã·ã¹ãã ãªã©ï¼ã§ç¹ã«éè¦ã§ããå¤æ´ã®èª°ãããã¤ãä½ãããããæ£ç¢ºã«è¨é²ããå¿ è¦ã«å¿ãã¦éå»ã®ç¶æ ãåç¾ã§ãããã¨ã¯ãã³ã³ãã©ã¤ã¢ã³ã¹è¦ä»¶ãæºããä¸ã§ä¸å¯æ¬ ã§ãã
é害復æ§ã¨ãã¼ã«ããã¯: ãªãã¸ã§ã³ç®¡çã¯ãã·ã¹ãã é害ã人çºçãã¹ããã®å¾©æ§ã容æã«ãã¾ããç¹å®ã®æç¹ã®ç¶æ ã«æ»ããã¨ãã§ããããããã¼ã¿ã®æ失ãã·ã¹ãã ã®ä¸æ´åãæå°éã«æãããã¨ãã§ãã¾ãã
åæ£ã·ã¹ãã ã§ã®ä¸è²«æ§: ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã«ããã¦ããªã½ã¼ã¹ãªãã¸ã§ã³ã¯åæ£ã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ãç¶æããä¸ã§éè¦ãªå½¹å²ãæããã¾ããä¾ãã°ãè¤æ°ã®ãµã¼ãã¹ã«ã¾ããããã©ã³ã¶ã¯ã·ã§ã³ããåãµã¼ãã¹ã®ãªã½ã¼ã¹ãªãã¸ã§ã³ãç¨ãã¦è¿½è·¡ããå¿ è¦ã«å¿ãã¦è£åãã©ã³ã¶ã¯ã·ã§ã³ãå®è¡ãããã¨ãã§ãã¾ãã
A/Bãã¹ãã¨æ®µéçãã¼ã«ã¢ã¦ã: ãªãã¸ã§ã³ç®¡çæ©è½ã¯ãæ°æ©è½ã®æ®µéçãªãã¼ã«ã¢ã¦ããA/Bãã¹ãã®å®æ½ã容æã«ãã¾ããç¹å®ã®ã¦ã¼ã¶ã¼ã°ã«ã¼ãã«å¯¾ãã¦ç¹å®ã®ãªãã¸ã§ã³ãæä¾ãããã¨ã§ãå¤æ´ã®å½±é¿ãæ éã«è©ä¾¡ã§ãã¾ãã
ããã©ã¼ãã³ã¹æé©å: ãªãã¸ã§ã³ç®¡çã®å®è£ ã«ã¯ãå¹ççãªãã¼ã¿æ§é ã¨ã¢ã«ã´ãªãºã ã®é¸æãéè¦ã§ããä¾ãã°ãå·®åãã¼ã¹ã®ã¹ãã¬ã¼ã¸ã使ç¨ãã¦ããªãã¸ã§ã³éã®å¤æ´ã®ã¿ãä¿åãããã¨ã§ãã¹ãã¬ã¼ã¸ä½¿ç¨éãæé©åã§ãã¾ãã
ã»ãã¥ãªãã£ã¨ã¢ã¯ã»ã¹å¶å¾¡: ãªãã¸ã§ã³ç®¡çãå°å ¥ããéã¯ãåãªãã¸ã§ã³ã¸ã®ã¢ã¯ã»ã¹å¶å¾¡ãé©åã«è¨è¨ããå¿ è¦ãããã¾ããç¹ã«ãæ©å¯æ å ±ãå«ããªãã¸ã§ã³ã¸ã®ã¢ã¯ã»ã¹ãå¶éããç£æ»ãã°ãç¶æãããã¨ãéè¦ã§ãã
APIã®é²åã¨ãã¼ã¸ã§ãã³ã°: ãªã½ã¼ã¹ãªãã¸ã§ã³ã®æ¦å¿µã¯ãAPIãã®ãã®ã®ãã¼ã¸ã§ãã³ã°æ¦ç¥ã¨é¢é£ä»ãã¦èãããã¨ãã§ãã¾ããAPIã®åãã¼ã¸ã§ã³ããç¹å®ã®æç¹ã§ã®ãªã½ã¼ã¹å®ç¾©ã®ãªãã¸ã§ã³ã¨ãã¦æ±ããã¨ã§ãAPIã®é²åãããä½ç³»çã«ç®¡çã§ããå¯è½æ§ãããã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã£
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®è¨è¨ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã以ä¸ã®ç¹ã«ã¤ãã¦èæ ®ããå¿ è¦ãããã¾ãã
ãã¼ã¿ã¢ãã«ã¨ã¹ãã¼ãè¨è¨: ãªãã¸ã§ã³ç®¡çããµãã¼ãããããã«ããã¼ã¿ãã¼ã¹ã¹ãã¼ãã®è¨è¨ãé©åã«è¡ãå¿ è¦ãããã¾ããä¾ãã°ãã¡ã¤ã³ã®ãªã½ã¼ã¹ãã¼ãã«ã¨ã¯å¥ã«ãªãã¸ã§ã³ãã¼ãã«ãä½æããå¹ççã«ã¯ã¨ãªã§ããããã«ã¤ã³ããã¯ã¹ãè¨è¨ãããã¨ãéè¦ã§ãã
ãã£ãã·ã¥æ¦ç¥: ãªãã¸ã§ã³ç®¡çã¯ããã£ãã·ã¥æ¦ç¥ã«å½±é¿ãä¸ãã¾ããç¹å®ã®ãªãã¸ã§ã³ããã£ãã·ã¥ããå ´åããã£ãã·ã¥ã®æå¹æéãæ´æ°æ¦ç¥ãæ éã«è¨è¨ããå¿ è¦ãããã¾ãã
ã¤ãã³ãã½ã¼ã·ã³ã°ã¨CQRS: ãªã½ã¼ã¹ãªãã¸ã§ã³ã®æ¦å¿µã¯ãã¤ãã³ãã½ã¼ã·ã³ã°ãCQRSï¼Command Query Responsibility Segregationï¼ãã¿ã¼ã³ã¨è¦ªåæ§ãé«ãã§ãããããã®ãã¿ã¼ã³ãçµã¿åããããã¨ã§ãããæè»ã§æ¡å¼µæ§ã®é«ãã·ã¹ãã ãæ§ç¯ã§ããå¯è½æ§ãããã¾ãã
ããã¯ã¢ããã¨ç½å®³å¾©æ§: ãªãã¸ã§ã³ç®¡çæ©è½ã¯ãããã¯ã¢ããã¨ç½å®³å¾©æ§æ¦ç¥ã«çµã¿è¾¼ããã¨ãã§ãã¾ããç¹å®ã®æç¹ã®ã·ã¹ãã å ¨ä½ã®ç¶æ ããåãªã½ã¼ã¹ã®é©åãªãªãã¸ã§ã³ãç¨ãã¦åæ§ç¯ãããã¨ãå¯è½ã«ãªãã¾ãã
ãã¤ã¯ããµã¼ãã¹éã®æ´åæ§: è¤æ°ã®ãã¤ã¯ããµã¼ãã¹ã«ã¾ããããªã½ã¼ã¹ã®å ´åããªãã¸ã§ã³ç®¡çãéãã¦ãµã¼ãã¹éã®æ´åæ§ãç¶æãããã¨ãã§ãã¾ããä¾ãã°ãåæ£ãã©ã³ã¶ã¯ã·ã§ã³ã®ä»£ããã«ãåãµã¼ãã¹ã®ãªã½ã¼ã¹ãªãã¸ã§ã³ãç¨ããè£åãã©ã³ã¶ã¯ã·ã§ã³ãå®è£ ãããã¨ãèãããã¾ãã
çµè«
第28ç« ãResource revisionsãã¯ãAPIã«ããããªã½ã¼ã¹ãªãã¸ã§ã³ç®¡çã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®æè»æ§ããã¼ã¿ã®æ´åæ§ãããã¦å ¨ä½çãªã·ã¹ãã ã®éç¨æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã¯ãå¤æ´å±¥æ´ã®è¿½è·¡ãéå»ã®ç¶æ ã®åç §ã誤ã£ãå¤æ´ã®ãã¼ã«ããã¯ãå¯è½ã«ããå¼·åãªæ©è½ã§ãã
ãªãã¸ã§ã³ç®¡çã®å®è£ ã«ã¯ããªãã¸ã§ã³èå¥åã®è¨è¨ããªãã¸ã§ã³ä½ææ¦ç¥ã®é¸æããªãã¸ã§ã³ã®åå¾ã¨ä¸è¦§è¡¨ç¤ºã復å æ©è½ã®å®è£ ãªã©ãå¤ãã®èæ ®äºé ãããã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®å°å ¥ã«ã¯ãã¹ãã¬ã¼ã¸ä½¿ç¨éã®å¢å ãããã©ã¼ãã³ã¹ã¸ã®å½±é¿ãè¤éæ§ã®å¢å ãªã©ã®ãã¬ã¼ããªããããã¾ããããããé©åã«ç®¡çãããã¨ãéè¦ã§ãã
ãªãã¸ã§ã³ç®¡çã¯ãç£æ»ã¨ã³ã³ãã©ã¤ã¢ã³ã¹ãé害復æ§ã¨ãã¼ã«ããã¯ãåæ£ã·ã¹ãã ã§ã®ä¸è²«æ§ç¶æãªã©ãå¤ãã®å®è·µçãªå¿ç¨ãå¯è½ã§ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®è¨è¨ã¯ããã¼ã¿ã¢ãã«ããã£ãã·ã¥æ¦ç¥ãã¤ãã³ãã½ã¼ã·ã³ã°ãããã¯ã¢ããã¨ç½å®³å¾©æ§ãªã©ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã«å¤§ããªå½±é¿ãä¸ãã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããæè»ã§ä¿¡é ¼æ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ãå¤æ´å±¥æ´ã®è¿½è·¡ãéè¦ãªç°å¢ããè¤éãªåæ£ã·ã¹ãã ã§ã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ã®é©åãªå®è£ ã極ãã¦éè¦ã§ãã
ãããããªã½ã¼ã¹ãªãã¸ã§ã³ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãã¹ãã¬ã¼ã¸ä½¿ç¨éã®å¢å ãããã©ã¼ãã³ã¹ã¸ã®å½±é¿ãã·ã¹ãã ã®è¤éæ§ã®å¢å ãªã©ã®è¦³ç¹ãããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããªã½ã¼ã¹ãªãã¸ã§ã³ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«åã ã®ãªã½ã¼ã¹ã®å¤æ´å±¥æ´ã管çããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¸è²«æ§ãä¿¡é ¼æ§ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãªã½ã¼ã¹ãªãã¸ã§ã³ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®å復åãé«ãããã¼ã¿ã®æ´åæ§ãä¿è·ããå¤æ´ç®¡çã容æã«ããå¯è½æ§ãããã¾ããç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ããªç°å¢ã§ã¯ããã®æ©è½ã®éè¦æ§ãããé¡èã«ãªãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§æè»æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
ãªã½ã¼ã¹ãªãã¸ã§ã³ç®¡çã¯ãåãªãæè¡çæ©è½ãè¶ ãã¦ãã·ã¹ãã å ¨ä½ã®å質ã¨ä¿¡é ¼æ§ãåä¸ãããéè¦ãªè¦ç´ ã¨ãªãã¾ããé©åã«å®è£ ããããªãã¸ã§ã³ç®¡çã·ã¹ãã ã¯ãå¤æ´ã®è¿½è·¡ãåé¡ã®è¨ºæãããã¦è¿ éãªå¾©æ§ãå¯è½ã«ããçµæã¨ãã¦ã·ã¹ãã ã®éç¨æ§ã¨ä¿¡é ¼æ§ã大ããåä¸ããã¾ããããã«ããã®æ©è½ã¯ãã³ã³ãã©ã¤ã¢ã³ã¹è¦ä»¶ã®éµå®ããã¼ã¿ã¬ããã³ã¹ã®å¼·åãããã¦é·æçãªã·ã¹ãã é²åã®ç®¡çã«ãè²¢ç®ãã¾ãã
APIè¨è¨è ã¨ã·ã¹ãã ã¢ã¼ããã¯ãã¯ããªã½ã¼ã¹ãªãã¸ã§ã³ç®¡çã®éè¦æ§ãèªèããé©åã«å®è£ ãããã¨ã§ãããå ç¢ã§å¹ççãããã¦å°æ¥ã®å¤åã«é©å¿å¯è½ãªã·ã¹ãã ãæ§ç¯ãããã¨ãã§ãã¾ããããã¯ãæ¥éã«å¤åãã常ã«æ°ãã課é¡ãçã¾ããç¾ä»£ã®ã½ããã¦ã§ã¢éçºç°å¢ã«ããã¦ãç¹ã«éè¦ãªä¾¡å¤ã¨ãªãã¾ãã
29 Request retrial
"API Design Patterns" ã®ç¬¬29ç« ãRequest retrialãã¯ãAPI ãªã¯ã¨ã¹ãã®å試è¡ã«é¢ããéè¦ãªæ¦å¿µã¨å®è£ æ¹æ³ã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ã§ã¯ã失æããAPIãªã¯ã¨ã¹ãã®ãã¡ãã©ããå®å ¨ã«å試è¡ã§ãããããªãã©ã¤ã®ã¿ã¤ãã³ã°ã«é¢ããé«åº¦ãªææ°é¢æ°çããã¯ãªãæ¦ç¥ããéªå´©ç¾è±¡ããåé¿ããæ¹æ³ãããã¦APIãã¯ã©ã¤ã¢ã³ãã«ãªãã©ã¤ã®ã¿ã¤ãã³ã°ãæ示ããæ¹æ³ã«ã¤ãã¦èª¬æãã¦ãã¾ãã
ãªã¯ã¨ã¹ãå試è¡ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãWeb APIã«ããã¦ãªã¯ã¨ã¹ãã®å¤±æã¯é¿ããããªãç¾å®ã§ãããã¨ãææãããã¨ããè°è«ãå§ãã¦ãã¾ãã失æã®åå ã«ã¯ãã¯ã©ã¤ã¢ã³ãå´ã®ã¨ã©ã¼ããAPIãµã¼ãã¼å´ã®ä¸æçãªåé¡ãªã©ãæ§ã ãªãã®ãããã¾ããç¹ã«å¾è ã®å ´åãåããªã¯ã¨ã¹ããå¾ã§å試è¡ãããã¨ã§åé¡ã解決ããå¯è½æ§ãããã¾ãã
ãã®æ¦å¿µã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããåæ£ã·ã¹ãã ã§ã¯ããããã¯ã¼ã¯ã®ä¸å®å®æ§ããµã¼ãã¹ã®ä¸æçãªé害ãé »ç¹ã«çºçããå¯è½æ§ããããããé©åãªå試è¡ã¡ã«ããºã ã¯ãã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ã¨å復åãå¤§å¹ ã«åä¸ãããå¯è½æ§ãããã¾ãã
èè ã¯ãå試è¡å¯è½ãªãªã¯ã¨ã¹ããèå¥ããé©åãªã¿ã¤ãã³ã°ã§å試è¡ãè¡ãããã®2ã¤ã®ä¸»è¦ãªã¢ããã¼ããææ¡ãã¦ãã¾ãã
- ã¯ã©ã¤ã¢ã³ãå´ã®å試è¡ã¿ã¤ãã³ã°ï¼ææ°é¢æ°çããã¯ãªãï¼
- ãµã¼ãã¼æå®ã®å試è¡ã¿ã¤ãã³ã°
ãããã®ã¢ããã¼ãã¯ãã·ã¹ãã ã®å¹çæ§ãæ大åãã¤ã¤ãä¸è¦ãªå試è¡ãæå°éã«æããã¨ããç®æ¨ãéæããããã«è¨è¨ããã¦ãã¾ãã
ã¯ã©ã¤ã¢ã³ãå´ã®å試è¡ã¿ã¤ãã³ã°
èè ã¯ãã¯ã©ã¤ã¢ã³ãå´ã®å試è¡æ¦ç¥ã¨ãã¦ãææ°é¢æ°çããã¯ãªãã¢ã«ã´ãªãºã ãæ¨å¥¨ãã¦ãã¾ãããã®ã¢ã«ã´ãªãºã ã¯ãå試è¡ã®ééãå¾ã ã«å¢ããã¦ãããã¨ã§ãã·ã¹ãã ã«é度ã®è² è·ãããããã¨ãªããå試è¡ã®æå確çãé«ãã¾ãã
ææ°é¢æ°çããã¯ãªãã®åºæ¬çãªå®è£ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
func retryWithExponentialBackoff(operation func() error, maxRetries int) error { var err error for attempt := 0; attempt < maxRetries; attempt++ { err = operation() if err == nil { return nil } delay := time.Duration(math.Pow(2, float64(attempt))) * time.Second time.Sleep(delay) } return err }
ããããèè ã¯ãã®åºæ¬çãªå®è£ ã«ããã¤ãã®éè¦ãªæ¹è¯ãå ãããã¨ãææ¡ãã¦ãã¾ãã
- æ大é 延æéã®è¨å®: å試è¡ã®ééãç¡éã«é·ããªããã¨ãé²ãããã
- æ大å試è¡åæ°ã®è¨å®: ç¡éã«ã¼ããé²ãããã
- ã¸ãã¿ã¼ï¼ã©ã³ãã ãªé 延ï¼ã®è¿½å : ãéªå´©ç¾è±¡ããé²ãããã
ãããã®æ¹è¯ãå ãããããæ´ç·´ãããå®è£ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
func retryWithExponentialBackoff(operation func() error, maxRetries int, maxDelay time.Duration) error { var err error for attempt := 0; attempt < maxRetries; attempt++ { err = operation() if err == nil { return nil } delay := time.Duration(math.Pow(2, float64(attempt))) * time.Second if delay > maxDelay { delay = maxDelay } jitter := time.Duration(rand.Float64() * float64(time.Second)) time.Sleep(delay + jitter) } return err }
ãã®å®è£ ã¯ãã·ã¹ãã ã®å復åãé«ãã¤ã¤ãä¸å¿ è¦ãªè² è·ãé¿ãããã©ã³ã¹ã®åããã¢ããã¼ããæä¾ãã¾ãã
ãµã¼ãã¼æå®ã®å試è¡ã¿ã¤ãã³ã°
èè ã¯ãAPIãµã¼ãã¼ãå試è¡ã®ã¿ã¤ãã³ã°ãæ示çã«æå®ã§ããå ´åããããã¨ãææãã¦ãã¾ããããã¯ä¸»ã«ããµã¼ãã¼ãç¹å®ã®æ å ±ï¼ä¾ï¼ã¬ã¼ãå¶éã®ãªã»ããã¿ã¤ãã³ã°ï¼ãæã£ã¦ããå ´åã«æç¨ã§ãã
ãã®ç®çã®ããã«ãèè ã¯HTTPã®"Retry-After"ãããã¼ã®ä½¿ç¨ãæ¨å¥¨ãã¦ãã¾ãããã®ãããã¼ã使ç¨ãããã¨ã§ããµã¼ãã¼ã¯æ£ç¢ºãªå試è¡ã¿ã¤ãã³ã°ãã¯ã©ã¤ã¢ã³ãã«ä¼ãããã¨ãã§ãã¾ãã
func handleRateLimitedRequest(w http.ResponseWriter, r *http.Request) { if isRateLimited(r) { retryAfter := calculateRetryAfter() w.Header().Set("Retry-After", strconv.Itoa(int(retryAfter.Seconds()))) w.WriteHeader(http.StatusTooManyRequests) return } // é常ã®å¦çãç¶è¡ }
ã¯ã©ã¤ã¢ã³ãå´ã§ã¯ããã®ãããã¼ãæ¤åºããæå®ãããæéã ãå¾ æ©ãã¦ãããªã¯ã¨ã¹ããå試è¡ãã¾ãã
func sendRequestWithRetry(client *http.Client, req *http.Request) (*http.Response, error) { resp, err := client.Do(req) if err != nil { return nil, err } if resp.StatusCode == http.StatusTooManyRequests { retryAfter := resp.Header.Get("Retry-After") if retryAfter != "" { seconds, _ := strconv.Atoi(retryAfter) time.Sleep(time.Duration(seconds) * time.Second) return sendRequestWithRetry(client, req) } } return resp, nil }
ãã®ææ³ã¯ããµã¼ãã¼ã®ç¶æ ãå¶ç´ã«åºã¥ãã¦ãããæ£ç¢ºã§å¹ççãªå試è¡æ¦ç¥ãå®ç¾ãã¾ãã
å試è¡å¯è½ãªãªã¯ã¨ã¹ãã®å¤æ
èè ã¯ãå ¨ã¦ã®ã¨ã©ã¼ãå試è¡å¯è½ãªããã§ã¯ãªãã¨ããéè¦ãªç¹ã強調ãã¦ãã¾ããå試è¡å¯è½ãªã¨ã©ã¼ã¨ããã§ãªãã¨ã©ã¼ãåºå¥ãããã¨ã¯ãå¹æçãªå試è¡æ¦ç¥ã®éµã¨ãªãã¾ãã
ä¸è¬çã«ã以ä¸ã®ãããªã¬ã¤ãã©ã¤ã³ãæ示ããã¦ãã¾ãã
å試è¡å¯è½: 408 (Request Timeout), 429 (Too Many Requests), 503 (Service Unavailable) ãªã©ããããã¯ä¸æçãªåé¡ã示åãã¦ãã¾ãã
å試è¡ä¸å¯è½: 400 (Bad Request), 403 (Forbidden), 404 (Not Found) ãªã©ããããã¯æ°¸ç¶çãªåé¡ã示åãã¦ãã¾ãã
æ¡ä»¶ä»ãå試è¡å¯è½: 500 (Internal Server Error), 502 (Bad Gateway), 504 (Gateway Timeout) ãªã©ããããã¯ç¶æ³ã«å¿ãã¦å試è¡å¯è½ãã©ãããå¤ããã¾ãã
ãã®åºå¥ã¯ãã·ã¹ãã ã®å¹çæ§ã¨ä¿¡é ¼æ§ãç¶æããä¸ã§éè¦ã§ããä¸é©åãªå試è¡ã¯ãã·ã¹ãã ãªã½ã¼ã¹ã®ç¡é§é£ãããæå³ããªãå¯ä½ç¨ãå¼ãèµ·ããå¯è½æ§ãããã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã¨éç¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ä»¥ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã·ã¹ãã ã®å復å: é©åãªå試è¡ã¡ã«ããºã ã¯ãä¸æçãªé害ããèªåçã«å復ããã·ã¹ãã ã®è½åãå¤§å¹ ã«åä¸ããã¾ããããã¯ç¹ã«ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã®ãããªåæ£ã·ã¹ãã ã«ããã¦éè¦ã§ãã
å¹ççãªãªã½ã¼ã¹å©ç¨: ææ°é¢æ°çããã¯ãªãããµã¼ãã¼æå®ã®å試è¡ã¿ã¤ãã³ã°ã使ç¨ãããã¨ã§ãã·ã¹ãã ãªã½ã¼ã¹ãå¹ççã«å©ç¨ãã¤ã¤ãå試è¡ã®æå確çãæ大åã§ãã¾ãã
ã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹: ã¨ã³ãã¦ã¼ã¶ã¼ã®è¦ç¹ããã¯ãé©åãªå試è¡ã¡ã«ããºã ã¯ãä¸æçãªåé¡ãèªåçã«è§£æ±ºããã·ã¼ã ã¬ã¹ãªã¨ã¯ã¹ããªã¨ã³ã¹ãæä¾ãã¾ãã
éç¨ã®ç°¡ç´ å: é©åã«è¨è¨ãããå試è¡ã¡ã«ããºã ã¯ãæåä»å ¥ã®å¿ è¦æ§ãæ¸ãããéç¨ã¿ã¹ã¯ãç°¡ç´ åãã¾ãã
ã¢ãã¿ãªã³ã°ã¨å¯è¦³æ¸¬æ§: å試è¡ã®é »åº¦ãæåçãç£è¦ãããã¨ã§ãã·ã¹ãã ã®å¥å ¨æ§ãæ½å¨çãªåé¡ãææ¡ããããã®è²´éãªæ´å¯ãå¾ããã¾ãã
çµè«
第29ç« ãRequest retrialãã¯ãAPIã«ããããªã¯ã¨ã¹ãå試è¡ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãã·ã¹ãã ã®ä¿¡é ¼æ§ãå¹çæ§ãããã¦å ¨ä½çãªéç¨æ§ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
å ¨ã¦ã®ã¨ã©ã¼ãå試è¡å¯è½ãªããã§ã¯ããã¾ãããã¨ã©ã¼ã®æ§è³ªãæ éã«è©ä¾¡ããé©åã«å試è¡å¯è½ãªãã®ãèå¥ãããã¨ãéè¦ã§ãã
ææ°é¢æ°çããã¯ãªãã¯ãå¹æçãªå試è¡æ¦ç¥ã®åºç¤ã¨ãªãã¾ãããã ããæ大é 延æéãæ大å試è¡åæ°ãã¸ãã¿ã¼ãªã©ã®æ¹è¯ãå ãããã¨ã§ãããå ç¢ãªå®è£ ãå¯è½ã«ãªãã¾ãã
ãµã¼ãã¼æå®ã®å試è¡ã¿ã¤ãã³ã°ï¼Retry-Afterãããã¼ï¼ã¯ãç¹å®ã®ã·ããªãªã«ããã¦é常ã«æå¹ã§ããããã«ãããããæ£ç¢ºã§å¹ççãªå試è¡ãå¯è½ã«ãªãã¾ãã
å試è¡ã¡ã«ããºã ã¯ãã·ã¹ãã ã®å復åãå¹çæ§ãã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹ãéç¨æ§ãåä¸ãããéè¦ãªãã¼ã«ã§ãã
å試è¡ã®å®è£ ã«ã¯ãã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨éç¨ãã©ã¯ãã£ã¹ã¨ã®æ´åæ§ãå¿ è¦ã§ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããä¿¡é ¼æ§ãé«ããå¹ççãªAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ãåæ£ã·ã¹ãã ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã§ã¯ãé©åãªå試è¡ã¡ã«ããºã ã®å®è£ ã極ãã¦éè¦ã§ãã
æå¾ã«ããªã¯ã¨ã¹ãå試è¡ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«ã¨ã©ã¼ãã³ããªã³ã°ãæ¹åããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãã¹ã±ã¼ã©ããªãã£ãããã¦éç¨å¹çã®åä¸ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãªã¯ã¨ã¹ãå試è¡ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®å復åãé«ããä¸æçãªé害ã®å½±é¿ãæå°éã«æããå ¨ä½çãªã¦ã¼ã¶ã¼ã¨ã¯ã¹ããªã¨ã³ã¹ãåä¸ãããå¯è½æ§ãããã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
30 Request authentication
ãAPI Design Patternsãã®ç¬¬30ç« ãRequest authenticationãã¯ãAPIã«ããããªã¯ã¨ã¹ãèªè¨¼ã®éè¦æ§ããã®å®è£ æ¹æ³ãããã¦ãã¬ã¼ããªãã«ã¤ãã¦è©³ç´°ã«è«ãã¦ãã¾ãããã®ç« ãéãã¦ãèè ã¯ãªã¯ã¨ã¹ãèªè¨¼ãåãªãã»ãã¥ãªãã£æ©è½ã®è¿½å ã§ã¯ãªããAPIã®ä¿¡é ¼æ§ãå®å ¨æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã«ã©ã®ããã«å½±é¿ãä¸ããããæ確ã«ç¤ºãã¦ãã¾ãã
ãªã¯ã¨ã¹ãèªè¨¼ã®å¿ è¦æ§ã¨æ¦è¦
èè ã¯ãAPIãªã¯ã¨ã¹ãã®èªè¨¼ã«é¢ããåºæ¬çãªçåããè°è«ãå§ãã¦ãã¾ãããä¸ããããã¤ã³ãã¦ã³ãAPIãªã¯ã¨ã¹ãããå®éã«èªè¨¼ãããã¦ã¼ã¶ã¼ããã®ãã®ã§ãããã¨ãã©ã®ããã«å¤æã§ãããï¼ããã®åãã«çããããã«ãèè ã¯3ã¤ã®éè¦ãªè¦ä»¶ãæ示ãã¦ãã¾ãã
- ãªãªã¸ã³ï¼Originï¼: ãªã¯ã¨ã¹ãã主張ããéä¿¡å ããæ¬å½ã«æ¥ããã®ãã©ããã確èªããè½åã
- å®å ¨æ§ï¼Integrityï¼: ãªã¯ã¨ã¹ãã®å 容ãéä¿¡å¾ã«æ¹ããããã¦ããªããã¨ã確èªããè½åã
- å¦èªé²æ¢ï¼Non-repudiationï¼: éä¿¡è ãå¾ãããªã¯ã¨ã¹ãã®éä¿¡ãå¦å®ã§ããªãããã«ããè½åã
ãããã®è¦ä»¶ã¯ãç¾ä»£ã®ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ãã¯ã©ã¦ããã¤ãã£ãç°å¢ã«ããã¦ç¹ã«éè¦ã§ããåæ£ã·ã¹ãã ã§ã¯ããµã¼ãã¹éã®éä¿¡ã®ä¿¡é ¼æ§ã¨å®å ¨æ§ã確ä¿ãããã¨ãä¸å¯æ¬ ã§ããããããã®è¦ä»¶ãæºãããã¨ã§ãã·ã¹ãã å ¨ä½ã®ã»ãã¥ãªãã£ã¨ä¿¡é ¼æ§ãå¤§å¹ ã«åä¸ãã¾ãã
èè ã¯ããããã®è¦ä»¶ãæºããã½ãªã¥ã¼ã·ã§ã³ã¨ãã¦ããã¸ã¿ã«ç½²åã®ä½¿ç¨ãææ¡ãã¦ãã¾ãããã¸ã¿ã«ç½²åã¯ãå ¬ééµæå·æ¹å¼ãå©ç¨ããé対称ãªèªè¨¼ã¡ã«ããºã ã§ã以ä¸ã®ç¹æ§ãæã¡ã¾ãã
- ç½²åã®çæã«ä½¿ç¨ããç§å¯éµã¨ãæ¤è¨¼ã«ä½¿ç¨ããå ¬ééµãç°ãªãã
- ç½²åã¯ã¡ãã»ã¼ã¸ã®å 容ã«ä¾åãããããã¡ãã»ã¼ã¸ã®å®å ¨æ§ãä¿è¨¼ã§ããã
- ç§å¯éµã®ææè ã®ã¿ãæå¹ãªç½²åãçæã§ãããããå¦èªé²æ¢ãå¯è½ã
Request authenticationã¯ããããã«å ¥ãçµãã åéã§ãããã®ã§ã»ãã¥ã¢ã»ãã¤ã»ãã¶ã¤ã³ãªã©ããªã¹ã¹ã¡ã§ãã
ãã¸ã¿ã«ç½²åã®å®è£
èè ã¯ããã¸ã¿ã«ç½²åãç¨ãããªã¯ã¨ã¹ãèªè¨¼ã®å®è£ ã«é¢ãã¦è©³ç´°ãªã¬ã¤ãã³ã¹ãæä¾ãã¦ãã¾ãã主ãªã¹ãããã¯ä»¥ä¸ã®éãã§ãã
- ã¯ã¬ãã³ã·ã£ã«ã®çæ: ã¦ã¼ã¶ã¼ã¯å ¬ééµã¨ç§å¯éµã®ãã¢ãçæãã¾ãã
- ç»é²ã¨ã¯ã¬ãã³ã·ã£ã«äº¤æ: ã¦ã¼ã¶ã¼ã¯å ¬ééµãAPIãµã¼ãã¹ã«ç»é²ããä¸æã®èå¥åãåãåãã¾ãã
- ãªã¯ã¨ã¹ãã®ç½²å: ã¦ã¼ã¶ã¼ã¯ç§å¯éµã使ç¨ãã¦ãªã¯ã¨ã¹ãã«ç½²åãã¾ãã
- ç½²åã®æ¤è¨¼: APIãµã¼ãã¼ã¯å ¬ééµã使ç¨ãã¦ç½²åãæ¤è¨¼ãããªã¯ã¨ã¹ããèªè¨¼ãã¾ãã
ãããã®ã¹ããããå®è£ ããããã®Goã®ã³ã¼ãä¾ã以ä¸ã«ç¤ºãã¾ãã
import ( "crypto" "crypto/rand" "crypto/rsa" "crypto/sha256" "encoding/base64" ) // ã¯ã¬ãã³ã·ã£ã«ã®çæ func generateCredentials() (*rsa.PrivateKey, error) { return rsa.GenerateKey(rand.Reader, 2048) } // ãªã¯ã¨ã¹ãã®ç½²å func signRequest(privateKey *rsa.PrivateKey, request []byte) ([]byte, error) { hashed := sha256.Sum256(request) return rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hashed[:]) } // ç½²åã®æ¤è¨¼ func verifySignature(publicKey *rsa.PublicKey, request []byte, signature []byte) error { hashed := sha256.Sum256(request) return rsa.VerifyPKCS1v15(publicKey, crypto.SHA256, hashed[:], signature) }
ãã®å®è£ ä¾ã§ã¯ãRSAæå·åã使ç¨ãã¦ã¯ã¬ãã³ã·ã£ã«ã®çæããªã¯ã¨ã¹ãã®ç½²åãç½²åã®æ¤è¨¼ãè¡ã£ã¦ãã¾ããå®éã®éç¨ç°å¢ã§ã¯ããããã®åºæ¬çãªé¢æ°ãããå ç¢ãªã¨ã©ã¼ãã³ããªã³ã°ã¨ãã®ã³ã°ã¡ã«ããºã ã§å ãå¿ è¦ãããã¾ãã
ãªã¯ã¨ã¹ãã®ãã£ã³ã¬ã¼ããªã³ãã£ã³ã°
èè ã¯ããªã¯ã¨ã¹ãå ¨ä½ãç½²åããã®ã§ã¯ãªãããªã¯ã¨ã¹ãã®ããã£ã³ã¬ã¼ããªã³ãããçæãã¦ç½²åãããã¨ãææ¡ãã¦ãã¾ãããã®ãã£ã³ã¬ã¼ããªã³ãã«ã¯ä»¥ä¸ã®è¦ç´ ãå«ã¾ãã¾ãã
- HTTPã¡ã½ãã
- ãªã¯ã¨ã¹ãã®ãã¹
- ãã¹ã
- ãªã¯ã¨ã¹ãããã£ã®ãã¤ã¸ã§ã¹ã
- æ¥ä»
ãããã®è¦ç´ ãçµã¿åããããã¨ã§ããªã¯ã¨ã¹ãã®æ¬è³ªçãªé¨åãæãã¤ã¤ãç½²å対象ã®ãã¼ã¿ãµã¤ãºãæãããã¨ãã§ãã¾ãã以ä¸ã«ããã£ã³ã¬ã¼ããªã³ãã®çæä¾ã示ãã¾ãã
import ( "crypto/sha256" "fmt" "net/http" "strings" "time" ) func generateFingerprint(r *http.Request) string { bodyDigest := sha256.Sum256([]byte(r.Body)) elements := []string{ fmt.Sprintf("(request-target): %s %s", strings.ToLower(r.Method), r.URL.Path), fmt.Sprintf("host: %s", r.Host), fmt.Sprintf("date: %s", time.Now().UTC().Format(http.TimeFormat)), fmt.Sprintf("digest: SHA-256=%s", base64.StdEncoding.EncodeToString(bodyDigest[:])), } return strings.Join(elements, "\n") }
ãã®ã¢ããã¼ãã«ããããªã¯ã¨ã¹ãã®éè¦ãªé¨åãå¹ççã«ç½²åã§ããããã«ãªãã¾ãã
å®è·µçãªå¿ç¨ã¨èå¯
ãã®ç« ã®å 容ã¯ãå®éã®APIè¨è¨ã¨éç¨ã«ããã¦é常ã«éè¦ã§ããç¹ã«ä»¥ä¸ã®ç¹ãéè¦ã«ãªãã¾ãã
ã»ãã¥ãªãã£ã¨ä¿¡é ¼æ§: ãã¸ã¿ã«ç½²åã使ç¨ãããªã¯ã¨ã¹ãèªè¨¼ã¯ãAPIã®å®å ¨æ§ã¨ä¿¡é ¼æ§ãå¤§å¹ ã«åä¸ããã¾ããããã¯ç¹ã«ãéèåå¼ãå»çæ å ±ãªã©ãæ©å¯æ§ã®é«ããã¼ã¿ãæ±ãã·ã¹ãã ã§éè¦ã§ãã
ãã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£ã§ã®å¿ç¨: ãµã¼ãã¹ééä¿¡ã®èªè¨¼ã«é©ç¨ãããã¨ã§ããã¤ã¯ããµã¼ãã¹ã¢ã¼ããã¯ãã£å ¨ä½ã®ã»ãã¥ãªãã£ãå¼·åã§ãã¾ãã
ã¹ã±ã¼ã©ããªãã£ã®èæ ®: ãã¸ã¿ã«ç½²åã®æ¤è¨¼ã¯è¨ç®ã³ã¹ããé«ãããã大è¦æ¨¡ãªã·ã¹ãã ã§ã¯é©åãªãã£ãã·ã³ã°æ¦ç¥ããã¼ããã©ã³ã·ã³ã°ãå¿ è¦ã«ãªãå¯è½æ§ãããã¾ãã
éç¨ä¸ã®èª²é¡: ç§å¯éµã®å®å ¨ãªç®¡çããå ¬ééµã®é å¸ã»æ´æ°ã¡ã«ããºã ã®æ§ç¯ãå¿ è¦ã«ãªãã¾ãããããã¯ãé©åãªã·ã¼ã¯ã¬ãã管çã·ã¹ãã ãPKIã¤ã³ãã©ã¹ãã©ã¯ãã£ã®å°å ¥ãæ¤è¨ããè¯ãæ©ä¼ã¨ãªãã¾ãã
ç£è¦ã¨ãã®ã³ã°: ç½²åã®æ¤è¨¼å¤±æãä¸æ£ãªãªã¯ã¨ã¹ãã®è©¦è¡ãé©åã«ç£è¦ã»ãã®ã³ã°ãããã¨ã§ãã·ã¹ãã ã®å®å ¨æ§ãããã«åä¸ããããã¨ãã§ãã¾ãã
çµè«
第30ç« ãRequest authenticationãã¯ãAPIã«ããããªã¯ã¨ã¹ãèªè¨¼ã®éè¦æ§ã¨ããã®é©åãªå®è£ æ¹æ³ãæ確ã«ç¤ºãã¦ãã¾ããèè ã®ææ¡ããè¨è¨ååã¯ãAPIã®ã»ãã¥ãªãã£ãä¿¡é ¼æ§ãããã¦å ¨ä½çãªã·ã¹ãã ã¢ã¼ããã¯ãã£ã大ããåä¸ãããå¯è½æ§ãããã¾ãã
ç¹ã«éè¦ãªç¹ã¯ä»¥ä¸ã®éãã§ãã
ãªã¯ã¨ã¹ãèªè¨¼ã¯ããªãªã¸ã³ãå®å ¨æ§ãå¦èªé²æ¢ã®3ã¤ã®è¦ä»¶ãæºããå¿ è¦ãããã¾ãã
ãã¸ã¿ã«ç½²åã¯ããããã®è¦ä»¶ãæºããå¼·åãªã¡ã«ããºã ãæä¾ãã¾ãã
ãªã¯ã¨ã¹ãã®ãã£ã³ã¬ã¼ããªã³ãã£ã³ã°ã¯ãå¹ççãã¤å¹æçãªç½²åæ¹æ³ã§ãã
ãã®èªè¨¼æ¹å¼ã®å®è£ ã«ã¯ãé©åãªã¯ã¬ãã³ã·ã£ã«ç®¡çã¨éç¨ãã©ã¯ãã£ã¹ãä¸å¯æ¬ ã§ãã
ããã©ã¼ãã³ã¹ã¨ã¹ã±ã¼ã©ããªãã£ã®ãã¬ã¼ããªããæ éã«æ¤è¨ããå¿ è¦ãããã¾ãã
ãããã®ååãé©åã«é©ç¨ãããã¨ã§ãéçºè ã¯ããå®å ¨ã§ä¿¡é ¼æ§ã®é«ãAPIãè¨è¨ãããã¨ãã§ãã¾ããç¹ã«ãé«åº¦ãªã»ãã¥ãªãã£è¦ä»¶ãæã¤ã·ã¹ãã ããè¤éãªåæ£ã¢ã¼ããã¯ãã£ãæ¡ç¨ãã¦ããç°å¢ã§ã¯ããã®èªè¨¼æ¹å¼ã®å®è£ ã極ãã¦éè¦ã«ãªãã¾ãã
ãããããã®èªè¨¼æ¹å¼ã®å°å ¥ã«ã¯æ éãªæ¤è¨ãå¿ è¦ã§ããç¹ã«ãããã©ã¼ãã³ã¹ãéç¨ã®è¤éããéçºè ã®å¦ç¿æ²ç·ã®è¦³ç¹ãããã·ã¹ãã ã®è¦ä»¶ã¨å¶ç´ãååã«ç解ããé©åãªè¨è¨æ±ºå®ãè¡ãå¿ è¦ãããã¾ãã
æå¾ã«ããªã¯ã¨ã¹ãèªè¨¼ã®è¨è¨ã¯ã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨å¯æ¥ã«é¢é£ãã¦ãããã¨ãå¿ãã¦ã¯ããã¾ãããé©åãªè¨è¨ã¯ãåã«APIã®ã»ãã¥ãªãã£ãåä¸ãããã ãã§ãªããã·ã¹ãã å ¨ä½ã®ä¿¡é ¼æ§ãéç¨å¹çãããã¦å°æ¥ã®æ¡å¼µæ§ã«ã大ããè²¢ç®ãã¾ãããããã£ã¦ãAPIè¨è¨è ã¯ãåã ã®ã¨ã³ããã¤ã³ãã®è¨è¨ã ãã§ãªããã·ã¹ãã å ¨ä½ã®ã¢ã¼ããã¯ãã£ã¨ã®æ´åæ§ã常ã«æèããªããè¨è¨ãé²ããå¿ è¦ãããã¾ãã
ãã®ç« ã®å 容ã¯ãç¹ã«å¤§è¦æ¨¡ã§é·æçã«éç¨ãããã·ã¹ãã ã®è¨è¨ã«ããã¦é常ã«éè¦ã§ãããã¸ã¿ã«ç½²åãç¨ãããªã¯ã¨ã¹ãèªè¨¼ã®é©åãªå®è£ ã¯ãã·ã¹ãã ã®ã»ãã¥ãªãã£ãå¤§å¹ ã«åä¸ãããæ½å¨çãªè å¨ãæ»æããä¿è·ããå¼·åãªæ段ã¨ãªãã¾ããAPIè¨è¨è ã¨ã·ã¹ãã è¨è¨è ã¯ããããã®ååãæ·±ãç解ããå®è·µãããã¨ã§ãããå ç¢ã§ä¿¡é ¼æ§ã®é«ãã·ã¹ãã ãæ§ç¯ãããã¨ãã§ããã§ãããã
ãããã«
ãAPI Design Patternsããéãã¦ãAPIãã¶ã¤ã³ã®æ¬è³ªã¨æ®éçãªè¨è¨ååãå¦ã³ã¾ããããããã®ååã¯ãæè¡ã®å¤åã«é¢ãããé·æçã«ä¾¡å¤ãããã¾ãã
æ¬æ¸ã¯ãAPIãã·ã¹ãã éã®ã³ãã¥ãã±ã¼ã·ã§ã³ã®éè¦ãªåªä»è ã¨ãã¦æããè¦ç¹ãæä¾ãã¾ããããã®ç¥èã¯ãAPIè¨è¨ã ãã§ãªããã½ããã¦ã§ã¢éçºå ¨è¬ã«é©ç¨å¯è½ã§ãã
次ã®èª²é¡ã¯ãå¦ãã æ¦å¿µãå®è·µã§é©ç¨ãããã¨ã§ããæè¡ã¯é²åãç¶ãã¾ãããæ¬æ¸ã®æ´å¯ã¯å¤åã®ä¸ã§ãæéã¨ãªãã¾ãã
ãããããå¦ã³ç¶ããããè¯ãã·ã¹ãã ã¨ã½ãªã¥ã¼ã·ã§ã³ãéçºãã¦ããã¾ãããã
ãããããDesign Patternsã¯è¨è¨ã§ã¯ãªãã§ãããï¼
Design Patternsã¯è¨è¨ãã®ãã®ã§ã¯ãªããã½ããã¦ã§ã¢éçºã®å ±éåé¡ã«å¯¾ããå®åçãªè§£æ±ºçãæä¾ãããã¼ã«ãããã§ããããã¯ãã¸ã§ãã¹ãªã¼ãã§ãããã¿ã¾ããã
è¨è¨ã¯ãå ·ä½çãªåé¡ãè¦ä»¶ã«å¯¾ãã¦é©åãªè§£æ±ºçãèæ¡ãå®è£ ããããã»ã¹ã§ããDesign Patternsãç¥ã£ã¦ããã ãã§ã¯ãåªããè¨è¨ã¯ã§ãã¾ããã
Design Patternsã®ä¾¡å¤ã¯ãå ±éã®èªå½ã¨æ¦å¿µçãã¬ã¼ã ã¯ã¼ã¯ãæä¾ãããã¨ã§ããããã«ãããéçºè éã®ã³ãã¥ãã±ã¼ã·ã§ã³ãåæ»ã«ãªããåé¡ã®æ¬è³ªãããéãææ¡ã§ãã¾ãã
è¯ãè¨è¨è ã«ãªãã«ã¯ãDesign Patternsãç¥ããã¨ãéè¦ã§ããããã以ä¸ã«åé¡ãæ·±ãç解ããåµé çã«æèããæ§ã ãªé¸æè¢ãæ¯è¼æ¤è¨ããè½åãéè¦ã§ãã
çµè«ã¨ãã¦ãDesign Patternsã¯è¨è¨ãæ¯æ´ãããã¼ã«ã§ãããè¨è¨ãã®ãã®ã§ã¯ããã¾ãããåªããè¨è¨ãçã¿åºãã®ã¯ããã¿ã¼ã³ãé©åã«ç解ããç¶æ³ã«å¿ãã¦é©ç¨ã§ããéçºè ã®åµé æ§ã¨å¤æåã§ãã
ã¿ãªãããæå¾ã¾ã§èªãã§ããã¦æ¬å½ã«ãããã¨ããããã¾ããéä¸ã§æ«æããã«ä»ãåã£ã¦ããããã¨ã«æè¬ãã¦ãã¾ãã
èªè
ã«ãªã£ã¦ããããæ´ã«æè¬ã§ããXã¾ã§ãã©ãã¯ã¼ãã¦ããããæ³£ãã¦ããããããã¾ããã
ããªãããã£ãã¾ã§èªãã§ããæè¡çã«å½¹ç«ã¤è¨äºã¯ã10å¹´å¾ã使ããã§ããããï¼ã»ã¨ãã©ã®å ´åã§ãããã