GraphQL

来源:https://www.cnblogs.com/taotaozhuanyong/archive/2019/12/25/11928819.html
-Advertisement-
Play Games

一、GraphQL簡介 1、什麼是GraphQL? GraphQL官網:https://graphql.org/,這個是英文的,https://graphql.js.cool/這個是中文的。 GraphQL是一種用於API的查詢語言。GraphQL 既是一種用於 API 的查詢語言也是一個滿足你數據 ...


一、GraphQL簡介

1、什麼是GraphQL?

  GraphQL官網:https://graphql.org/,這個是英文的,https://graphql.js.cool/這個是中文的。

  GraphQL是一種用於API的查詢語言。GraphQL 既是一種用於 API 的查詢語言也是一個滿足你數據查詢的運行時。 GraphQL 對你的 API 中的數據提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的數據,而且沒有任何冗餘,也讓 API 更容易地隨著時間推移而演進,還能用於構建強大的開發者工具。

  GraphQL與資料庫、存儲技術和開發語言、框架無關。GraphQL的服務也不限定使用的傳輸技術,但是通長是使用HTTP(S)來傳輸。

  嵌套查詢,查詢是可以嵌套的,一次請求,獲得多個類型的數據,無需繼續鑽取數據,客戶端不會收到不需要的數據屬性。

  每當對GraphQL伺服器進行查詢的時候,都會使用類型系統進行驗證。

  在Schema里定義類型:

  GraphQL通長被稱作是“聲明式數據獲取語言”。

  GraphQL的設計原則:

    層次結構性、以產品為中心、強類型、客戶端定製查詢、內省(Introspective)

2、GraphQL的歷史

  源自Facebook,2012年Facebook開始開發,2015年開源

3、GraphQL和REST

  至於REST的一些概念,開源參考一下之前的一篇隨筆,點擊這裡

  前面提到GraphQL可以理解為基於RESTful的一種封裝,目的在於構建使Client更加易用的服務,可以說GraphQL是更好的RESTful設計。在過去的十多年中,REST已經成為設計web api的標準(雖然只是一個模糊的標準)。它提供了一些很棒的想法,比如無狀態伺服器和結構化的資源訪問。然而REST api表現得過於僵化,無法跟上訪問它們的客戶的快速變化的需求。 GraphQL的開發是為了應付更多的靈活性和效率,它解決了與REST api交互時開發人員所經歷的許多缺點和低效之處。 為了說明在從API獲取數據時REST和GraphQL之間的主要區別,讓我們考慮一個簡單的示例場景:在blog應用程式中,應用程式需要顯示特定用戶的文章的標題。同一屏幕還顯示該用戶最後3個關註者的名稱。REST和GraphQL如何解決這種情況?

  使用REST API來現實時,我們通常可以通過訪問多次請求來收集數據。比如在這個示例中,我們可以通過下麵的三步來實現:

1、 通過 /user/<id>獲取初始用戶數據

2、 通過/user/<id>/posts 返回用戶的所有帖子

3、 請求/user/<id>/followers,返回每個用戶的關註者列表

調用關係如下圖所示:

 

 

 如果用GraphQL的話,我們只需要一次請求就可以完成上述的需求:

 

 

  在GraphQL的世界里我們不用多取數據,也不用擔心數據取少了,我們只需要按需獲取即可。

  REST最常見的問題之一是API的返回數據過多或者過少,這是因為客戶端下載數據的唯一方法是通過訪問返回固定數據結構的endpoint,這就會導致我們設計API非常困難,因為它既要能夠為客戶提供精確的數據需求,又需要滿足不同調用者的需求,這本身就是相互矛盾的。GraphQL的發明者Lee Byron提出了一個很重要的概念: “用圖形來思考,而不是endpoint”。

可以使用GraphQL管理REST端點

 

 

   GitHub的API有四個版本,第三個版本使用REST,第四個就是用的GraphQL。https://developer.github.com/v4/explorer/

二、圖論(GraphQL Theory)

  圖論就是研究圖的,圖開源用來表示一組關聯的對象。可以把圖看作是一個包含數據點和連接的對象。例如:人機關係圖、家譜、公交線路圖

 

 

  這是一個無序圖,一個圖包含:

  1、頂點Vertices

  2、邊Edge

  3、G=(V,E)

    G:圖

    V:頂點

    E:邊

  上圖中:

    Vertices={1,2,3,4}

    Edge={{1,2},{1,3},{1,4,},{2,4},{3,4}}

   有向圖:

 

 

   有向圖的邊有箭頭

  Vertices={1,2,3,4}

  Edges=({1,2},{1,3},{3,4})

  Graph=({1,2,3,4},{1,2},{1,3},{3,4})

  當有向圖的序對改變了,圖就變了

  

 

   圖就變成了Graph=({1,2,3,4},{4,3},{3,1},{1,2})

  樹形圖也是圖,比如HTML的結構、二叉樹

 

 

 

 三、Query(查詢)&Mutation(修改)

  這裡是Git上面的一個API,可以進行簡單的使用https://developer.github.com/v4/explorer/,需要先登錄才可以。

1、GraphQL VS SQL

  SQL查詢資料庫;GraphQL查詢API

  SQL的數據存在數據表裡;GraphQL的數據可以存放在任何地方

  SQL使用SELECT查詢數據;GraphQL使用Query

  SQL使用INSERT、UPDATE、DELETE來修改數據;GraphQL使用Mutation修改數據

  GraphQL還可以進行訂閱(通過socket)

2、查詢Query

  GraphQL的請求,GraphQL查詢的內容通過HTTP POST的Body發送給GraphQL端點。   

 

   查詢就是從API獲取數據,它表示了你想從GraphQL伺服器獲取的數據;通過欄位(field)來請求查詢的數據;這些欄位和查詢結果的JSON響應的欄位對應。

  GraphQL查詢錯誤:

    成功查詢的JSON結果裡面包含一個data欄位,不成功的查詢結果裡面包含一個errors欄位,裡面有具體的錯誤信息。JSON相應結果可同時包data和errors欄位。

 

 errorTest這個地段是吧存在的,所以在後面會包含一個errors欄位,裡面有具體的錯誤信息。

  Query是GraphQL的一個類型,叫做根類型,因為它映射的事一個操作,而操作則代表著查詢文檔的根節點。

  查詢可用的欄位是在schema裡面定義的;可用查看文檔

 

 

 

 使用ALT+Space,可用顯示參數

 

 

 GraphQL修改和查詢很像,就是意圖不同。

GraphQL欄位類型:

  Scalar Type:Int、String、Float、Boolean、ID

  Object Type

GraphQL片段Fragments

  Fragments就是可用服用的選擇集

    

 

 片段(Fragments):

  假設我們的app有比較複雜的頁面,講正反派主角及其友軍分為兩撥。你立馬就能想到對應的查詢會變得複雜,因為我們需要將一些欄位重覆至少一次——兩房各一次作比較。

  這就是為何GraphQL包含了稱作片段的可復用單元,片段使你能夠阻止一組欄位,然後在他們需要的地方引入,下麵的例子展示瞭如何使用片段解決上述場景:

 

 GraphQL聯合類型Union Type

如果你想返回不止一種類型,那麼您可以使用Union Type

 

 GraphQL介面Interface

 

 2、修改Mutation

  Mutation也是根對象類型,Mutation和Query很像,有名字、可以有返回的選擇集,不同之處就是Mutation會修改後臺數據的狀態。

 

 GraphQL查詢變數:

  代替寫死的參數值,可以動態賦值,使用$開頭。

3、訂閱Subscription

  Subscription允許我們監聽GraphQL API的實時數據變化,Subscription也是根類型,通過WebSocket,與Query和Mutation不同,Subscription保持鏈接打開狀態,如果想停止監聽,需要取消訂閱。

 

 4、內省Introspection

  一個非常強大的特性,Introspection可以讓你查詢當前API的schema,查詢可用類型:_schema,查詢類型明細:_type

 

 5、抽象語法樹Abstract Syntax Trees

  抽象語法樹AST,查詢文檔是字元串,查詢時被解析成AST,併在每個操作運行前進行嚴重,AST是要給層次結構的對象,代表了查詢,每一個操作都會被解析成AST(很重要)

四、Schema和Types

1、Schema是什麼

  GraphQL會改變你進行設計的過程,使用REST的時候,可以把你的API看作是一組REST端點,而在GraphQL里你把你的API看作成是一組類型,為你暴露的API定義的這組數據類型就叫做Schema。

  設計Schema:

    Schema First:使前後端團隊在數據類型上保持一致

    GraphQL使用SDL(Schema Definition Language)語言來定義Schema,無論使用什麼開發語言或者框架GraphQL的SDL都是一樣的,GraphQL的Schema就是定義了可用類型的文本文檔,它被客戶端和伺服器端來驗證GraphQL請求。

2、定義Types

  GraphQL Schema的核心就是類型(Type),一個類型代表著一個自定義的對象,而這些對象則代表 了你的核心特征,類型有欄位(Field),它代表了關聯每個對象的數據,每個欄位都會返回一個特定的數據類型。Schema就是類型定義的集合,Schema定義文件的尾碼名通常是.graphql

  類型定義:

    例子:嘆號表示不能為null

 

   Scalar Type標量類型:

    內置Int、Float、String、Boolean、ID

    可以自定義Scalar Type,Scalar Type不是對象類型,它沒有欄位,例如:

 

   Enum枚舉類型:

    枚舉類型也是標量類型,它可以返回一組字元串中的一個值,例如:

 

 3、Connections和List

  創建Schema時,可以定義返回一個由任意Graph類型組成的列表,例如:[String]、[User],列表頁可以由不同的類型組成,使用Union Type或者Interface Type,[Int]、[Int!]、[Int]!、[Int!]!的區別

  一對一連接

    圖論里,兩個對象之間的連接叫做邊(Edge),而由一個對象連接到另外一個對象的連接就是一對一的連接

 

   一對多連接

    要儘量報紙GraphQL服務的無向性,也就是說可以從圖的任何一個定點開始遍歷;針對上例,添加一條從User類型回到Photo的路徑:

 

 

 

   多對多連接

    例如標簽操作Tagging

    

 

     多對多連接,需要在雙方類型里都添加List欄位,一個多對多連接由兩個一對多連接組成

 

     創建多對多連接時,由時需要保存關係本身,這時就需要通過類型(Through Type),把邊(Edge)定義為一個自定義對象類型,相當於連接兩個節點的節點。由不同類型組成邊的列表,GraphQL里的列表不一定非得是同一種理性,使用Union Type,Interface結合Fragment可以達到此目的。

Union Type

  Union Type,我們可以用它返回多種類型中的一種類型

 

 Interface:

  為了保證某些類型必須包含特定的欄位,我們可以使用介面Interface

 

 4、Arguments參數

  GraphQL里的任何欄位都可以由Arguments,Arguments必須有類型,這個類型應該是hischema中已經定義好的標量類型或者對象類型

 

   過濾數據:

    Arguments吧一定非得是費控的,使用可控欄位可以添加可選參數(optional arguments/optional parameters)

 

   翻頁;

    要實現翻頁功能至少需要兩個可選參數(optional arguments),首先需要設定當前頁一次性返回的條目數(first、pageSize.....),然後還要設定從哪個位置開始獲取這些數據(start,pageIndex......)

 

   排序:

    方法有很多,可以使用enum來決定哪個欄位可以用來排序

 

 5、Mutation修改

  Mutation也在schema裡面定義,技術上Mutation和Query沒有區別,只是他們的意圖不同,Mutation是用來修改狀態的,Mutation的名稱里應該包含動詞。

 

 6、Input Types輸入類型

  Query和Mutation的參數可能會很多,這時最好使用Input Type來整理單數(arguments),Input Type和GraphQL里的對象類型很像,但是它只能用作輸入參數,Input Type可以用作於任何子墩

 

 7、Return Types返回類型

  Schema里所有的欄位都可以返回定義好的主類型,但有時候需要返回一些關於查詢和修改的元信息,這時就可以創建一個返回類型。

 

 8、Subscription訂閱

  Subscription類型和GraphQL的SDL里的其他類型也沒有什麼區別,在自定義對象類型的子墩上定義可用的Subscriptions。Subscription可用有參數

 

 9、Schema文檔

  編寫Schema的時候,可以為每個欄位添加一些描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在windows上運行tensorflow的時候,出現很多stderr 的信息,干擾了正常的輸出;所以我們需要使用操作把這些輸出屏蔽: 參考鏈接:https://support.microsoft.com/en-us/help/110930/redirecting-error-messages- ...
  • 一、問題描述 打開Word提示 很抱歉此功能看似已中斷,並需要修複。請使用Windows控制面板中的“程式和功能”選項修複Microsoft Office。 二、解決方法 運行 regedit 進入註冊表編輯器 定位到HKEY_CURRENT_USER \ SOFTWARE \ Microsoft ...
  • 本文章主要是用來索引,分散式系統中相關的鏈接: http://sortbenchmark.org/ 保持更新,資源來源自網路;更多內容請關註 cnblogs.com/xuyaowen; ...
  • 保護模式下三個重要的系統表——GDT、LDT和IDT 這裡主要是解釋中斷描述符表 中斷描述符表IDT將每個異常或中斷向量分別與它們的處理過程聯繫起來。與GDT和LDT表類似,IDT也是由8位元組長描述符組成的一個數組。與GDT不同的是,表中第一項可以包含描述符。為了構成IDT表中的一個索引值,處理器把 ...
  • -- BI EMAIL declare @CC varchar(10),@MAIL varchar(500), @str varchar(800),@year varchar(4),@month varchar(2);declare @file_name varchar(50);declare @m ...
  • 大數據開發獨攬大權 大數據技術很早就在BAT這些公司生根發芽,但直到14、15年大數據技術才廣泛應用在各大互聯網公司,大數據技術由此深入各行各業。 此時大數據開發人才非常緊缺,很多公司大數據從立項,到大數據平臺構建,到項目整個流程開發,到後期大數據項目的運維,都是由大數據開發人員一手完成(此時少有專 ...
  • MySQL簡介:MySQL是開源免費的資料庫,小型的資料庫.已經被Oracle收購了.MySQL5.5版本之後都是由Oracle發佈的版本,MySQL之前被SUN公司收購,而SUN公司現在又被Oracle公司收購,所以現在MySQL也是屬於Oracle旗下的一款產品。 1.什麼是MySQL? 維基百 ...
  • JDBC核心技術 講師:宋紅康 微博:尚矽谷 宋紅康 第1章:JDBC概述 1.1 數據的持久化 持久化(persistence): 把數據保存到可掉電式存儲設備中以供之後使用 。大多數情況下,特別是企業級應用, 數據持久化意味著將記憶體中的數據保存到硬碟 上加以”固化” ,而持久化的實現過程大多通過 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...