2015Ä꣬ Facebook¿ªÔ´GraphQL?¡£ ´Ëºó£¬ËüÔÚÇ°¶ËWebÖдóÊÜ»¶Ó¡£?´«Í³µÄREST APIÓкβ»×㣿GraphQLÓÅÊƺÎÔÚ£¿ÔÚ±¾ÎÄÖУ¬?ÎÒÃǽ«ÉîÈë̽ÌÖGraphQLµÄÉè¼ÆÔÔò£¬±È½Ï GraphQL Óë REST µÄÒìͬ£¬²¢ÌÖÂÛGraphQL Ïà¶ÔÆäËû¼Ü¹¹µÄÓŵ㡣
1?ÄãµÄ API Ó¦¸ÃÓÃÄÄÏî¼¼Êõ£¿
×Ô´Ó 2015 Äê Facebook ¿ªÔ´ GraphQL ¹æ·¶ÒÔÀ´£¬Ëü¾ÍÔÚÇ°¶Ë Web ¿ª·¢ÖÐѸËÙÁ÷ÐÐÆðÀ´¡£
ÎÒÃǽ«ÌÖÂÛ GraphQL µÄÉè¼ÆÔÔò£¬±È½Ï GraphQL Óë REST ÖеÄÏàͬÇëÇ󣬲¢ ÉîÈë̽ÌÖ GraphQL Ïà¶ÔÆäËû¼Ü¹¹µÄÓŵã?¡£
ΪÀí½â GraphQL ×÷Ϊ API ¼Ü¹¹µÄºÃ´¦£¬ÎÒÃÇÒªÌÖÂÛ API ÔÚ¿Í»§¶Ë - ·þÎñÆ÷½á¹¹ÖеÄ×÷Óá£API£¨Ó¦ÓóÌÐò±à³Ì½Ó¿Ú£©ÊÇÒ»¸öÖмä²ã£¬ËüÔÊÐí·þÎñÆ÷´Ó¿Í»§¶Ë½ÓÊսṹ»¯Êý¾ÝÇëÇ󣬲¢Õë¶ÔÇëÇóµÄÊý¾Ý·¢Ëͽṹ»¯µÄÏìÓ¦¡£Éè¼Æ API ¼Ü¹¹µÄ·½·¨ÓкܶàÖÖ¡£
ÈÃÎÒÃÇÀ´Ñо¿Ò»Ï´Ùʹ GraphQL ÊʺÏÏÖ´ú»¯ Web Ó¦ÓóÌÐòµÄÖØÒª»ù±¾Éè¼ÆÔÔò¡£
2?GraphQL ·þÎñÆ÷µÄÉè¼ÆÔÔò
GraphQL ¹æ·¶¸ÅÀ¨ÁË 5 ¸öÉè¼ÆÔÔò£¬ÕâʹÆä³ÉΪÏÖ´úÇ°¶Ë¿ª·¢µÄÁ¼ºÃ½â¾ö·½°¸¡£?ÎÒÃÇ¿´Ò»Ï GraphQL µÄÉè¼ÆÔÔò£¬²¢ÒÔ Facebook ÐÂÎÅÍÆËÍ×÷ΪÎÒÃǵÄÓÃÀý¡£
ΪÌÖÂÛÏò GraphQL µÄת±ä£¬ÒÔ¼°ÕâЩÉè¼ÆÔÔòÈçºÎ¸ø¿ª·¢´øÀ´ºÃ´¦¡£
ÎÒÃÇÊ×ÏÈÉîÈëÁ˽⴫ͳµÄ REST API ¼Ü¹¹ºÍËüµÄ²»×ãÖ®´¦¡£
3?´«Í³µÄ RESTful ¼Ü¹¹
REST ¼Ü¹¹µÄÉè¼Æ·¶Ê½²àÖØÓÚ·ÖÅä HTTP ÇëÇó·½·¨£¨GET¡¢POST¡¢PUT¡¢PATCH¡¢DELETE£©ºÍ URL ¶ËµãÖ®¼äµÄ¹Øϵ¡£
ÔÚ REST ¼Ü¹¹ÖУ¬·½·¨ºÍ¶ËµãµÄÿ¸ö×éºÏµÃµ½²»Í¬µÄ·â×°¹¦ÄÜ¡£Èç¹û¿Í»§¶ËÐèÒªµÄÊý¾ÝÌض¨¶Ëµã / ·½·¨²»Ìṩ£¬Ôò¿ÉÄÜÐèÒª¶îÍâÇëÇó¡£´Ó REST ÇëÇ󷵻صÄÊý¾Ý¸ñʽÒÀÀµÓڶ˵㡪²»Äܱ£Ö¤ÕâЩÊý¾Ý»á°´ÕÕÇ°¶ËÐèÒªµÄ·½Ê½½øÐиñʽ»¯¡£ÎªÊ¹ÓÃÀ´×ÔÏìÓ¦µÄÊý¾Ý£¨¸ñʽÓëȱʡÇé¿öÏ´Ӷ˵㷵»ØµÄ¸ñʽ²»Í¬£©£¬±ØÐëÔÚ¿Í»§¶Ë±àдÊý¾Ý½âÎöºÍÊý¾Ý²Ù×÷¡£
½ÓÏÂÀ´£¬ÈÃÎÒÃÇ¿´¿´ GraphQL ¹æ·¶Óë REST µÄ²»Í¬Ö®´¦£¬ÒÔ¼°ËüµÄÓŵ㡣ÕâЩÓŵãʹÕâ¸öмܹ¹³ÉΪÌرðÊʺϽâ¾ö¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼äÊý¾Ý½»¸¶ÎÊÌâµÄ½â¾ö·½°¸¡£
4?GraphQL ¼Ü¹¹
Óë RESTful API Ò»Ñù£¬GraphQL API Éè¼ÆÓÃÓÚ´¦Àí HTTP ÇëÇ󲢶ÔÕâЩÇëÇóÌṩÏìÓ¦¡£ÎÞÂÛÈçºÎ£¬Õâ¾ÍÊÇÏàËÆÖ®´¦¡£REST API ¹¹½¨ÔÚÇëÇó·½·¨ºÍ¶ËµãÖ®¼äµÄÁ¬½ÓÉÏ£¬¶ø GraphQL API ±»Éè¼ÆΪֻͨ¹ýÒ»¸ö¶Ëµã£¬Ê¼ÖÕʹÓà POST ÇëÇó½øÐвéѯ£¬Æä URL ͨ³£ÊÇ yourdomain.com/graphql¡£
ÇëÇóµ½´ï GraphQL ¶Ëµãºó£¬¿Í»§¶ËÇëÇóµÄÔغÉÍêÈ«ÔÚÇëÇóÌåÖд¦Àí¡£Õâ¸öÇëÇóÌå±ØÐë×ñÑ GraphQL ¹æ·¶£¬API ±ØÐëÓÐÊʵ±µÄ·þÎñÆ÷¶ËÂß¼À´´¦ÀíÕâЩÇëÇó²¢ÌṩÊʵ±µÄÏìÓ¦¡£
ÕâÌṩÁË±È RESTful API ¸üÁ÷³©µÄ¿Í»§¶ËÌåÑ飬ºóÕß¿ÉÄÜÒªÇó¿Í»§¶ËÕë¶Ô¶à¸öÊý¾Ý¿é·¢³ö¶à¸öÇëÇ󣬲¢ÔÚÊý¾Ý·µ»Øºó½øÐвÙ×÷¡£
ΪÁ˲ûÃ÷ GraphQL ÊÇÈçºÎʵÏÖÕâÒ»µãµÄ£¬ÈÃÎÒÃÇ·Ö½âһϠGraphQL ·þÎñÆ÷µÄ½á¹¹¡£
5?GraphQL ·þÎñÆ÷
ÆôÓà GraphQL Âß¼µÄ·þÎñÆ÷¶ËÂß¼Óɶ¨ÒåÁË·þÎñÆ÷¹¦ÄÜµÄ Documents ×é³É¡£ÕâЩ Documents °üº¬¿ÉÖ´ÐÐÎļþºÍÀàÐÍϵͳ¶¨Òå¡£¹ËÃû˼Ò壬ÀàÐÍϵͳ¶¨ÒåΪÿ¸öÊý¾Ý×ֶζ¨Òå¿É½ÓÊܵÄÀàÐͺ͸ñʽÊäÈë¼°½á¹û¡£
¿ÉÖ´ÐÐÎļþ°üº¬Òª´¦ÀíµÄ¿ÉÄܵIJÙ×÷ÁÐ±í£¬ÆäÖаüÀ¨²Ù×÷ÀàÐÍ£¨²éѯ¡¢Ð޸Ļò¶©ÔÄ£©¡¢²Ù×÷Ãû³Æ¡¢Òª²éѯ»òдÈëµÄ×ֶκÍÒ»¸öÑ¡Ôñ¼¯£¬¸ÃÑ¡Ôñ¼¯×¼È·¶¨ÒåÁ˽«´Ó²Ù×÷·µ»ØµÄÊý¾Ý¡£Ñ¡Ôñ¼¯ÊÇ GraphQL µÄ×î´ó¼ÛÖµËùÔÚ¡ª¡ªËüÃÇÔÊÐí¿Í»§¶Ë²éѯÌض¨µÄÊý¾Ý¼¯²¢½ÓÊÕ°üº¬ËùÇëÇóÐÅÏ¢µÄÏìÓ¦£º²»¶à²»ÉÙ¡£
GET?/graphql?query={?books(id:12)?{?authors?{?firstName,?lastName?}?title,?yearPublished,?length?}???{?????Query?{?????????????????//??operation?type????books?(id:12)?{?????????//??operation?endpoint???????authors?{????????????//??requested?fields??????????firstName??????????lastName???????}????????title???????yearPublished??????????}????}??}?
ÓÐ¹Ø GraphQL ¹æ·¶µÄ½á¹¹ºÍÓï·¨µÄ¸ü¶àÐÅÏ¢£¬Çë²ÎÔÄ GraphQL µÄÎĵµ¡£(https://graphql.github.io/graphql-spec/June2018/#sec-Overview)
½ÓÏÂÀ´£¬ÎÒÃǽ«¿´Ï GraphQL ÖвéѯµÄ½á¹¹¡£
6?GraphQL ²éѯ½âÎö
ÏÂÃæÊÇÒ»¸ö½á¹¹»¯µÄ GraphQL ²éѯ£¬ÓÃÓÚ»ñÈ¡Ìض¨Êé¼®µÄÊý¾Ý£¬°üÀ¨×÷ÕßµÄÐÕºÍÃû
GET?/graphql?query={?books(id:12)?{?authors?{?firstName,?lastName?}?title,?yearPublished,?length?}??{??Query?{?????????????????//??operation?type??books?(id:12)?{?????????//??operation?endpoint??authors?{????????????//??requested?fields??firstName??lastName??}??title??yearPublished??}??}??}?
ÕâÒ»Çж¼¿ÉÒÔͨ¹ýÒ»¸ö²éѯÓÉ GraphQL ·þÎñÆ÷Âß¼½âÎöºÍ´¦ÀíÍê³É¡£µ±°ÑËüÓë REST ¼Ü¹¹ÖÐÏàͬ½á¹¹µÄÇëÇó½øÐбȽÏʱ£¬GraphQL µÄÓÅÊƾͿªÊ¼ÏÔÏÖ³öÀ´ÁË¡£
ÈÃÎÒÃÇ¿´¿´ÏÂÃæµÄ REST ÇëÇó½á¹¹£¬È»ºóÖصãÌÖÂÛÆäÖеÄһЩ²îÒ죡
7?REST ÇëÇó½âÎö
ÒªÏò REST API ·¢³öÏàͬµÄÇëÇ󣬿ͻ§¶ËÊ×ÏÈÐèÒªÏòÄܹ»·µ»ØͼÊéÊý¾ÝµÄ¶Ëµã·¢ËÍÒ»¸öÇëÇ󣬲¢½«Í¼Êé id ×÷Ϊ²ÎÊý´«È룺
GET?/books/12?
Õâ¸öÇëÇó¿ÉÄܻ᷵»ØÒ»¸ö°üº¬Ìض¨Í¼ÊéËùÓÐÊý¾ÝµÄ¶ÔÏó£¬ÀýÈ磺
{??"title"?:?"The?Hitchhiker's?Guide?to?the?Galaxy",??"authorID":?42,??"yearPublished"?:?1978,??"length":?208,??"genre":?"Science?Fiction"??}?
ÔÚÎÒ?ÃǵÄÀý×ÓÀÓëÏàͬµÄ GraphQL ²éѯÏà±È£¬¸ÃÏìÓ¦ÓÐÁ½¸öȱµã£º
ΪÁË»ñµÃÕâЩÊý¾Ý£¬ÎÒÃÇÐèҪʹÓÃÎÒÃÇµÄ authorID ·¢³öÒ»¸ö¶îÍâµÄÇëÇó£º
GET?/authors/42?
Õâ¸öÇëÇóµÄÏìÓ¦Ó¦¸Ã°üº¬ÎÒÃÇÕýÔÚ²éÕÒµÄËùÓÐÊý¾Ý£º
{???"firstName":?"Douglas",???"lastName":?"Adams"?}?
ÏÖÔÚÎÒÃÇÒѾÓÐÁËÐèÒªµÄËùÓÐÊé¼®ºÍ×÷ÕßÊý¾Ý£¬ÏìÓ¦½âÎöÓÉ¿Í»§¶ËÍê³É¡£ÏÖÔÚ£¬Ç°¶ËÓ¦ÓóÌÐò±ØÐ뽫À´×Ô²»Í¬¶ËµãµÄÊý¾Ý×éºÏÔÚÒ»Æð£¬ÓÃÓÚʵÏÖÆÚÍûµÄ¹¦ÄÜ¡£×ܵÄÀ´Ëµ£¬Óë REST API Ïà±È£¬GraphQL ÌṩµÄÐÔÄÜÓÅÊÆ¿ÉÒÔΪǰ¶Ë¿ª·¢ÈËÔ±´øÀ´»Ø±¨¡£Ê¹Óà GraphQL ¹æ·¶´´½¨·þÎñÆ÷¿ÉÄÜÐèÒª¸ü¶àµÄÉèÖÃÒÔ¼°±àдԤ²âÐԵķþÎñÆ÷¶ËÂß¼À´½âÎöºÍ´¦ÀíÇëÇó¡£
ËäÈ» GraphQL µÄÉèÖóɱ¾¿ÉÄܱȴ«Í³µÄ REST ¼Ü¹¹Òª¸ß£¬µ«ÊÇ£¬¸üÒ×ÓÚά»¤µÄ´úÂë¡¢½¡×³µÄ¿ª·¢¹¤¾ßºÍ¾«¼òµÄ¿Í»§¶Ë²éѯËù´øÀ´µÄºÃ´¦Í¨³£»á³¬¹ý³É±¾¡£
ÁìȡרÊô 10ÔªÎÞÃż÷ȯ
˽Ïí×îР¼¼Êõ¸É»õ