çŸåšãGraphQLã¯èªåŒµããããšãªããITã¢ãŒãã®ææ°ãã¬ã³ãã§ãã ãããŠããããã©ããªçš®é¡ã®ãã¯ãããžãŒã§ãããããããã©ã®ããã«äœ¿çšãããããããŠãªããããããªãã«ãšã£ãŠæçšã§ãããããããªããããŸã ç¥ããªããªãã仿¥ç§ãã¡ãå
¬éããŠããèšäºã¯ããªãã®ããã«æžãããŠããŸãã ããã§ã¯ããããã³ãŒã³äŒæ¥ã®APIã®ããŒã¿ã¹ããŒã ã®äŸã䜿çšããŠãGraphQLã®åºæ¬ã«ã€ããŠèª¬æããŸãã ç¹ã«ãããŒã¿åãã¯ãšãªãçªç¶å€ç°ã«ã€ããŠè©±ããŸãããã

GraphQLãšã¯äœã§ããïŒ
GraphQLã¯ãã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ãããŒã¿ãåŠçããããã«äœ¿çšããã¯ãšãªèšèªã§ãã GraphQLã¯ãã¹ããŒãããªã©ã®æŠå¿µã«é¢é£ä»ããããŠããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³å
ã®ããŒã¿ã®äœæãèªã¿åããæŽæ°ãåé€ãæŽçã§ããŸãïŒã€ãŸããé åèªCRUDã§åç
§ãããããŒã¿ãŠã§ã¢ããŠã¹ãæäœãããšãã«äœ¿çšããã4ã€ã®åºæ¬æ©èœããããŸãïŒ -äœæãèªã¿åããæŽæ°ãåé€ïŒã
GraphQLã¯ããããŒã¿ããŒã¹å
ãã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ãå
ã®ããŒã¿ãæäœããããã«äœ¿çšããããšäžèšã§è¿°ã¹ãŸããã å®éã®ãšãããGraphQLã¯ããŒã¿ãœãŒã¹ã«äŸåããªãã·ã¹ãã ã§ããã€ãŸããäœæ¥ãæŽçããããã«ã©ãã§æŽçãããã¯é¢ä¿ãããŸããã
GraphQLã«ã€ããŠäœãç¥ããã«ãã®æè¡ã®ååãèŠããšãéåžžã«è€éã§æ··ä¹±ããŠãããã®ã«çŽé¢ããŠããããã«èŠãããããããŸããã æè¡ã®ååã«ã¯ãã°ã©ãããšããèšèããããŸãã ããã¯ãããããã¹ã¿ãŒããããã«ãã°ã©ãããŒã¿ããŒã¹ãæäœããããšãåŠã¶å¿
èŠããããšããããšã§ããïŒ ãŸããååã«ãQLãïŒãã¯ãšãªèšèªããã€ãŸããã¯ãšãªèšèªããæå³ããå ŽåããããŸãïŒãå«ãŸããŠãããšããäºå®ã¯ãGraphQLã䜿çšããã人ã¯ãŸã£ããæ°ããããã°ã©ãã³ã°èšèªãç¿åŸããªããã°ãªããªããšããæå³ã§ããïŒ
ãããã®ææã¯å®å
šã«æ£åœåãããŠããŸããã ããªããå®å¿ãããããã«-ããã¯ãã®æè¡ã«ã€ããŠã®æ®é
·ãªçå®ã§ããããã¯åã«
GET
ãŸãã¯
POST
ãªã¯ãšã¹ããè£
食ããã ãã§ãã äžè¬ã«ãGraphQLã¯ããŒã¿ç·šæãšãã®çžäºäœçšã«é¢é£ããããã€ãã®æ°ããæŠå¿µãå°å
¥ããŸããããã®ãã¯ãããžãŒã®å
éšã¡ã«ããºã ã¯å€ãè¯ãHTTPãªã¯ãšã¹ãã«äŸåããŠããŸãã
RESTãã¯ãããžãŒã®åè
æè»æ§ã¯ãGraphQLãã¯ãããžãŒãæåãªRESTãã¯ãããžãŒãšåºå¥ãããã®ã§ãã RESTã䜿çšããå Žåããã¹ãŠãæ£ããå®è¡ããããšãéåžžãç¹å®ã®ãªãœãŒã¹ãŸãã¯ã¢ããªã±ãŒã·ã§ã³ããŒã¿ã¿ã€ãã®ç¹æ§ãèæ
®ããŠãšã³ããã€ã³ããäœæãããŸãã
ããšãã°ããšã³ããã€ã³ã
/api/v1/flavors
ã«å¯ŸããŠ
GET
ãªã¯ãšã¹ããå®è¡ããå Žåãæ¬¡ã®ãããªå¿çãéä¿¡ããããšãæåŸ
ãããŸãã
[ { "id": 1, "name": "The Lazy Person's Movie Theater", "description": "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" }, { "id": 2, "name": "What's Wrong With You Caramel", "description": "You're a crazy person that likes sweet popcorn. Congratulations." }, { "id": 3, "name": "Gnarly Chili Lime", "description": "The kind of popcorn you make when you need a good smack in the face."} ]
ãã®çãã«å£æ»
çãªåé¡ã¯ãããŸãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠããŸãã¯ãã®ããŒã¿ãã©ã®ããã«äœ¿çšãããã«ã€ããŠèããŠã¿ãŸãããã
䜿çšå¯èœãªã¿ã€ãã®ãããã³ãŒã³ã®ååã®ã¿ãå«ãïŒãããŠäœãå«ãŸãªãïŒã·ã³ãã«ãªãªã¹ããã€ã³ã¿ãŒãã§ã€ã¹ã«è¡šç€ºããå Žåããã®ãªã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
ãããã³ãŒã³ã®çš®é¡ã®ãªã¹ãããã§ç§ãã¡ã¯å°é£ãªç¶æ³ã«ããããšãããããŸãã
description
ãã£ãŒã«ãã䜿çšããªãããšã決å®ããããšãã§ããŸããããã®ãã£ãŒã«ããã¯ã©ã€ã¢ã³ãã«éä¿¡ããªãã£ãããã«åº§ã£ãŠãµããããã€ããã§ããïŒ ä»ã«äœãã§ããŸããïŒ ãããŠãæ°ãæåŸã«ããŠãŒã¶ãŒã«ãšã£ãŠã¢ããªã±ãŒã·ã§ã³ããªããããªã«é
ãã®ããšèããããããã®ã¢ããªã±ãŒã·ã§ã³ãäœæããäŒç€Ÿã®çµå¶é£ãšäŒããªãããã«ããå¿
èŠããããŸãã
å®éããµãŒããŒãã¯ã©ã€ã¢ã³ãã®ãªã¯ãšã¹ãã«å¿ããŠäžèŠãªããŒã¿ãéä¿¡ãããšããäºå®ã¯ãå®å
šã«ç§ãã¡ã®ããã§ã¯ãããŸããã RESTã¯ããŠã§ã€ã¿ãŒã蚪åè
ã«å°ããã¬ã¹ãã©ã³ãšæ¯èŒã§ããããŒã¿ååŸã¡ã«ããºã ã§ãïŒãããªãã¯äœã欲ããã§ããïŒããããŠã圌ã®é¡ãã«ç¹ã«æ³šæãæããã«ã圌ã¯åœŒã«èšããŸãïŒãç§ãã¡ãæã£ãŠãããã®ãæã£ãŠããŸãã ã
ãžã§ãŒã¯ãç¡èŠãããšãå®éã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯åé¡ãçºçããå¯èœæ§ããããŸãã ããšãã°ãäŸ¡æ Œæ
å ±ãã¡ãŒã«ãŒã«é¢ããæ
å ±ãæ é€æ
å ±ãªã©ããããã³ãŒã³ã®åã¿ã€ãã«é¢ããããŸããŸãªè¿œå æ
å ±ã衚瀺ã§ããŸãïŒãããŒã¬ã³ãããã³ãŒã³ïŒãïŒã åæã«ãæè»æ§ã®ãªãRESTãšã³ããã€ã³ãã«ãããç¹å®ã®çš®é¡ã®ãããã³ãŒã³ã«é¢ããç¹å®ã®ããŒã¿ãååŸããããšãéåžžã«é£ãããªããŸããããã«ãããã·ã¹ãã ã«äžåœã«é«ãè² è·ãããããçµæãšããŠåŸããããœãªã¥ãŒã·ã§ã³ã¯éçºè
ãèªãããšãã§ãããœãªã¥ãŒã·ã§ã³ããã¯ã»ã©é ããšããäºå®ã«ã€ãªãããŸãã
GraphQLãã¯ãããžãŒãã©ã®ããã«RESTãã¯ãããžãŒã䜿çšããããæ¹åããæ¹æ³
äžèšã®ç¶æ³ã®è¡šé¢çãªåæã¯ãç§ãã¡ãå°ããªåé¡ã«éããªãããã«æãããããããŸããã ãã¯ã©ã€ã¢ã³ãã«äžèŠãªããŒã¿ãéä¿¡ããããšã®äœãåé¡ã«ãªã£ãŠããŸããïŒã ãäžèŠãªããŒã¿ãã倧ããªåé¡ã«ãªãããç¯å²ãçè§£ããããã«ãGraphQLã¯Facebookã«ãã£ãŠéçºãããããšãæãåºããŠãã ããã ãã®äŒç€Ÿã¯ã1ç§ãããäœçŸäžãã®ãªã¯ãšã¹ãã«å¯Ÿå¿ããå¿
èŠããããŸãã
ããã¯ã©ãããæå³ã§ããïŒ ãããŠããã®ãããªããªã¥ãŒã ã§ã¯ãã¹ãŠã®è©³çްãéèŠã§ãããšããäºå®ã
GraphQLã¯ãã¬ã¹ãã©ã³ãšã®é¡æšãç¶ãããšã蚪åè
ã«ãäœããéã¶ã®ã§ã¯ãªãã蚪åè
ãæ³šæãããã®ãæ£ç¢ºã«ãããããŸãã
GraphQLãããããŒã¿ã䜿çšãããã³ã³ããã¹ãã«çŠç¹ãåœãŠãå¿çãååŸã§ããŸãã ãã®å Žåããã¯ã³ã¿ã€ã ãã¢ã¯ã»ã¹ãã€ã³ããã·ã¹ãã ã«è¿œå ããããå€ãã®èŠæ±ãå®è¡ããããè€æ°éã®æ¡ä»¶æ§é ãäœæãããããå¿
èŠã¯ãããŸããã
GraphQLã¯ã©ã®ããã«æ©èœããŸããïŒ
ãã§ã«è¿°ã¹ãããã«ãGraphQLã¯åçŽãª
GET
ãŸãã¯
POST
ãªã¯ãšã¹ãã«äŸåããŠãã¯ã©ã€ã¢ã³ãã«ããŒã¿ãéä¿¡ããã¯ã©ã€ã¢ã³ãããããŒã¿ãåä¿¡ããŸãã ãã®èããããè©³çŽ°ã«æ€èšãããšãGraphQLã«ã¯2çš®é¡ã®ã¯ãšãªãããããšãããããŸãã æåã®ã¿ã€ãã«ã¯ãããŒã¿ã®èªã¿åãèŠæ±ãå«ãŸããŸããããã¯ãGraphQLã®çšèªã§ã¯åã«ã¯ãšãªãšåŒã°ããé åèªCRUDã®æåRïŒèªã¿åããèªã¿åãïŒãæããŸãã 2çªç®ã®ã¿ã€ãã®ã¯ãšãªã¯ãããŒã¿ã倿Žããããã®ã¯ãšãªã§ãããGraphQLã§ã¯å€æŽãšåŒã°ããŸãã ãããã¯ãé åèªCRUDã®ã¢ã¯ã¹ã«ããã¯ã¹CãUãããã³Dã«é¢é£ããŠããŸããã€ãŸããã¬ã³ãŒããäœæãäœæãæŽæ°ãããã³åé€ããããã«äœ¿çšããŸãã
ãããã®ãã¹ãŠã®ã¯ãšãªãšå€æŽã¯ã
GET
ãŸãã¯
POST
ãªã¯ãšã¹ãã®åœ¢åŒã§ãããšãã°
https://myapp.com/graphql
ããã«èŠããGraphQLãµãŒããŒã®URLã«éä¿¡ãããŸãã ããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãã
GraphQLã¯ãšãª
GraphQLã¯ãšãªã¯ãç¹å®ã®ããŒã¿ãåä¿¡ããããã®ãµãŒããŒãžã®èŠæ±ã衚ããšã³ãã£ãã£ã§ãã ããšãã°ãããŒã¿ãå
¥åããç¹å®ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ããããŸãã ãã®ããŒã¿ã«ã€ããŠã¯ããµãŒããŒã«æ»ãããªã¯ãšã¹ããå®è¡ããŸãã åŸæ¥ã®REST APIã䜿çšããå Žåããªã¯ãšã¹ãã¯GETãªã¯ãšã¹ãã®åœ¢åŒãåããŸãã GraphQLã䜿çšããå Žåãæ°ããã¯ãšãªæ§æã䜿çšãããŸãã
{ flavors { name } }
ãã®JSONã§ããïŒ ãŸãã¯JavaScriptãªããžã§ã¯ãã§ããïŒ ã©ã¡ãããããŸããã ãã§ã«è¿°ã¹ãããã«ãGraphQLãã¯ãããžãŒã®ååã§ã¯ãæåŸã®2æåQLã¯ãã¯ãšãªèšèªããã€ãŸãã¯ãšãªèšèªãæå³ããŸãã æåéããããŒã¿èŠæ±ãèšè¿°ããããã®æ°ããèšèªã§ãã ããã¯ãã¹ãŠãããªãè€éãªãã®ã®èª¬æã®ããã«èãããŸãããå®éã«ã¯è€éãªããšã¯äœããããŸããã äžèšã®ã¯ãšãªãåæããŠã¿ãŸãããã
{ // , . }
ãã¹ãŠã®èŠæ±ã¯ãã«ãŒãèŠæ±ãã§å§ãŸããèŠæ±ã®å®è¡äžã«ååŸããå¿
èŠããããã®ã¯ãã£ãŒã«ããšåŒã°ããŸãã æ··ä¹±ãé¿ããããã«ããããã®ãšã³ãã£ãã£ããã¹ããŒãã®ã¯ãšãªãã£ãŒã«ãããšåŒã¶ã®ãæé©ã§ãã ãã®ãããªååãããªãã«çè§£ã§ããªããšæãããå Žå-å°ãåŸ
ã£ãŠãã ãã-以äžã§ã¹ããŒã ã«ã€ããŠè©³ãã説æããŸãã ããã§ãã«ãŒãã¯ãšãªã§ã
flavors
ãã£ãŒã«ããèŠæ±ã
flavors
ã
{ flavors { // , flavor. } }
ç¹å®ã®ãã£ãŒã«ãããªã¯ãšã¹ãããå Žåããªã¯ãšã¹ãã«å¿çãããªããžã§ã¯ãããšã«åä¿¡ããå¿
èŠããããã¹ãããããã£ãŒã«ããæå®ããå¿
èŠããããŸãïŒãªã¯ãšã¹ãã«å¿çãããªããžã§ã¯ãã¯1ã€ã ãã§ãããšäºæ³ãããå Žåã§ãïŒã
{ flavors { name } }
çµæã¯ã©ããªããŸããïŒ ãã®ãããªãªã¯ãšã¹ããGraphQLãµãŒããŒã«éä¿¡ãããšã次ã®ãããªé©åãªåœ¢åŒã®é©åãªåçãåŸãããŸãã
{ "data": { "flavors": [ { "name": "The Lazy Person's Movie Theater" }, { "name": "What's Wrong With You Caramel" }, { "name": "Gnarly Chili Lime" } ] } }
äœåãªãã®ã¯ãªãããšã«æ³šæããŠãã ããã ããæç¢ºã«ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®å¥ã®ããŒãžã§ããŒã¿ãååŸããããã«å®è¡ãããå¥ã®ãªã¯ãšã¹ããæ¬¡ã«ç€ºããŸãã
{ flavors { id name description } }
ãã®ãªã¯ãšã¹ãã«å¿ããŠã次ã®ãã®ãååŸããŸãã
{ "data": { "flavors": [ { "id": 1, "name": "The Lazy Person's Movie Theater", description: "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" }, { "id": 2, "name": "What's Wrong With You Caramel", description: "You're a crazy person that likes sweet popcorn. Congratulations." }, { "id": 3, "name": "Gnarly Chili Lime", description: "A friend told me this would taste good. It didn't. It burned my kernels. I haven't had the heart to tell him." } ] } }
ã芧ã®ãšãããGraphQLã¯éåžžã«åŒ·åãªãã¯ãããžãŒã§ãã åããšã³ããã€ã³ãã䜿çšãããªã¯ãšã¹ããžã®åçã¯ããããã®ãªã¯ãšã¹ããå®è¡ãããããŒãžãåããããã«å¿
èŠãªãã®ã«æ£ç¢ºã«å¯Ÿå¿ããŠããŸãã
flavor
ãªããžã§ã¯ãã1ã€ã ãååŸããå¿
èŠãããå Žåã¯ãGraphQLãåŒæ°ãåŠçã§ãããšããäºå®ãå©çšã§ããŸãã
{ flavors(id: "1") { id name description } }
ããã§ã¯ãã³ãŒãå
ã®ãªããžã§ã¯ãã®ç¹å®ã®èå¥åïŒ
id
ïŒãå¿
èŠãªæ
å ±ãå³å¯ã«èšå®ããŸããããã®ãããªå Žåãåçãªèå¥åã䜿çšã§ããŸãã
query getFlavor($id: ID) { flavors(id: $id) { id name description } }
ããã§ãæåã®è¡ã§ã¯ããªã¯ãšã¹ãã«ååãä»ãïŒååã¯ä»»æã«éžæããã
getFlavor
ã¯
pizza
ãããªãã®ã«çœ®ãæããããšãã§ãããªã¯ãšã¹ãã¯åäœãç¶ããŸãïŒããªã¯ãšã¹ããæåŸ
ãã倿°ã宣èšããŸãã ãã®å Žåãã¹ã«ã©ãŒå
ID
ã®èå¥åïŒ
id
ïŒããªã¯ãšã¹ãã«æž¡ãããããšãæ³å®ãããŠããŸãïŒä»¥äžã§åã«ã€ããŠèª¬æããŸãïŒã
ãªã¯ãšã¹ãã®å®è¡æã«éç
id
ãŸãã¯åç
id
ã©ã¡ã
id
䜿çšããããã«é¢ä¿ãªããåæ§ã®ãªã¯ãšã¹ãã«å¯Ÿããå¿çã¯æ¬¡ã®ããã«ãªããŸãã
{ "data": { "flavors": [ { "id": 1, "name": "The Lazy Person's Movie Theater", description: "That elusive flavor that you begrudgingly carted yourself to the theater for, now in the comfort of your own home, you slob!" } ] } }
ã芧ã®ãšããããã¹ãŠãéåžžã«äŸ¿å©ã«é
眮ãããŠããŸãã ãããããããªãèªèº«ã®ãããžã§ã¯ãã§GraphQLã䜿çšããããšãèãå§ããŠããã§ãããã ãããŠããã§ã«èª¬æããããšã¯ãã°ãããããã«èŠããŸãããGraphQLã®çŸããã¯ããã¹ãããããã£ãŒã«ãã§æ©èœããå Žæã§ãããŸãã ãã®ã¹ããŒã ã§ã¯ãããŸããŸãªçš®é¡ã®ãããã³ãŒã³ã®æ é€äŸ¡ã«é¢ããæ
å ±ãå«ã
nutrition
ãšåŒã°ããå¥ã®ãã£ãŒã«ãããããšä»®å®ããŸãã
{ flavors { id name nutrition { calories fat sodium } } }
ããŒã¿ãŠã§ã¢ããŠã¹ã§ã¯ãå
flavor
ãªããžã§ã¯ãã«ãã¹ãããã
nutrition
ãªããžã§ã¯ããå«ãŸããŠããããã«èŠãããããããŸããã ããããããã¯å®å
šã«çå®ã§ã¯ãããŸããã GraphQLã䜿çšãããšãç¬ç«ããŠãããæ¥ç¶ãããŠããããŒã¿ãœãŒã¹ãžã®åŒã³åºããåäžã®ã¯ãšãªã«çµåã§ããŸããããã«ãããããŒã¿ããŒã¹ã鿣èŠåããå¿
èŠãªããåã蟌ã¿ããŒã¿ãæäœãã䟿å©ãªåçãåãåãããšãã§ããŸãã
{ "data": { "flavors": [ { "id": 1, "name": "The Lazy Person's Movie Theater", "nutrition": { "calories": 500, "fat": 12, "sodium": 1000 } }, ... ] } }
ããã«ãããããã°ã©ãã®çç£æ§ãšã·ã¹ãã ã®é床ã倧å¹
ã«åäžããŸãã
ãããŸã§ãèªã¿åãèŠæ±ã«ã€ããŠèª¬æããŠããŸããã ããŒã¿æŽæ°ãªã¯ãšã¹ãã¯ã©ãã§ããïŒ ãããã䜿çšããŠãåãå©äŸ¿æ§ãåŸãããŸããïŒ
GraphQLã®çªç¶å€ç°
GraphQLã¯ãšãªã¯ããŒã¿ãããŒãããŸãããããŒã¿ã«å€æŽãå ããã®ã¯çªç¶å€ç°ã§ãã çªç¶å€ç°ã¯ããŠãŒã¶ãŒããŒã¿ããµãŒãããŒãã£APIã«éä¿¡ãããªã©ãããŸããŸãªã¿ã¹ã¯ã解決ããããã®åºæ¬çãªRPCïŒãªã¢ãŒãããã·ãŒãžã£ã³ãŒã«ïŒã¡ã«ããºã ã®åœ¢ã§äœ¿çšã§ããŸãã
çªç¶å€ç°ãèšè¿°ãããšããã¯ãšãªãçæãããšãã«äœ¿çšããæ§æã«äŒŒãæ§æã䜿çšãããŸãã
mutation updateFlavor($id: ID!, $name: String, $description: String) { updateFlavor(id: $id, name: $name, description: $description) { id name description } }
ããã§ã¯ã
updateFlavor
ãã¥ãŒ
updateFlavor
ã宣èšããããã€ãã®å€æ°
updateFlavor
ã
name
ããã³
description
ãŸãã ã¯ãšãªã®èšè¿°ã«äœ¿çšãããã®ãšåãã¹ããŒã ã«åŸã£ãŠåäœãã
mutation
ããŒã¯ãŒãã䜿çšããŠå€æ°ãã£ãŒã«ãïŒã«ãŒãçªç¶å€ç°ïŒããäœæããããã®åŸã«çªç¶å€ç°ã説æããååãšã察å¿ããããŒã¿å€æŽèŠæ±ã圢æããããã«å¿
èŠãªå€æ°ã®ã»ãããç¶ããŸãã
ãããã®å€æ°ã«ã¯ã倿ŽããããšããŠãããã®ããŸãã¯çºçããããçªç¶å€ç°ãå«ãŸããŸãã ãŸããçªç¶å€ç°ã®åŸãããã€ãã®ãã£ãŒã«ãã®è¿åŽããªã¯ãšã¹ãã§ããããšã«æ³šæããŠãã ããã
ãã®å Žåãã¬ã³ãŒãã倿ŽããåŸããã£ãŒã«ã
id
ã
name
ãããã³
description
ãååŸããå¿
èŠããã
description
ã ããã¯ã楜芳çãªã€ã³ã¿ãŒãã§ã€ã¹ã®ãããªãã®ãéçºããéã«åœ¹ç«ã¡ã倿ŽãããããŒã¿ã倿ŽåŸã«åä¿¡ããèŠæ±ãæºããå¿
èŠããªããªããŸãã
ã¹ããŒããèšèšããGraphQLãµãŒããŒã«æ¥ç¶ãã
ãããŸã§ãGraphQLãã¯ã©ã€ã¢ã³ãäžã§ã©ã®ããã«æ©èœããããããã³ã¯ãšãªãå®è¡ããæ¹æ³ã«ã€ããŠèª¬æããŠããŸããã æ¬¡ã«ããããã®ãªã¯ãšã¹ãã«å¿çããæ¹æ³ã«ã€ããŠèª¬æããŸãã
âGraphQLãµãŒããŒ
GraphQLã¯ãšãªãå®è¡ããã«ã¯ããã®ãããªã¯ãšãªãéä¿¡ã§ããGraphQLãµãŒããŒãå¿
èŠã§ãã GraphQLãµãŒããŒã¯ãéåžžã®HTTPãµãŒããŒã§ãïŒJavaScriptã§èšè¿°ããå ŽåãExpressãŸãã¯Hapiã䜿çšããŠäœæããããµãŒããŒã«ããããšãã§ããŸãïŒãGraphQLãã€ã¢ã°ã©ã ãæ·»ä»ãããŸãã
import express from 'express' import graphqlHTTP from 'express-graphql' import schema from './schema' const app = express() app.use('/graphql', graphqlHTTP({ schema: schema, graphiql: true })) app.listen(4000)
ã¹ããŒã ã«ãåå ãããããšã«ãããã¯ã©ã€ã¢ã³ãããåãåã£ããªã¯ãšã¹ããã¹ããŒã ã«æž¡ãããã®ã¹ããŒã ã«åçãè¿ãã¡ã«ããºã ãæå³ããŸãã ããã¯ç©ºæ°ãéšå±ã«å
¥ã空æ°ãã£ã«ã¿ãŒã®ãããªãã®ã§ãã
ããã£ã«ã¿ãªã³ã°ãã®ããã»ã¹ã¯ãã¯ã©ã€ã¢ã³ããããµãŒããŒã«éä¿¡ãããèŠæ±ãŸãã¯å€æŽã«é¢é£ä»ããããŠããŸãã ã¯ãšãªãšçªç¶å€ç°ã®äž¡æ¹ã¯ãã«ãŒãã¯ãšãªãŸãã¯ã¹ããŒãã®ã«ãŒãçªç¶å€ç°ã§å®çŸ©ããããã£ãŒã«ãã«é¢é£ãã颿°ã䜿çšããŠè§£æ±ºãããŸãã
äžèšã¯ãExpress JavaScriptã©ã€ãã©ãªã䜿çšããŠäœæãããHTTPãµãŒããŒãã¬ãŒã ã¯ãŒã¯ã®äŸã§ãã Facebookã®
express-graphql
ã®
graphqlHTTP
颿°ã䜿çšããŠãã¹ããŒã ããã¢ã¿ããããïŒå¥ã®ãã¡ã€ã«ã«èšè¿°ãããŠãããšæ³å®ïŒãããŒã4000ã§ãµãŒããŒãå®è¡ããŸããã€ãŸããã¯ã©ã€ã¢ã³ãã¯ããã®ãµãŒããŒã®ããŒã«ã«äœ¿çšã«ã€ããŠãã¢ãã¬ã¹
http://localhost:4000/graphql
ã
âããŒã¿åãšãªãŸã«ã
GraphQLãµãŒããŒã®åäœãä¿èšŒããã«ã¯ãã¹ããŒããæºåããã¹ããŒãã«ã¢ã¿ããããå¿
èŠããããŸãã
äžèšã®ã«ãŒãã¯ãšãªãŸãã¯ã«ãŒããã¥ãŒããŒã·ã§ã³ã§ã®ãã£ãŒã«ãã®å®£èšã«ã€ããŠèª¬æããããšãæãåºããŠãã ããã
import gql from 'graphql-tag' import mongodb from '/path/to/mongodb' // - . , `mongodb` MongoDB. const schema = { typeDefs: gql` type Nutrition { flavorId: ID calories: Int fat: Int sodium: Int } type Flavor { id: ID name: String description: String nutrition: Nutrition } type Query { flavors(id: ID): [Flavor] } type Mutation { updateFlavor(id: ID!, name: String, description: String): Flavor } `, resolvers: { Query: { flavors: (parent, args) => { // , args , { id: '1' } return mongodb.collection('flavors').find(args).toArray() }, }, Mutation: { updateFlavor: (parent, args) => { // , args { id: '1', name: 'Movie Theater Clone', description: 'Bring the movie theater taste home!' } // . mongodb.collection('flavors').update(args) // flavor . return mongodb.collection('flavors').findOne(args.id) }, }, Flavor: { nutrition: (parent) => { return mongodb.collection('nutrition').findOne({ flavorId: parent.id, }) } }, }, } export default schema
GraphQLã¹ããŒãã®ãã£ãŒã«ãã®å®çŸ©ã¯ãå宣èšïŒ
typeDefs
ïŒãš
resolver
ã®2ã€ã®éšåã§æ§æãããŠã
resolver
ã
typeDefs
ã¯ãã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããããŒã¿ã®å宣èšãå«ãŸããŠããŸãã ããšãã°ãå
ã»ã©ããµãŒããŒãã
flavor
ãªããžã§ã¯ãã®ãªã¹ããååŸãããªã¯ãšã¹ãã«ã€ããŠèª¬æããŸããã ãµãŒããŒã«åæ§ã®ãªã¯ãšã¹ããè¡ãã«ã¯ã次ã®3ã€ã®æé ãå®è¡ããå¿
èŠããããŸãã
flavor
ãªããžã§ã¯ãããŒã¿ãã©ã®ããã«èŠããããåè·¯å³ã«äŒããŸãïŒäžèšã®äŸã§ã¯ã type Flavor
åºåã®ããã«èŠããŸãïŒãtype Query
ã«ãŒããã£ãŒã«ãã§ãã£ãŒã«ãã宣èšããŸãïŒããã¯type Query
å€ã®flavors
ããããã£ã§ãïŒãtype Query
ã«ãŒããã£ãŒã«ãã§å®£èšããããã£ãŒã«ãã«åŸã£ãŠèšè¿°ãããresolvers.Query
ãªããžã§ã¯ãèªèæ©èœã宣èšãresolvers.Query
ã
次ã«ã
typeDefs
泚ç®ããŸãããã ããã§ã¯ãããŒã¿ã®åœ¢ç¶ã«é¢ããã¹ããŒãæ
å ±ãæäŸããŸãã ã€ãŸããGraphQLã«ã察å¿ããã¿ã€ãã®ãšã³ãã£ãã£ã«å«ãŸããå¯èœæ§ã®ããããŸããŸãªããããã£ã«ã€ããŠäŒããŸãã
type Flavor { id: ID name: String description: String nutrition: Nutrition }
type Flavor
宣èšã¯ã
flavor
ãªããžã§ã¯ãã«ãã¿ã€ã
ID
id
ãã£ãŒã«ãã
String
ã¿ã€ãã®
name
ãã£ãŒã«ãã
String
ã¿ã€ãã®
description
ãã£ãŒã«ã
String
ããã³
nutrition
ã¿ã€ãã®
Nutrition
ãã£ãŒã«ããå«ããããšãã§ããããšã瀺ããŸãã
nutrition
ã®å Žåãããã§ã¯
typeDefs
宣èšãããå¥ã®åã®ååã䜿çšããŸãã ããã§ã¯ã
type Nutrition
ã³ã³ã¹ãã©ã¯ãã¯ããããã³ãŒã³ã®æ é€ããŒã¿åœ¢åŒãèšè¿°ããŠããŸãã
ããã§ã¯ããã®è³æã®åé ã«ããããã«ããããŒã¿ããŒã¹ãã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ãã«ã€ããŠè©±ããŠããããšã«æ³šæããŠãã ããã äžèšã®äŸã§ã¯ãããŒã¿ããŒã¹ããããšæ³å®ããŠããŸãããã¢ããªã±ãŒã·ã§ã³ã®ããŒã¿ã¯ã©ã®ãœãŒã¹ããã§ãååŸã§ããŸãã ãµãŒãããŒãã£ã®APIãŸãã¯éçãã¡ã€ã«ã§ããå¯èœæ§ããããŸãã
type Flavor
宣èšã§è¡ã£ãããã«ãããã§ã¯ã
nutrition
ãªããžã§ã¯ãã«å«ãŸãããã£ãŒã«ãã®ååãæå®ããŸãããããã®ãã£ãŒã«ãïŒããããã£ïŒã®ããŒã¿åãšããŠãGraphQLã§ã¹ã«ã©ãŒããŒã¿åãšåŒã°ãããã®ã䜿çšããŸãã ãã®èšäºã®å·çæç¹ã§ãGraphQLã¯
5ã€ã®çµã¿èŸŒã¿ã¹ã«ã©ãŒããŒã¿åããµããŒãããŠããŸããã
Int
ïŒç¬Šå·ä»ã32ãããæŽæ°ãFloat
ïŒç¬Šå·ä»ãã®å粟床浮åå°æ°ç¹æ°ãString
ïŒUTF-8ã§ãšã³ã³ãŒããããæåã®ã·ãŒã±ã³ã¹ãBoolean
ïŒããŒã«å€true
ãŸãã¯false
ãID
ïŒãªããžã§ã¯ããç¹°ãè¿ãããŒãããããããŸãã¯ãã£ãã·ã¥ã®ããŒãšããŠãã䜿çšãããäžæã®èå¥åã ã¿ã€ãID
å€ã¯æååãšåãæ¹æ³ã§ã·ãªã¢ã«åããID
ã ID
ã¿ã€ããå€ãæã£ãŠããããšã¯ããã®å€ã人ã
ã«è¡šç€ºãããããšãæå³ããŠããããããã°ã©ã ã§äœ¿çšãããããšã匷調ããŠããŸãã
ãããã®ã¹ã«ã©ãŒåã«å ããŠãèªåã§å®çŸ©ããåã«ããããã£ãå²ãåœãŠãããšãã§ããŸãã ããã¯ã
type Flavor
ã³ã³ã¹ãã©ã¯ãã§èª¬æãããŠãã
nutrition
ç¹æ§ã
Nutrition
å²ãåœãŠãããšã§è¡ããŸããã
type Query { flavors(id: ID): [Flavor] }
type Query
ã®ã«ãŒãã¿ã€ãïŒåã«èª¬æãããã«ãŒãã¯ãšãªãïŒãèšè¿°ãã
type Query
æ§é ã§ã¯ãèŠæ±ã§ãããã£ãŒã«ãã®ååã宣èšããŸãã ããã«ããã®ãã£ãŒã«ãã宣èšããããšã«ãããè¿ãããããŒã¿åãšãšãã«ããªã¯ãšã¹ãã«å«ãŸããåŒæ°ãæå®ããŸãã
ãã®äŸã§ã¯ãã¹ã«ã©ãŒå
ID
id
åŒæ°ãåãåãå¯èœæ§ããã
ID
ã ãã®ãããªèŠæ±ã«å¯ŸããåçãšããŠãããã€ã¹ã
Flavor
ã¿ã€ãã®ããã€ã¹ã«äŒŒãŠãããªããžã§ã¯ãã®é
åãæåŸ
ãããŸãã
queryã¯ãšãªã¬ã³ã°ãã€ã¶ãŒã®æ¥ç¶
ã«ãŒã
type Query
ã«ãã£ãŒã«ã
type Query
å®çŸ©ãã§ããã®ã§ããªãŸã«ããŒé¢æ°ãšåŒã°ãããã®ãèšè¿°ããå¿
èŠããããŸãã
ããã¯ãGraphQLãå€ããå°ãªããã忢ãããå Žæã§ããresolvers
ã¹ããŒããªããžã§ã¯ããèŠãŠããã®Query
äžã«ãã¹ãããããªããžã§ã¯ããèŠãflavors
ãšã颿°ãå²ãåœãŠãããŠããããããã£ãèŠãããšãã§ããŸãããã®é¢æ°ã¯ããã£ãŒã«ãã®ãªãŸã«ããšåŒã°flavors
ããã«ãŒãã§å®£èšããtype Query
ãŸãã typeDefs: gql`âŠ`, resolvers: { Query: { flavors: (parent, args) => { // , args { id: '1' } return mongodb.collection('flavors').find(args).toArray() }, }, ⊠},
- .
parent
â , ,
args
, .
context
, . «» ( â , ).
, , . GraphQL « » . , , .
GraphQL , , . JSON-, JSON-, ( GraphQL ).
-
flavors
MongoDB,
args
( )
.find()
, , .
â
-, GraphQL, , , ,
nutrition
. , ,
Nutrition
, , , ,
flavor
. , / .
GraphQL ,
type Flavor
nutrition
type Nutrition
, . , ,
flavor
.
typeDefs: gql` type Nutrition { flavorId: ID calories: Int fat: Int sodium: Int } type Flavor { [âŠ] nutrition: Nutrition } type Query {âŠ} type Mutation {âŠ} `, resolvers: { Query: { flavors: (parent, args) => {âŠ}, }, Mutation: {âŠ}, Flavor: { nutrition: (parent) => { return mongodb.collection('nutrition').findOne({ flavorId: parent.id, }) } }, },
resolvers
, ,
Query
,
Mutation
Flavor
. ,
typeDefs
.
Flavors
, ,
nutrition
-. ,
Flavor
. , : « ,
nutrition
,
type Flavor
».
MongoDB, ,
parent
, -. ,
parent
, , ,
flavors
. ,
flavor
, :
{ flavors { id name nutrition { calories } } }
flavor
,
flavors
,
nutrition
,
parent
. , , , MongoDB,
parent.id
,
id
flavor
, .
parent.id
,
nutrition
flavorId
,
flavor
.
â
, , . , .
type Mutation
, ,
updateFlavor
, , .
type Mutation { updateFlavor(id: ID!, name: String, description: String): Flavor }
: « ,
updateFlavor
id
ID
( ,
!
, GraphQL , ),
name
String
description
String
». , ,
Flavor
( â ,
id
,
name
,
description
, , ,
nutrition
).
{ typeDefs: gql`âŠ`, resolvers: { Mutation: { updateFlavor: (parent, args) => { // , args { id: '1', name: 'Movie Theater Clone', description: 'Bring the movie theater taste home!' } // . mongodb.collection('flavors').update( { id: args.id }, { $set: { ...args, }, }, ) // flavor . return mongodb.collection('flavors').findOne(args.id) }, }, }, }
-
updateFlavor
, : , , â ,
flavor
.
, ,
flavor
. ããã¯ãªãã§ããïŒ
, , . ,
flavor
, .
args
? ã¯ããã§ããŸãã , , , 100% , . , , , , , .
GraphQL?
, , , , , GraphQL-API.
, GraphQL , . , . , . , , , GraphQL REST . , , , GraphQL.
â ,
, HTTP-, , , , â . GraphQL , , , , ( ).
, , ( â ), GraphQL .
â , ,
, , « ». , , , . . GraphQL .
â ,
REST API, : , . , -, iOS Android, API . , , , , « » .
, , , HTTP, API (, , ).
â GraphQL â ? REST API GraphQL?
ãããããã¡ããã§ãã . , , GraphQL . GraphQL, . , , , . , , .
, GraphQL , , , . GraphQL , Apollo Relay, .
GraphQL â , , .
graphql
(
express-graphql
, ) â . , GraphQL - . , -, , , , .
ãŸãšã
, GraphQL , . GraphQL , , , . , , , , GraphQL.
, : GraphQL . GraphQL . , GraphQL, , , , , , , .
â , GraphQL â , , . GraphQL , . , GraphQL â , , , . . , , , , , , GraphQL.
芪æãªãèªè
ïŒ GraphQL â , .
