ã¯ããã«
ãã®èšäºã§ã¯ãGitHub CLIãcurl
ããŸã㯠JavaScript ã§ GitHub REST API ãäœ¿ãæ¹æ³ã«ã€ããŠèª¬æããŸãã ã¯ã€ãã¯ã¹ã¿ãŒã ã¬ã€ãã«ã€ããŠã¯ããGitHub REST API ã®ã¯ã€ãã¯ã¹ã¿ãŒãããåç
§ããŠãã ããã
REST API ãžã®èŠæ±ã«ã€ããŠ
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãAPI èŠæ±ãæ§æããèŠçŽ ã«ã€ããŠèª¬æããŸãã
REST API ã«å¯Ÿãããã¹ãŠã®èŠæ±ã«ã¯ãHTTP ã¡ãœãããšãã¹ãå«ãŸããŸãã REST API ãšã³ããã€ã³ãã«ãã£ãŠã¯ãèŠæ±ããããŒãèªèšŒæ å ±ãã¯ãšãª ãã©ã¡ãŒã¿ãŒããŸãã¯æ¬æãã©ã¡ãŒã¿ãŒãæå®ããå¿ èŠããããŸãã
REST API ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ãã§ã¯ããã¹ãŠã®ãšã³ããã€ã³ãã® HTTP ã¡ãœããããã¹ãããã³ãã©ã¡ãŒã¿ãŒã«ã€ããŠèª¬æããŸãã ãŸããåãšã³ããã€ã³ãã®èŠæ±ãšå¿çã®äŸã衚瀺ãããŸãã 詳ããã¯ãREST ã®ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ããã芧ãã ããã
HTTP ã¡ãœãã
ãšã³ããã€ã³ãã® HTTP ã¡ãœããã¯ãç¹å®ã®ãªãœãŒã¹ã«å¯ŸããŠå®è¡ããã¢ã¯ã·ã§ã³ã®çš®é¡ãå®çŸ©ããŸãã äžè¬ç㪠HTTP ã¡ãœããã«ã¯ GET
ãPOST
ãDELETE
ãPATCH
ããããŸãã REST API ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ãã«ã¯ããã¹ãŠã®ãšã³ããã€ã³ãã® HTTP ã¡ãœãããèšèŒãããŠããŸãã
ããšãã°ãããªããžããªã® issue ã®äžèŠ§è¡šç€ºããšã³ããã€ã³ãã® HTTP ã¡ãœãã㯠GET
ã§ãã
GitHub REST API ã§ã¯ãå¯èœãªéããåã¢ã¯ã·ã§ã³ã«é©ãã HTTP ã¡ãœããã䜿ãããšããŸãã
GET
: ãªãœãŒã¹ãååŸããããã«äœ¿çšããŸããPOST
: ãªãœãŒã¹ãäœæããããã«äœ¿çšããŸããPATCH
: ãªãœãŒã¹ã®ããããã£ãæŽæ°ããããã«äœ¿çšãããŸããPUT
: ãªãœãŒã¹ãŸãã¯ãªãœãŒã¹ã®ã³ã¬ã¯ã·ã§ã³ã眮ãæããããã«äœ¿çšããŸããDELETE
: ãªãœãŒã¹ãåé€ããããã«äœ¿çšããŸãã
Path
åãšã³ããã€ã³ãã«ã¯ãã¹ããããŸãã REST API ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ãã«ã¯ããã¹ãŠã®ãšã³ããã€ã³ãã®ãã¹ãèšèŒãããŠããŸãã ããšãã°ã"ãªããžããªã® issue ã®äžèŠ§è¡šç€º" ãšã³ããã€ã³ã㯠/repos/{owner}/{repo}/issues
ãšãªããŸãã
ãã¹ã®äžãã£ã {}
ã¯ãæå®ããå¿
èŠããããã¹ ãã©ã¡ãŒã¿ãŒã瀺ããŸãã ãã¹ ãã©ã¡ãŒã¿ãŒã¯ãšã³ããã€ã³ã ãã¹ã倿ŽããèŠæ±ã«å¿
èŠã§ãã ããšãã°ã"ãªããžããªã® issues ã®äžèŠ§è¡šç€º" ãšã³ããã€ã³ãã®ãã¹ ãã©ã¡ãŒã¿ãŒã¯ {owner}
ãš {repo}
ã«ãªããŸãã API èŠæ±ã§ãã®ãã¹ã䜿çšããã«ã¯ã{repo}
ãåé¡ã®äžèЧãèŠæ±ãããªããžããªã®ååã«çœ®ãæãã{owner}
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããŸãã
ããããŒ
ããããŒã¯ãèŠæ±ãšå¿ èŠãªå¿çã«é¢ããè¿œå æ å ±ãæäŸããŸãã GitHub REST API ãžã®èŠæ±ã§äœ¿çšã§ããããããŒã®äŸã次ã«ç€ºããŸãã ããããŒã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç §ããŠãã ããã
Accept
ã»ãšãã©ã® GitHub REST API ãšã³ããã€ã³ãã§ã¯ãå€ã application/vnd.github+json
ã®ããã㌠Accept
ãæž¡ãå¿
èŠãããããšãæå®ããŠããŸãã Accept
ããããŒã®å€ã¯ã¡ãã£ã¢ã®çš®é¡ã§ãã ã¡ãã£ã¢ã®çš®é¡ã®è©³çްã«ã€ããŠã¯ããã¡ãã£ã¢ã®çš®é¡ããåç
§ããŠãã ããã
X-GitHub-Api-Version
ãã®ããããŒã䜿çšããŠãèŠæ±ã«äœ¿çšãã REST API ã®ããŒãžã§ã³ãæå®ããå¿ èŠããããŸãã 詳ããã¯ããAPI ã®ããŒãžã§ã³ããã芧ãã ããã
User-Agent
ãã¹ãŠã® API èŠæ±ã«æå¹ãª User-Agent
ããããŒãå«ããå¿
èŠããããŸãã User-Agent
ããããŒã¯ãèŠæ±ãè¡ã£ãŠãããŠãŒã¶ãŒãŸãã¯ã¢ããªã±ãŒã·ã§ã³ãèå¥ããŸãã
æ¢å®ã§ã¯ãGitHub CLI ã¯æå¹ãª User-Agent
ããããŒãéä¿¡ããŸãã ãã ããGitHub ã§ã¯ãUser-Agent
ããããŒå€ã« GitHub ãŠãŒã¶ãŒåãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ååã䜿ãããšããå§ãããŸãã ããã«ãããåé¡ãçºçããå Žåã« GitHub ããé£çµ¡ã§ããŸãã
æ¢å®ã§ãcurl
ã¯æå¹ãª User-Agent
ããããŒãéä¿¡ããŸãã ãã ããGitHub ã§ã¯ãUser-Agent
ããããŒå€ã« GitHub ãŠãŒã¶ãŒåãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ååã䜿ãããšããå§ãããŸãã ããã«ãããåé¡ãçºçããå Žåã« GitHub ããé£çµ¡ã§ããŸãã
Octokit.js SDK ã䜿çšãããšãSDK ããæå¹ãª User-Agent
ããããŒãéä¿¡ãããŸãã ãã ããGitHub ã§ã¯ãUser-Agent
ããããŒå€ã« GitHub ãŠãŒã¶ãŒåãŸãã¯ã¢ããªã±ãŒã·ã§ã³ã®ååã䜿ãããšããå§ãããŸãã ããã«ãããåé¡ãçºçããå Žåã« GitHub ããé£çµ¡ã§ããŸãã
次ã®äŸã¯ãAwesome-Octocat-App
ãšããååã®ã¢ããªã®äŸ User-Agent
ã§ãã
User-Agent: Awesome-Octocat-App
User-Agent
ããããŒã®ãªãèŠæ±ã¯æåŠãããŸãã ç¡å¹ãª User-Agent
ããããŒãæå®ãããšã403 Forbidden
å¿çãåãåããŸãã
ã¡ãã£ã¢ã®çš®é¡
1 ã€ä»¥äžã®ã¡ãã£ã¢ã®çš®é¡ãæå®ããã«ã¯ãããããèŠæ±ã®Accept
ããããŒã« 远å ããŸãã Accept
ããããŒã®è©³çްã«ã€ããŠã¯ããAccept
ããåç
§ããŠãã ããã
ã¡ãã£ã¢ã®çš®é¡ã¯ãAPI ãã䜿çšããããŒã¿ã®åœ¢åŒãæå®ããŸãã ã¡ãã£ã¢ã®çš®é¡ã¯ãªãœãŒã¹ã«åºæã§ãããããåå¥ã«å€æŽããããä»ã®ãªãœãŒã¹ã§ã¯ãµããŒããããŠããªã圢åŒããµããŒããããã§ããŸãã å GitHub REST API ãšã³ããã€ã³ãã®ããã¥ã¡ã³ãã§ã¯ããµããŒããããŠããã¡ãã£ã¢ã®çš®é¡ã«ã€ããŠèª¬æããŸãã 詳现ã«ã€ããŠã¯ããGitHub REST API ã«é¢ããããã¥ã¡ã³ãããåç §ããŠãã ããã
GitHub REST API ã§ãµããŒããããæãäžè¬çãªã¡ãã£ã¢ã®çš®é¡ã¯ application/vnd.github+json
ãš application/json
ã§ãã
äžéšã®ãšã³ããã€ã³ãã§äœ¿çšã§ããã«ã¹ã¿ã ã¡ãã£ã¢ã®çš®é¡ããããŸãã ããšãã°ãã³ããããš pull request ã管çãã REST API ã§ã¯ãdiff
ãpatch
ãsha
ãšããã¡ãã£ã¢ã®çš®é¡ããµããŒããããŸãã full
ãraw
ãtext
ãhtml
ãšããã¡ãã£ã¢ã®çš®é¡ã¯ãä»ã®ãšã³ããã€ã³ãã§äœ¿çšãããŸãã
GitHub ã®ãã¹ãŠã®ã«ã¹ã¿ã ã¡ãã£ã¢ã®çš®é¡ã¯æ¬¡ã®ããã«ãªããŸã: application/vnd.github.PARAM+json
ãPARAM
ã¯ã¡ãã£ã¢ã®çš®é¡ã®ååã§ãã ããšãã°ãraw
ã¡ãã£ã¢ã®çš®é¡ãæå®ããã«ã¯ãapplication/vnd.github.raw+json
ã䜿çšããŸãã
ã¡ãã£ã¢ã®çš®é¡ã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç §ããŠãã ããã
èªèšŒ
å€ãã®ãšã³ããã€ã³ãæäœã§ã¯ãèªèšŒãå¿ èŠã§ããããèªèšŒãããŠããå Žåã¯è¿œå æ å ±ãè¿ãããŸãã ããã«ãèªèšŒãããŠããå Žå㯠1 æéãããã®èŠæ±ãå¢ããããšãã§ããŸãã
èŠæ±ãèªèšŒããã«ã¯ãå¿
èŠãªã¹ã³ãŒããŸãã¯ã¢ã¯ã»ã¹èš±å¯ãæã€èªèšŒããŒã¯ã³ãæäŸããå¿
èŠããããŸãã ããŒã¯ã³ãååŸããã«ã¯ãããã€ãã®æ¹æ³ããããŸããpersonal access token ãäœæããããGitHub App ã䜿ã£ãŠããŒã¯ã³ãçæããããGitHub Actions ã¯ãŒã¯ãããŒã«çµã¿èŸŒãŸããŠããGITHUB_TOKEN
ã䜿çšãããã§ããŸãã 詳ããã¯ããREST API ã«å¯ŸããèªèšŒããã芧ãã ããã
èªèšŒããŒã¯ã³ã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç §ããŠãã ããã
ã¡ã¢
ããŒã¯ã³ãäœæããããªãå Žåã¯ãGitHub CLI ã䜿çšã§ããŸãã GitHub CLI ã¯èªèšŒãåŠçããã¢ã«ãŠã³ãã®ã»ãã¥ãªãã£ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã 詳ããã¯ããã®ããŒãžã®GitHub CLI ããŒãžã§ã³ãåç §ããŠãã ããã
èŠå
ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ããã¹ã¯ãŒããä»ã®æ©å¯æ§ã®é«ãè³æ Œæ å ±ãæ±ãã®ãšåãæ¹æ³ã§æ±ã£ãŠãã ããã 詳ããã¯ããAPI è³æ Œæ å ±ãã»ãã¥ãªãã£ã§ä¿è·ããããã芧ãã ããã
äžéšã® REST API ãšã³ããã€ã³ãã«ã¯èªèšŒãªãã§ã¢ã¯ã»ã¹ã§ããŸãããGitHub CLI ã§ã¯ãapi
ãµãã³ãã³ãã䜿çšã㊠API èŠæ±ãè¡ãåã«èªèšŒããå¿
èŠããããŸãã auth login
ãµãã³ãã³ãã䜿ã£ãŠãGitHub ã«å¯ŸããèªèšŒãè¡ããŸãã 詳现ã«ã€ããŠã¯ããèŠæ±ã®äœæããåç
§ããŠãã ããã
èŠæ±ãèªèšŒããã«ã¯ãå¿
èŠãªã¹ã³ãŒããŸãã¯ã¢ã¯ã»ã¹èš±å¯ãæã€èªèšŒããŒã¯ã³ãæäŸããå¿
èŠããããŸãã ããŒã¯ã³ãååŸããã«ã¯ãããã€ãã®æ¹æ³ããããŸããpersonal access token ãäœæããããGitHub App ã䜿ã£ãŠããŒã¯ã³ãçæããããGitHub Actions ã¯ãŒã¯ãããŒã«çµã¿èŸŒãŸããŠããGITHUB_TOKEN
ã䜿çšãããã§ããŸãã 詳ããã¯ããREST API ã«å¯ŸããèªèšŒããã芧ãã ããã
èªèšŒããŒã¯ã³ã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç §ããŠãã ããã
èŠå
ã¢ã¯ã»ã¹ ããŒã¯ã³ã¯ããã¹ã¯ãŒããä»ã®æ©å¯æ§ã®é«ãè³æ Œæ å ±ãæ±ãã®ãšåãæ¹æ³ã§æ±ã£ãŠãã ããã 詳ããã¯ããAPI è³æ Œæ å ±ãã»ãã¥ãªãã£ã§ä¿è·ããããã芧ãã ããã
ãã©ã¡ãŒã¿ãŒ
å€ãã® API ã¡ãœããã§ã¯ãèŠæ±ã®ãã©ã¡ãŒã¿ãŒã«è¿œå æ å ±ãéä¿¡ããå¿ èŠããããŸãã ãã©ã¡ãŒã¿ãŒã«ã¯ããã¹ ãã©ã¡ãŒã¿ãŒãæ¬æãã©ã¡ãŒã¿ãŒãã¯ãšãª ãã©ã¡ãŒã¿ãŒãªã©ãããã€ãã®çš®é¡ããããŸãã
ãã¹ ãã©ã¡ãŒã¿ãŒ
ãã¹ ãã©ã¡ãŒã¿ãŒã§ã¯ãšã³ããã€ã³ããã¹ã倿ŽããŸãã ãããã¯èŠæ±ã«å¿ é ã§ãã 詳现ã«ã€ããŠã¯ããPathããã芧ãã ããã
æ¬æãã©ã¡ãŒã¿
æ¬æãã©ã¡ãŒã¿ãŒã䜿çšãããšãAPI ã«è¿œå ã®ããŒã¿ãæž¡ãããšãã§ããŸãã ãããã®ãã©ã¡ãŒã¿ãŒã¯ããšã³ããã€ã³ãã«å¿ããŠçç¥å¯èœãŸãã¯å¿ é ã«ããããšãã§ããŸãã ããšãã°ãæ¬æãã©ã¡ãŒã¿ãŒã䜿çšãããšãæ°ããåé¡ãäœæãããšãã«åé¡ã®ã¿ã€ãã«ãæå®ããããæ©èœãæå¹ãŸãã¯ç¡å¹ã«ãããšãã«ç¹å®ã®èšå®ãæå®ãããã§ããŸãã å GitHub REST API ãšã³ããã€ã³ãã®ããã¥ã¡ã³ãã§ã¯ããµããŒããããŠããæ¬æãã©ã¡ãŒã¿ãŒã«ã€ããŠèª¬æããŸãã 詳现ã«ã€ããŠã¯ããGitHub REST API ã«é¢ããããã¥ã¡ã³ãããåç §ããŠãã ããã
ããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãèŠæ±ã§æ°ãã issue ã®ã¿ã€ãã«ãæå®ããå¿ èŠããããŸãã ãŸããå¿ èŠã«å¿ã㊠issue æ¬æã«å ¥åããããã¹ããæ°ãã issue ã«å²ãåœãŠããŠãŒã¶ãŒãæ°ãã issue ã«é©çšããã©ãã«ãªã©ããã®ä»ã®æ å ±ãæå®ããããšãã§ããŸãã æ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç §ããŠãã ããã
æ¬æãã©ã¡ãŒã¿ãŒãæž¡ãã«ã¯ãèŠæ±ãèªèšŒããå¿ èŠããããŸãã 詳现ã«ã€ããŠã¯ããèªèšŒããåç §ããŠãã ããã
ã¯ãšãª ãã©ã¡ãŒã¿ãŒ
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšãããšãèŠæ±ã«å¯ŸããŠè¿ãããããŒã¿ãå¶åŸ¡ã§ããŸãã ãããã®ãã©ã¡ãŒã¿ãŒã¯éåžžçç¥å¯èœã§ãã å GitHub REST API ãšã³ããã€ã³ãã®ããã¥ã¡ã³ãã§ã¯ããµããŒããããŠããã¯ãšãª ãã©ã¡ãŒã¿ãŒã«ã€ããŠèª¬æããŸãã 詳现ã«ã€ããŠã¯ããGitHub REST API ã«é¢ããããã¥ã¡ã³ãããåç §ããŠãã ããã
ããšãã°ã"ãããªã㯠ã€ãã³ãã®äžèŠ§è¡šç€º" ãšã³ããã€ã³ã ã§ã¯ãæ¢å®ã§ 30 åã® issue ãè¿ãããŸãã per_page
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšãããšã30 åã§ã¯ãªã 2 åã® issue ãè¿ãããšãã§ããŸãã page
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããŠãçµæã®æåã®ããŒãžã®ã¿ããã§ããã§ããŸãã ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããèŠæ±ã®äœæããåç
§ããŠãã ããã
èŠæ±ãè¡ã
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãGitHub CLI ã䜿çšããŠãGitHub REST API ã«å¯ŸããŠèªèšŒãããèŠæ±ãè¡ãæ¹æ³ã«ã€ããŠèª¬æããŸãã
1. ã»ããã¢ãã
macOSãWindowsããŸã㯠Linux ã« GitHub CLI ãã€ã³ã¹ããŒã«ããŸãã 詳现ã«ã€ããŠã¯ãGitHub CLI ãªããžããªå ã§ã®ã€ã³ã¹ããŒã«ãåç §ããŠãã ããã
2. èªèšŒ
-
GitHub ã«å¯ŸããŠèªèšŒãè¡ãã«ã¯ãã¿ãŒããã«ããæ¬¡ã®ã³ãã³ããå®è¡ããŸãã
gh auth login
--scopes
ãªãã·ã§ã³ã䜿çšããŠãå¿ èŠãªã¹ã³ãŒããæå®ã§ããŸãã äœæããããŒã¯ã³ã§èªèšŒããå Žåã¯ã--with-token
ãªãã·ã§ã³ã䜿çšã§ããŸãã 詳ããã¯ãGitHub CLIauth login
ã®ããã¥ã¡ã³ããåç §ããŠãã ããã -
èªèšŒãè¡ãå Žæãéžã³ãŸãã
- GitHub.com ã«ãã GitHub ã«ã¢ã¯ã»ã¹ããå Žåã¯ã[GitHub.com] ãéžã³ãŸãã
- å¥ã®ãã¡ã€ã³ã«ãã GitHub ã«ã¢ã¯ã»ã¹ããå Žåã¯ã[Other] ãéžãã§ããããã¹ãåãå
¥åããŸã (äŸ:
octocorp.ghe.com
)ã
-
ç»é¢äžã®æ®ãã®ããã³ããã«åŸããŸãã
GitHub CLI ã¯ãGit æäœã®åªå ãããã³ã«ãšã㊠HTTPS ãéžæãããšèªåçã« Git è³æ Œæ å ±ãæ ŒçŽããGitHub è³æ Œæ å ±ã§ Git ã«å¯ŸããŠèªèšŒãããã©ãããå°ããããã³ããã«å¯Ÿã㊠"ã¯ã" ãšçããŸãã ããã¯ãå¥ã®è³æ Œæ å ±ãããŒãžã£ãŒãèšå®ããããSSH ã䜿çšãããããããšãªãã
git push
ãgit pull
ãªã©ã® Git ã䜿çšã§ããã®ã§äŸ¿å©ã§ãã
3. èŠæ±ã®ãšã³ããã€ã³ãã®éžæ
-
èŠæ±ãè¡ããšã³ããã€ã³ããéžã³ãŸãã GitHub ã® REST API ããã¥ã¡ã³ãã調ã¹ãŠãGitHub ã®æäœã«äœ¿çšã§ãããšã³ããã€ã³ãã確èªã§ããŸãã
-
ãšã³ããã€ã³ãã® HTTP ã¡ãœãããšãã¹ãç¹å®ããŸãã ãããã¯èŠæ±ãšå ±ã«éä¿¡ãããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããšããã¹ããåç §ããŠãã ããã
ããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãHTTP ã¡ãœãã
POST
ãšãã¹/repos/{owner}/{repo}/issues
ã䜿çšãããŸãã -
å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒãç¹å®ããŸãã å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒã¯ããšã³ããã€ã³ãã®ãã¹ã®äžãã£ã
{}
ã§å²ãŸããŠããŸãã åãã©ã¡ãŒã¿ãŒã®ãã¬ãŒã¹ãã«ããŒãç®çã®å€ã«çœ®ãæããŸãã 詳现ã«ã€ããŠã¯ããPathããã芧ãã ãããããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãã¹
/repos/{owner}/{repo}/issues
ã䜿çšããããã¹ ãã©ã¡ãŒã¿ãŒã¯{owner}
ãš{repo}
ã«ãªããŸãã API èŠæ±ã§ãã®ãã¹ã䜿çšããã«ã¯ã{repo}
ãæ°ãã issue ãäœæãããªããžããªã®ååã«çœ®ãæãã{owner}
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããŸãã
4. GitHub CLI ã§èŠæ±ãè¡ã
GitHub CLI api
ãµãã³ãã³ãã䜿çšã㊠API èŠæ±ãè¡ããŸãã 詳ããã¯ãGitHub CLIapi
ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
èŠæ±ã§ã次ã®ãªãã·ã§ã³ãšå€ãæå®ããŸãã
-
--method ã®åŸã« HTTP ã¡ãœãããšãšã³ããã€ã³ãã®ãã¹ãç¶ããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããšããã¹ããåç §ããŠãã ããã
-
--header:
Accept
:Accept
ããããŒã«ã¡ãã£ã¢ã®çš®é¡ãæž¡ããŸããAccept
ããããŒã«è€æ°ã®ã¡ãã£ã¢ã®çš®é¡ãæž¡ãã«ã¯ãã¡ãã£ã¢ã®çš®é¡ãã³ã³ã:Accept: application/vnd.github+json,application/vnd.github.diff
ã§åºåããŸãã 詳现ã«ã€ããŠã¯ããAccept
ããšãã¡ãã£ã¢ ã¿ã€ãããåç §ããŠãã ãããX-GitHub-Api-Version
:X-GitHub-Api-Version
ããããŒã« API ããŒãžã§ã³ãæž¡ããŸãã 詳现ã«ã€ããŠã¯ãX-GitHub-Api-Version
ãåç §ããŠãã ããã
-
-f
ãŸãã¯-F
ã®åŸã«ãkey=value
圢åŒã®ä»»æã®æ¬æãã©ã¡ãŒã¿ãŒãŸãã¯ã¯ãšãª ãã©ã¡ãŒã¿ãŒãç¶ããŸãã ãã®-F
ãªãã·ã§ã³ã䜿çšããŠãæ°å€ãããŒã«å€ããŸã㯠null ã®ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã æååãã©ã¡ãŒã¿ãŒãæž¡ãã«ã¯ã-f
ãªãã·ã§ã³ã䜿çšããŸããäžéšã®ãšã³ããã€ã³ãã§ã¯ãé åã®ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿ãããŸãã ã¯ãšãªæååã§é åãéä¿¡ããã«ã¯ãé åã®é ç®ããšã« 1 åã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿ããã¯ãšãª ãã©ã¡ãŒã¿ãŒåã®åŸã«
[]
ã远å ããŸãã ããšãã°ã2 ã€ã®ãªããžã㪠ID ã®é åãæå®ããã«ã¯ã-f repository_ids[]=REPOSITORY_A_ID -f repository_ids[]=REPOSITORY_B_ID
ã䜿ããŸããèŠæ±ã§æ¬æãã©ã¡ãŒã¿ãŒãŸãã¯ã¯ãšãª ãã©ã¡ãŒã¿ãŒãæå®ããå¿ èŠããªãå Žåã¯ããã®ãªãã·ã§ã³ãçç¥ããŸãã 詳现ã«ã€ããŠã¯ããæ¬æãã©ã¡ãŒã¿ãŒããšãã¯ãšãª ãã©ã¡ãŒã¿ãŒããåç §ããŠãã ããã äŸã«ã€ããŠã¯ããæ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸããšãã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸããåç §ããŠãã ããã
èŠæ±ã®äŸ
次ã®èŠæ±äŸã§ã¯ã "Get Octocat" ãšã³ããã€ã³ã ã䜿çšããŠãoctocat ã ASCII ã¢ãŒããšããŠè¿ããŸãã
gh api --method GET /octocat \ --header 'Accept: application/vnd.github+json' \ --header "X-GitHub-Api-Version: 2022-11-28"
gh api --method GET /octocat \
--header 'Accept: application/vnd.github+json' \
--header "X-GitHub-Api-Version: 2022-11-28"
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸ
"ãããªã㯠ã€ãã³ãã®äžèŠ§è¡šç€º" ãšã³ããã€ã³ã ã§ã¯ãæ¢å®ã§ 30 åã® issue ãè¿ãããŸãã æ¬¡ã®äŸã§ã¯ãper_page
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšã㊠30 åã§ã¯ãªã 2 åã® issue ãè¿ããpage
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããŠçµæã®æåã®ããŒãžã®ã¿ããã§ããããŸãã
gh api --method GET /events -F per_page=2 -F page=1 --header 'Accept: application/vnd.github+json' \
gh api --method GET /events -F per_page=2 -F page=1
--header 'Accept: application/vnd.github+json' \
æ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸ
次ã®äŸã§ã¯ã"issue ã®äœæ" ãšã³ããã€ã³ã ã䜿çšããŠãoctocat/Spoon-Knife ãªããžããªã«æ°ãã issue ãäœæããŸããå¿çã§ issue ã® html_url
ãèŠã€ãããã©ãŠã¶ãŒã® issue ã«ç§»åããŸãã
gh api --method POST /repos/octocat/Spoon-Knife/issues \ --header "Accept: application/vnd.github+json" \ --header "X-GitHub-Api-Version: 2022-11-28" \ -f title='Created with the REST API' \ -f body='This is a test issue created by the REST API' \
gh api --method POST /repos/octocat/Spoon-Knife/issues \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
-f title='Created with the REST API' \
-f body='This is a test issue created by the REST API' \
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãcurl
ã䜿çšããŠãGitHub REST API ã«å¯ŸããŠèªèšŒæžã¿èŠæ±ãè¡ãæ¹æ³ã«ã€ããŠèª¬æããŸãã
1. ã»ããã¢ãã
ã䜿ãã®ã³ã³ãã¥ãŒã¿ãŒäžã« curl
ãã€ã³ã¹ããŒã«ãããŠããå¿
èŠããããŸãã curl
ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠãããã©ããã確èªããã«ã¯ãã³ãã³ã ã©ã€ã³ã§ curl --version
ãå®è¡ããŸãã
- åºåã
curl
ã®ããŒãžã§ã³ã«é¢ããæ å ±ã§ããã°ãcurl
ãã€ã³ã¹ããŒã«ãããŠãããšããããšã§ãã command not found: curl
ã®ãããªã¡ãã»ãŒãžã衚瀺ãããå Žåã¯ãcurl
ãã€ã³ã¹ããŒã«ãããŠããªãããšãæå³ããŸããcurl
ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã 詳ããã¯ãcurl ã®ããŠã³ããŒãã«é¢ããããŒãžãåç §ããŠãã ããã
2. èŠæ±ã®ãšã³ããã€ã³ãã®éžæ
-
èŠæ±ãè¡ããšã³ããã€ã³ããéžã³ãŸãã GitHub ã® REST API ããã¥ã¡ã³ãã調ã¹ãŠãGitHub ã®æäœã«äœ¿çšã§ãããšã³ããã€ã³ãã確èªã§ããŸãã
-
ãšã³ããã€ã³ãã® HTTP ã¡ãœãããšãã¹ãç¹å®ããŸãã ãããã¯èŠæ±ãšå ±ã«éä¿¡ãããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããšããã¹ããåç §ããŠãã ããã
ããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãHTTP ã¡ãœãã
POST
ãšãã¹/repos/{owner}/{repo}/issues
ã䜿çšãããŸãã -
å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒãç¹å®ããŸãã å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒã¯ããšã³ããã€ã³ãã®ãã¹ã®äžãã£ã
{}
ã§å²ãŸããŠããŸãã åãã©ã¡ãŒã¿ãŒã®ãã¬ãŒã¹ãã«ããŒãç®çã®å€ã«çœ®ãæããŸãã 詳现ã«ã€ããŠã¯ããPathããã芧ãã ãããããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãã¹
/repos/{owner}/{repo}/issues
ã䜿çšããããã¹ ãã©ã¡ãŒã¿ãŒã¯{owner}
ãš{repo}
ã«ãªããŸãã API èŠæ±ã§ãã®ãã¹ã䜿çšããã«ã¯ã{repo}
ãæ°ãã issue ãäœæãããªããžããªã®ååã«çœ®ãæãã{owner}
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããŸãã
3. èªèšŒè³æ Œæ å ±ã®äœæ
èŠæ±ãèªèšŒããããã®ã¢ã¯ã»ã¹ ããŒã¯ã³ãäœæããŸãã ããŒã¯ã³ãä¿åããè€æ°ã®èŠæ±ã«äœ¿çšã§ããŸãã ãšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ããããã«å¿
èŠãªã¹ã³ãŒããŸãã¯ã¢ã¯ã»ã¹èš±å¯ãããŒã¯ã³ã«ä»äžããŸãã ãã®ããŒã¯ã³ã¯èŠæ±ã® Authorization
ããããŒã«å«ããŠéä¿¡ããŸãã 詳现ã«ã€ããŠã¯ãèªèšŒã«é¢ããããŒãžãã芧ãã ããã
4. curl
èŠæ±ãè¡ã
curl
ã³ãã³ãã䜿çšããŠèŠæ±ãè¡ããŸãã 詳现ã«ã€ããŠã¯ãcurl ã®ããã¥ã¡ã³ããåç
§ããŠãã ããã
èŠæ±ã§æ¬¡ã®ãªãã·ã§ã³ãšå€ãæå®ããŸãã
-
--request
ãŸãã¯-X
ã®åŸã«ãå€ãšã㊠HTTP ã¡ãœãããç¶ããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããåç §ããŠãã ããã -
--url
ã®åŸã«ãå€ãšããŠå®å šãªãã¹ãç¶ããŸãã å®å šãªãã¹ã¯ãGitHub REST API ã®ããŒã¹ URL (https://api.github.com
) ãšhttps://api.github.com/PATH
ã®ãããªãšã³ããã€ã³ãã®ãã¹ãå«ã URL ã§ããPATH
ã¯ãšã³ããã€ã³ãã®ãã¹ã«çœ®ãæããŸãã 詳现ã«ã€ããŠã¯ããPathããã芧ãã ãããã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããã«ã¯ããã¹ã®æ«å°Ÿã«
?
ã远å ããŠãããã¯ãšãª ãã©ã¡ãŒã¿ãŒã®ååãšå€ãparameter_name=value
圢åŒã§ä»å ããŸãã è€æ°ã®ã¯ãšãª ãã©ã¡ãŒã¿ãŒã¯&
ã§åºåããŸãã ã¯ãšãªæååã§é åãéä¿¡ããå Žåã¯ãé åã®é ç®ããšã« 1 åã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿ããã¯ãšãª ãã©ã¡ãŒã¿ãŒåã®åŸã«[]
ã远å ããŸãã ããšãã°ã2 ã€ã®ãªããžã㪠ID ã®é åãæå®ããã«ã¯ã?repository_ids[]=REPOSITORY_A_ID&repository_ids[]=REPOSITORY_B_ID
ã䜿ããŸãã 詳现ã«ã€ããŠã¯ããã¯ãšãªã®ãã©ã¡ãŒã¿ãŒããåç §ããŠãã ããã äŸã«ã€ããŠã¯ããã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸããåç §ããŠãã ããã -
--header
ãŸãã¯-H
:Accept
:Accept
ããããŒã«ã¡ãã£ã¢ã®çš®é¡ãæž¡ããŸããAccept
ããããŒã«è€æ°ã®ã¡ãã£ã¢ã®çš®é¡ãæž¡ãã«ã¯ãããšãã°ãAccept: application/vnd.github+json,application/vnd.github.diff
ãšããããã«ãã¡ãã£ã¢ã®çš®é¡ãã³ã³ãã§åºåããŸãã 詳现ã«ã€ããŠã¯ããAccept
ããšãã¡ãã£ã¢ ã¿ã€ãããåç §ããŠãã ãããX-GitHub-Api-Version
:X-GitHub-Api-Version
ããããŒã« API ããŒãžã§ã³ãæž¡ããŸãã 詳现ã«ã€ããŠã¯ãX-GitHub-Api-Version
ãåç §ããŠãã ãããAuthorization
:Authorization
ããããŒã«èªèšŒããŒã¯ã³ãæž¡ããŸãã ã»ãšãã©ã®å Žåã¯ãAuthorization: Bearer
ãŸãã¯Authorization: token
ã䜿çšããŠããŒã¯ã³ãæž¡ãããšãã§ããããšã«ã泚æãã ããã ãã ããJSON Web ããŒã¯ã³ (JWT) ãæž¡ãå Žåã¯ãAuthorization: Bearer
ã䜿çšããå¿ èŠããããŸãã 詳现ã«ã€ããŠã¯ãèªèšŒã«é¢ããããŒãžãã芧ãã ãããAuthorization
ããããŒã䜿çšããèŠæ±ã®äŸã«ã€ããŠã¯ããæ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸããåç §ããŠãã ããã
-
--data
ãŸãã¯-d
ã®åŸã«ãJSON ãªããžã§ã¯ãå ã®ä»»æã®æ¬æãã©ã¡ãŒã¿ãŒãç¶ããŸãã èŠæ±ã§æ¬æãã©ã¡ãŒã¿ãŒãæå®ããå¿ èŠããªãå Žåã¯ããã®ãªãã·ã§ã³ãçç¥ããŸãã 詳现ã«ã€ããŠã¯ããæ¬æãã©ã¡ãŒã¿ãŒããåç §ããŠãã ããã äŸã«ã€ããŠã¯ããæ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸããåç §ããŠãã ããã
èŠæ±ã®äŸ
次ã®èŠæ±äŸã§ã¯ã "Get Octocat" ãšã³ããã€ã³ã ã䜿çšããŠãoctocat ã ASCII ã¢ãŒããšããŠè¿ããŸãã
curl --request GET \ --url "https://api.github.com/octocat" \ --header "Accept: application/vnd.github+json" \ --header "X-GitHub-Api-Version: 2022-11-28"
curl --request GET \
--url "https://api.github.com/octocat" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28"
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸ
"ãããªã㯠ã€ãã³ãã®äžèŠ§è¡šç€º" ãšã³ããã€ã³ã ã§ã¯ãæ¢å®ã§ 30 åã® issue ãè¿ãããŸãã æ¬¡ã®äŸã§ã¯ãper_page
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšã㊠30 åã§ã¯ãªã 2 åã® issue ãè¿ããpage
ã¯ãšãª ãã©ã¡ãŒã¿ãŒã䜿çšããŠçµæã®æåã®ããŒãžã®ã¿ããã§ããããŸãã
curl --request GET \ --url "https://api.github.com/events?per_page=2&page=1" \ --header "Accept: application/vnd.github+json" \ --header "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/events
curl --request GET \
--url "https://api.github.com/events?per_page=2&page=1" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/events
æ¬æãã©ã¡ãŒã¿ãŒã䜿çšããèŠæ±ã®äŸ
次ã®äŸã§ã¯ã[Create an issue] ãšã³ããã€ã³ãã䜿çšããŠãoctocat/Spoon-Knife ãªããžããªã«æ°ãã issue ãäœæããŸãã YOUR-TOKEN
ãåã®æé ã§äœæããèªèšŒããŒã¯ã³ã«çœ®ãæããŸãã
ã¡ã¢
fine-grained personal access token ã䜿ã£ãŠããå Žåã¯ãoctocat/Spoon-Knife
ããèªåãææããŠããããŸãã¯èªåãã¡ã³ããŒã§ãã organization ã«ãã£ãŠææãããŠãããªããžããªã«çœ®ãæããå¿
èŠããããŸãã ã䜿ãã®ããŒã¯ã³ã¯ããªããžããªã«ã¢ã¯ã»ã¹ã§ããå¿
èŠãããããªããžããªã® issue ã«å¯Ÿããèªã¿åããšæžã蟌ã¿ã®ã¢ã¯ã»ã¹èš±å¯ãå¿
èŠã§ãã 詳ããã¯ããå人çšã¢ã¯ã»ã¹ ããŒã¯ã³ã管çããããã芧ãã ããã
curl \ --request POST \ --url "https://api.github.com/repos/octocat/Spoon-Knife/issues" \ --header "Accept: application/vnd.github+json" \ --header "X-GitHub-Api-Version: 2022-11-28" \ --header "Authorization: Bearer YOUR-TOKEN" \ --data '{ "title": "Created with the REST API", "body": "This is a test issue created by the REST API" }'
curl \
--request POST \
--url "https://api.github.com/repos/octocat/Spoon-Knife/issues" \
--header "Accept: application/vnd.github+json" \
--header "X-GitHub-Api-Version: 2022-11-28" \
--header "Authorization: Bearer YOUR-TOKEN" \
--data '{
"title": "Created with the REST API",
"body": "This is a test issue created by the REST API"
}'
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãJavaScript ãš Octokit.js ã䜿çšã㊠GitHub REST API ã«èŠæ±ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ããã«è©³ããã¬ã€ãã«ã€ããŠã¯ããREST API ãš JavaScript ã䜿çšããã¹ã¯ãªããããåç §ããŠãã ããã
1. ã»ããã¢ãã
次ã®äŸã«ç€ºã Octokit.js ã©ã€ãã©ãªã䜿çšããã«ã¯ãoctokit
ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
octokit
ãã€ã³ã¹ããŒã«ããã ããšãã°ããnpm install octokit
ãã®ããã«å ¥åããŸããoctokit
ãã€ã³ã¹ããŒã«ãŸãã¯èªã¿èŸŒãããã®ä»ã®æ¹æ³ã«ã€ããŠã¯ãOctokit.js ã® README ãåç §ããŠãã ããã
2. èŠæ±ã®ãšã³ããã€ã³ãã®éžæ
-
èŠæ±ãè¡ããšã³ããã€ã³ããéžã³ãŸãã GitHub ã® REST API ããã¥ã¡ã³ãã調ã¹ãŠãGitHub ã®æäœã«äœ¿çšã§ãããšã³ããã€ã³ãã確èªã§ããŸãã
-
ãšã³ããã€ã³ãã® HTTP ã¡ãœãããšãã¹ãç¹å®ããŸãã ãããã¯èŠæ±ãšå ±ã«éä¿¡ãããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããšããã¹ããåç §ããŠãã ããã
ããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãHTTP ã¡ãœãã
POST
ãšãã¹/repos/{owner}/{repo}/issues
ã䜿çšãããŸãã -
å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒãç¹å®ããŸãã å¿ èŠãªãã¹ ãã©ã¡ãŒã¿ãŒã¯ããšã³ããã€ã³ãã®ãã¹ã®äžãã£ã
{}
ã§å²ãŸããŠããŸãã åãã©ã¡ãŒã¿ãŒã®ãã¬ãŒã¹ãã«ããŒãç®çã®å€ã«çœ®ãæããŸãã 詳现ã«ã€ããŠã¯ããPathããã芧ãã ãããããšãã°ã"issue ã®äœæ" ãšã³ããã€ã³ã ã§ã¯ãã¹
/repos/{owner}/{repo}/issues
ã䜿çšããããã¹ ãã©ã¡ãŒã¿ãŒã¯{owner}
ãš{repo}
ã«ãªããŸãã API èŠæ±ã§ãã®ãã¹ã䜿çšããã«ã¯ã{repo}
ãæ°ãã issue ãäœæãããªããžããªã®ååã«çœ®ãæãã{owner}
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããŸãã
3. ã¢ã¯ã»ã¹ ããŒã¯ã³ã®äœæ
èŠæ±ãèªèšŒããããã®ã¢ã¯ã»ã¹ ããŒã¯ã³ãäœæããŸãã ããŒã¯ã³ãä¿åããè€æ°ã®èŠæ±ã«äœ¿çšã§ããŸãã ãšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ããããã«å¿
èŠãªã¹ã³ãŒããŸãã¯ã¢ã¯ã»ã¹èš±å¯ãããŒã¯ã³ã«ä»äžããŸãã ãã®ããŒã¯ã³ã¯èŠæ±ã® Authorization
ããããŒã«å«ããŠéä¿¡ããŸãã 詳现ã«ã€ããŠã¯ãèªèšŒã«é¢ããããŒãžãã芧ãã ããã
4. Octokit.js ã§èŠæ±ãè¡ã
-
ã¹ã¯ãªããã§
octokit
ãã€ã³ããŒãããŸãã ããšãã°ããimport { Octokit } from "octokit";
ãã®ããã«å ¥åããŸãã ãã®ä»ã®octokit
ã®ã€ã³ããŒãæ¹æ³ã«ã€ããŠã¯ãOctokit.js ã® README ãåç §ããŠãã ããã -
ããŒã¯ã³ã䜿çšããŠ
Octokit
ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããYOUR-TOKEN
ãã䜿ãã®ããŒã¯ã³ã«çœ®ãæããŸããJavaScript const octokit = new Octokit({ auth: 'YOUR-TOKEN' });
const octokit = new Octokit({ auth: 'YOUR-TOKEN' });
-
octokit.request
ã䜿çšããŠãèŠæ±ãå®è¡ããŸãã- HTTP ã¡ãœãããšãã¹ã
request
ã¡ãœããã®æåã®åŒæ°ãšããŠéä¿¡ããŸãã 詳现ã«ã€ããŠã¯ããHTTP ã¡ãœããããšããã¹ããåç §ããŠãã ããã - ãªããžã§ã¯ãå
ã®ãã¹ãŠã®ãã¹ãã¯ãšãªãããã³æ¬æãã©ã¡ãŒã¿ãŒã
request
ã¡ãœããã® 2 çªç®ã®åŒæ°ãšããŠæå®ããŸãã 詳ããã¯ãããã©ã¡ãŒã¿ãŒããã芧ãã ããã
次ã®èŠæ±äŸã§ã¯ãHTTP ã¡ãœããã¯
POST
ããã¹ã¯/repos/{owner}/{repo}/issues
ããã¹ ãã©ã¡ãŒã¿ãŒã¯owner: "octocat"
ãšrepo: "Spoon-Knife"
ãæ¬æãã©ã¡ãŒã¿ãŒã¯title: "Created with the REST API"
ãšbody: "This is a test issue created by the REST API"
ã§ããã¡ã¢
fine-grained personal access token ã䜿ã£ãŠããå Žåã¯ã
octocat/Spoon-Knife
ããèªåãææããŠããããŸãã¯èªåãã¡ã³ããŒã§ãã organization ã«ãã£ãŠææãããŠãããªããžããªã«çœ®ãæããå¿ èŠããããŸãã ã䜿ãã®ããŒã¯ã³ã¯ããªããžããªã«ã¢ã¯ã»ã¹ã§ããå¿ èŠãããããªããžããªã® issue ã«å¯Ÿããèªã¿åããšæžã蟌ã¿ã®ã¢ã¯ã»ã¹èš±å¯ãå¿ èŠã§ãã 詳ããã¯ããå人çšã¢ã¯ã»ã¹ ããŒã¯ã³ã管çããããã芧ãã ãããJavaScript await octokit.request("POST /repos/{owner}/{repo}/issues", { owner: "octocat", repo: "Spoon-Knife", title: "Created with the REST API", body: "This is a test issue created by the REST API", });
await octokit.request("POST /repos/{owner}/{repo}/issues", { owner: "octocat", repo: "Spoon-Knife", title: "Created with the REST API", body: "This is a test issue created by the REST API", });
request
ã¡ãœããã§ã¯Accept: application/vnd.github+json
ããããŒãèªåçã«æž¡ãããŸãã 远å ã®ããããŒãŸãã¯å¥ã®Accept
ããããŒãæž¡ãã«ã¯ã2 çªç®ã®åŒæ°ãšããŠæž¡ããããªããžã§ã¯ãã«headers
ããããã£ã远å ããŸããheaders
ããããã£ã®å€ã¯ãããŒãããããŒåã§å€ãããããŒå€ã®ãªããžã§ã¯ãã§ããããšãã°ã次ã®ã³ãŒãã¯ã
text/plain
ã®å€ãæã€content-type
ããããŒãšã2022-11-28
ã®å€ãæã€X-GitHub-Api-Version
ããããŒãéä¿¡ããŸããJavaScript await octokit.request("GET /octocat", { headers: { "content-type": "text/plain", "X-GitHub-Api-Version": "2022-11-28", }, });
await octokit.request("GET /octocat", { headers: { "content-type": "text/plain", "X-GitHub-Api-Version": "2022-11-28", }, });
- HTTP ã¡ãœãããšãã¹ã
å¿çã®äœ¿çš
èŠæ±ãè¡ããšãAPI ã§ã¯ãå¿çç¶æ ã³ãŒããšå¿çããããŒããŸãå Žåã«ãã£ãŠã¯å¿çæ¬æãè¿ãããŸãã
å¿çã³ãŒããšããããŒã«ã€ããŠ
ãã¹ãŠã®èŠæ±ã§ãå¿çã®æåã瀺ã HTTP ç¶æ ã³ãŒããè¿ãããŸãã å¿çã³ãŒãã«ã€ããŠè©³ããã¯ãMDN HTTP å¿çç¶æ ã³ãŒãã«é¢ããããã¥ã¡ã³ããåç §ããŠãã ããã
ããã«ãå¿çã«ã¯ãå¿çã®è©³çްã瀺ãããããŒãå«ãŸããŸãã X-
ãŸã㯠x-
ã§å§ãŸããã®ã¯ãGitHub ã®ã«ã¹ã¿ã ããããŒã§ãã ããšãã°ãx-ratelimit-remaining
ãš x-ratelimit-reset
ããããŒã¯ãäžå®æéã«è¡ãããšãã§ããèŠæ±ã®æ°ã瀺ããŸãã
ç¶æ
ã³ãŒããšããããŒã衚瀺ããã«ã¯ãèŠæ±ãéä¿¡ãããšãã« --include
ãŸã㯠--i
ãªãã·ã§ã³ã䜿çšããŸãã
ããšãã°ããã®èŠæ±ã¯ãoctocat/Spoon-Knife ãªããžããªã® issue ã®äžèЧãååŸããŸãã
gh api \
--header 'Accept: application/vnd.github+json' \
--method GET /repos/octocat/Spoon-Knife/issues \
-F per_page=2 --include
ãããŠã次ã®ãããªå¿çã³ãŒããšããããŒãè¿ãããŸãã
HTTP/2.0 200 OK
Access-Control-Allow-Origin: *
Access-Control-Expose-Headers: ETag, Link, Location, Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
Cache-Control: private, max-age=60, s-maxage=60
Content-Security-Policy: default-src 'none'
Content-Type: application/json; charset=utf-8
Date: Thu, 04 Aug 2022 19:56:41 GMT
Etag: W/"a63dfbcfdb73621e9d2e89551edcf9856731ced534bd7f1e114a5da1f5f73418"
Link: <https://api.github.com/repositories/1300192/issues?per_page=1&page=2>; rel="next", <https://api.github.com/repositories/1300192/issues?per_page=1&page=14817>; rel="last"
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
Server: GitHub.com
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Vary: Accept, Authorization, Cookie, Accept-Encoding, Accept, X-Requested-With
X-Accepted-Oauth-Scopes: repo
X-Content-Type-Options: nosniff
X-Frame-Options: deny
X-Github-Api-Version-Selected: 2022-08-09
X-Github-Media-Type: github.v3; format=json
X-Github-Request-Id: 1C73:26D4:E2E500:1EF78F4:62EC2479
X-Oauth-Client-Id: 178c6fc778ccc68e1d6a
X-Oauth-Scopes: gist, read:org, repo, workflow
X-Ratelimit-Limit: 15000
X-Ratelimit-Remaining: 14996
X-Ratelimit-Reset: 1659645499
X-Ratelimit-Resource: core
X-Ratelimit-Used: 4
X-Xss-Protection: 0
ãã®äŸã§ã¯ãå¿çã³ãŒã㯠200
ã§ãèŠæ±ãæåããããšã瀺ããŸãã
Octokit.js ã§èŠæ±ãè¡ããšãrequest
ã¡ãœããã§ã¯ promise ãè¿ãããŸãã èŠæ±ãæåããå Žåãpromise ã¯ãå¿çã®HTTP ç¶æ
ã³ãŒã (status
) ãšå¿çããã㌠(headers
) ãå«ããªããžã§ã¯ãã«è§£æ±ºãããŸãã ãšã©ãŒãçºçããå Žåãpromise ã¯ãå¿çã®HTTP ç¶æ
ã³ãŒã (status
) ãšå¿çããã㌠(response.headers
) ãå«ããªããžã§ã¯ãã«è§£æ±ºãããŸãã
try/catch
ãããã¯ã䜿çšããŠããšã©ãŒãçºçããå Žåã«ããããã£ããã§ããŸãã ããšãã°ã次ã®ã¹ã¯ãªããã®èŠæ±ãæåããå Žåããã®ã¹ã¯ãªããã§ã¯ç¶æ
ã³ãŒããš x-ratelimit-remaining
ããããŒã®å€ããã°ã«èšé²ãããŸãã èŠæ±ãæåããªãã£ãå Žåãã¹ã¯ãªããã§ã¯ç¶æ
ã³ãŒããx-ratelimit-remaining
ããããŒã®å€ãããã³ãšã©ãŒ ã¡ãã»ãŒãžããã°ã«èšé²ãããŸãã
次ã®äŸã§ã¯ãREPO-OWNER
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããREPO-NAME
ããªããžããªã®ååã«çœ®ãæããŸãã
try { const result = await octokit.request("GET /repos/{owner}/{repo}/issues", { owner: "REPO-OWNER", repo: "REPO-NAME", per_page: 2, }); console.log(`Success! Status: ${result.status}. Rate limit remaining: ${result.headers["x-ratelimit-remaining"]}`) } catch (error) { console.log(`Error! Status: ${error.status}. Rate limit remaining: ${error.headers["x-ratelimit-remaining"]}. Message: ${error.response.data.message}`) }
try {
const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
owner: "REPO-OWNER",
repo: "REPO-NAME",
per_page: 2,
});
console.log(`Success! Status: ${result.status}. Rate limit remaining: ${result.headers["x-ratelimit-remaining"]}`)
} catch (error) {
console.log(`Error! Status: ${error.status}. Rate limit remaining: ${error.headers["x-ratelimit-remaining"]}. Message: ${error.response.data.message}`)
}
ç¶æ
ã³ãŒããšããããŒã衚瀺ããã«ã¯ãèŠæ±ãéä¿¡ãããšãã« --include
ãŸã㯠--i
ãªãã·ã§ã³ã䜿çšããŸãã
ããšãã°ããã®èŠæ±ã¯ãoctocat/Spoon-Knife ãªããžããªã® issue ã®äžèЧãååŸããŸãã
curl --request GET \
--url "https://api.github.com/repos/octocat/Spoon-Knife/issues?per_page=2" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR-TOKEN" \
--include
ãããŠã次ã®ãããªå¿çã³ãŒããšããããŒãè¿ãããŸãã
HTTP/2 200
server: GitHub.com
date: Thu, 04 Aug 2022 20:07:51 GMT
content-type: application/json; charset=utf-8
cache-control: public, max-age=60, s-maxage=60
vary: Accept, Accept-Encoding, Accept, X-Requested-With
etag: W/"7fceb7e8c958d3ec4d02524b042578dcc7b282192e6c939070f4a70390962e18"
x-github-media-type: github.v3; format=json
link: <https://api.github.com/repositories/1300192/issues?per_page=2&sort=updated&direction=asc&page=2>; rel="next", <https://api.github.com/repositories/1300192/issues?per_page=2&sort=updated&direction=asc&page=7409>; rel="last"
access-control-expose-headers: ETag, Link, Location, Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset
access-control-allow-origin: *
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin
content-security-policy: default-src 'none'
x-ratelimit-limit: 15000
x-ratelimit-remaining: 14996
x-ratelimit-reset: 1659645535
x-ratelimit-resource: core
x-ratelimit-used: 4
accept-ranges: bytes
content-length: 4936
x-github-request-id: 14E0:4BC6:F1B8BA:208E317:62EC2715
ãã®äŸã§ã¯ãå¿çã³ãŒã㯠200
ã§ãèŠæ±ãæåããããšã瀺ããŸãã
å¿çæ¬æã«ã€ããŠ
å€ãã®ãšã³ããã€ã³ãã§å¿çæ¬æãè¿ãããŸãã ç¹ã«æå®ããªãéããå¿çæ¬æã¯ JSON 圢åŒãšãªããŸãã 空çœã®ãã£ãŒã«ãã¯ãçç¥ãããã« null
ãšããŠå«ãŸããŸãã ãã¹ãŠã®ã¿ã€ã ã¹ã¿ã³ãã¯ã ISO 8601ãã©ãŒããã: YYYY-MM-DDTHH:MM:SSZ
ã® UTC æéã§è¿ãããŸãã
å¿ èŠãªæ å ±ãæå®ãã GraphQL API ãšã¯ç°ãªããREST API ã§ã¯éåžžãå¿ èŠä»¥äžã®æ å ±ãè¿ãããŸãã å¿ èŠã«å¿ããŠãå¿çãè§£æããŠç¹å®ã®æ å ±ãåŒãåºãããšãã§ããŸãã
ããšãã°ã>
ã䜿çšããŠãå¿çããã¡ã€ã«ã«ãªãã€ã¬ã¯ãã§ããŸãã æ¬¡ã®äŸã§ã¯ãREPO-OWNER
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããREPO-NAME
ããªããžããªã®ååã«çœ®ãæããŸãã
gh api \ --header 'Accept: application/vnd.github+json' \ --method GET /repos/REPO-OWNER/REPO-NAME/issues \ -F per_page=2 > data.json
gh api \
--header 'Accept: application/vnd.github+json' \
--method GET /repos/REPO-OWNER/REPO-NAME/issues \
-F per_page=2 > data.json
ãã®åŸãjq ã䜿çšããŠãå issue ã®ã¿ã€ãã«ãšäœæè ID ãååŸã§ããŸãã
jq '.[] | {title: .title, authorID: .user.id}' data.json
jq '.[] | {title: .title, authorID: .user.id}' data.json
åã® 2 ã€ã®ã³ãã³ãã§ã¯æ¬¡ã®ãããªãã®ãè¿ãããŸãã
{
"title": "Update index.html",
"authorID": 10701255
}
{
"title": "Edit index file",
"authorID": 53709285
}
jq ã«ã€ããŠè©³ããã¯ãjq ã®ããã¥ã¡ã³ããã芧ãã ããã
ããšãã°ãå issue ã®ã¿ã€ãã«ãšäœæè
ID ãååŸã§ããŸãã æ¬¡ã®äŸã§ã¯ãREPO-OWNER
ããªããžããªãææããã¢ã«ãŠã³ãã®ååã«çœ®ãæããREPO-NAME
ããªããžããªã®ååã«çœ®ãæããŸãã
try { const result = await octokit.request("GET /repos/{owner}/{repo}/issues", { owner: "REPO-OWNER", repo: "REPO-NAME", per_page: 2, }); const titleAndAuthor = result.data.map(issue => {title: issue.title, authorID: issue.user.id}) console.log(titleAndAuthor) } catch (error) { console.log(`Error! Status: ${error.status}. Message: ${error.response.data.message}`) }
try {
const result = await octokit.request("GET /repos/{owner}/{repo}/issues", {
owner: "REPO-OWNER",
repo: "REPO-NAME",
per_page: 2,
});
const titleAndAuthor = result.data.map(issue => {title: issue.title, authorID: issue.user.id})
console.log(titleAndAuthor)
} catch (error) {
console.log(`Error! Status: ${error.status}. Message: ${error.response.data.message}`)
}
ããšãã°ã>
ã䜿çšããŠãå¿çããã¡ã€ã«ã«ãªãã€ã¬ã¯ãã§ããŸãã æ¬¡ã®äŸã§ã¯ãREPO-OWNER
ã¯ãªããžããªãææããã¢ã«ãŠã³ãã®ååã«ãREPO-NAME
ã¯ãªããžããªã®ååã«çœ®ãæããŸãã
curl --request GET \ --url "https://api.github.com/repos/REPO-OWNER/REPO-NAME/issues?per_page=2" \ --header "Accept: application/vnd.github+json" \ --header "Authorization: Bearer YOUR-TOKEN" > data.json
curl --request GET \
--url "https://api.github.com/repos/REPO-OWNER/REPO-NAME/issues?per_page=2" \
--header "Accept: application/vnd.github+json" \
--header "Authorization: Bearer YOUR-TOKEN" > data.json
ãã®åŸãjq ã䜿çšããŠãå issue ã®ã¿ã€ãã«ãšäœæè ID ãååŸã§ããŸãã
jq '.[] | {title: .title, authorID: .user.id}' data.json
jq '.[] | {title: .title, authorID: .user.id}' data.json
åã® 2 ã€ã®ã³ãã³ãã§ã¯æ¬¡ã®ãããªãã®ãè¿ãããŸãã
{
"title": "Update index.html",
"authorID": 10701255
}
{
"title": "Edit index file",
"authorID": 53709285
}
jq ã«ã€ããŠè©³ããã¯ãjq ã®ããã¥ã¡ã³ããã芧ãã ããã
詳现衚çŸãšæŠèŠè¡šçŸ
å¿çã«ã¯ãåã ã®ãªãœãŒã¹ãŸãã¯ãªãœãŒã¹ã®äžèЧã®ã©ã¡ãããã§ãããããã«å¿ããŠããªãœãŒã¹ã®ãã¹ãŠã®å±æ§ãŸãã¯å±æ§ã®ãµãã»ããã®ã¿ãå«ããããšãã§ããŸãã
- ç¹å®ã®ãªããžããªãªã©ã®_åã ã®ãªãœãŒã¹_ããã§ãããããšãéåžžãå¿çã«ã¯ãã®ãªãœãŒã¹ã®ãã¹ãŠã®å±æ§ãå«ãŸããŸãã ããã¯ããªãœãŒã¹ã®ã詳现ã衚çŸã§ãã
- è€æ°ã®ãªããžããªã®äžèЧãªã©ã_ãªãœãŒã¹ã®äžèЧ_ããã§ãããããšãå¿çã«ã¯åãªãœãŒã¹ã®å±æ§ã®ãµãã»ããã®ã¿ãå«ãŸããŸãã ããã¯ããªãœãŒã¹ã®ãèŠçŽã衚çŸã§ãã
æ¿èªã«ãã£ãŠã衚çŸã«å«ãŸãã詳现ã®å 容ã«åœ±é¿ããå Žåãããããšã«ã泚æãã ããã
ãã®çç±ã¯ãäžéšã®å±æ§ã¯ API ãæäŸããèšç®ã³ã¹ããé«ããããGitHub ããããã®å±æ§ãæŠèŠè¡šçŸããé€å€ããããã§ãã ãããã®å±æ§ãååŸããã«ã¯ã詳现ãªè¡šçŸããã§ããããŸãã
ããã¥ã¡ã³ãã«ã¯ãå API ã¡ãœããã®ã¬ã¹ãã³ã¹äŸãèšèŒãããŠããŸãã ã¬ã¹ãã³ã¹äŸã¯ããã®ã¡ãœããã«ãã£ãŠè¿ããããã¹ãŠã®å±æ§ã瀺ããŠããŸãã
ãã€ããŒã¡ãã£ã¢
ãã¹ãŠã®ãªãœãŒã¹ã«ã¯ãä»ã®ãªãœãŒã¹ã«ãªã³ã¯ããŠãã 1 ã€ä»¥äžã® *_url
ããããã£ãããå ŽåããããŸãã ãããã¯ãé©å㪠API ã¯ã©ã€ã¢ã³ããèªèº«ã§ URL ãæ§ç¯ããå¿
èŠããªãããã«ãæç€ºç㪠URL ãæäŸããããšãç®çãšããŠããŸãã API ã¯ã©ã€ã¢ã³ãã§ã¯ããããã䜿çšããããšã匷ããå§ãããŠããŸãã ããããããšã§ãéçºè
ãå°æ¥ã® API ã®ã¢ããã°ã¬ãŒãã容æã«è¡ãããšãã§ããŸãã ãã¹ãŠã® URL ã¯ãé©å㪠RFC 6570 URI ãã³ãã¬ãŒãã§ããããšãæ³å®ãããŠããŸãã
ãã®åŸãuri_template gem ãªã©ã䜿çšããŠããããã®ãã³ãã¬ãŒããå±éã§ããŸãã
>> tmpl = URITemplate.new('/notifications{?since,all,participating}')
>> tmpl.expand
=> "/notifications"
>> tmpl.expand all: 1
=> "/notifications?all=1"
>> tmpl.expand all: 1, participating: 1
=> "/notifications?all=1&participating=1"
次ã®ã¹ããã
ãã®èšäºã§ã¯ããªããžããªã® issue ãäžèŠ§è¡šç€ºããŠäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããã ããã«ç·Žç¿ããå Žåã¯ãissue ã«ã³ã¡ã³ããä»ããããissue ã®ã¿ã€ãã«ãç·šéããããissue ãéããŠã¿ããããŠãã ããã 詳现ã«ã€ããŠã¯ããissue ã³ã¡ã³ãã®äœæããšãissue ã®æŽæ°ããšã³ããã€ã³ããåç §ããŠãã ããã
䜿çšã§ãããšã³ããã€ã³ãã«ã€ããŠè©³ããã¯ãREST ãªãã¡ã¬ã³ã¹ ããã¥ã¡ã³ããåç §ããŠãã ããã