日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

让ASP.NET Core支持GraphQL之-GraphQL的实现原理

發布時間:2023/12/4 asp.net 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让ASP.NET Core支持GraphQL之-GraphQL的实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

眾所周知RESTful API是目前最流行的軟件架構風格之一,它主要用于客戶端和服務器交互類的軟件。基于這個風格設計的軟件可以更簡潔,更有層次,更易于實現緩存等機制。
RESTful的優越性是毋庸置疑的,不過GraphQL也可以作為一種補充,讓你的服務既支持RESTful的http調用,也容許客戶端通過GraphQL支持的聲明式語法調用服務。
本篇文章并不想對比RESTful和GraphQL孰輕孰重,或者那種方式更好,相關比較可以參考GraphQL的前世今生。本文旨在介紹如何在ASP.NET Core應用中引入GraphQL,讓你的應用既支持RESTFul,也能支持GraphQL。


Web應用程序是如何工作的

如果說一個Service能夠提供一個功能,那么我們就可以給Service一個輸入,從而得到一個輸出。

如果將若干個Service組合在一起形成一個應用程序,那么這個應用程序就可以提供若干個能力,當一個框架分別就輸入和輸出進行統一的約定和規范時,也就是人們常說的SOAP,RESTful等技術。

對于RESTful來說,輸入就是Http request,輸出是一個json格式的字符串。而Web應用程序框架在做什么?根據某個輸入(request),找到對應的controller, 擊中合適的action,同時將Request綁定為action方法的參數,最后將結果格式化為json字符串并輸出。

GraphQL就是跟Web框架同一級別的技術,只不過輸入(input)不再是Http request,而是GraphQL特有的語法結構,輸出仍然為json字符串。

GraphQL能夠做些什么

既然GraphQL是一種可以代替RESTful的技術,那么你一定很想知道他是怎么做到的。 如果能用一句話總結那就是: GraphQL是一種API資源的查詢語言。GraphQL通過下面的三種類型來滿足用戶的需求:

1. 查詢

我們都知道用戶的請求可以分為兩類:Query和Command,Query用于查詢資源,調用一次和多次都不會影響資源的狀態,一個簡單的查詢如下:

query {hero {idname} }

上面的查詢語言可以理解為:查詢hero資源的"id"和"name“屬性

2. mutation

所謂mutation就是Command,意味著該用戶請求能夠改變服務端的狀態,一個簡單的mutation如下:

mutation ($human:HumanInput!) {createHuman(human: $human) {idname} } variables: {"human": {"name": "Boba Fett","homePlanet": "Kamino"}}

上面的mutation可以理解為創建一個humman對象,輸入對象是一個$human變量,最后把創建對象的`”id"和"name"屬性查詢出來。可以看出mutation一般都要配合一個變量使用,變量需要在"variables"中單獨定義。

3. Subscriptions

Subscriptions用于提供類似websocket的功能,GraphQL Server是一個實現了Apollo GraphQL訂閱協議的.NET Core服務器. 下面的例子需要同時打開兩個瀏覽器窗口:
Subscription用戶訂閱聊天消息:

subscription MessageAdded {messageAdded {from { id displayName }content} }

Mutation用戶添加聊天內容:

mutation AddMessage($message: MessageInputType!) {addMessage(message: $message) {from {iddisplayName}content} }variables: {"message": {"content": "Message","fromId": "1"} }


GraphQL是如何實現的

我在用每一個開源框架或者類庫時都習慣于先瀏覽源碼,了解整個源碼的大概結構和實現。下面的過程以一個簡單的查詢為例,分析GraphQL的實現原理:

{query test {user{age}} }

通過graphQL browser IDE發送請求:GrpahQL處理的整個過程如下:

1.客戶端將上面的GraphQL query通過http發送到服務端
curl 'http://localhost:5000/graphql' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: http://localhost:5000' --data-binary '{"query":"# Write your query or mutation here\nquery test{\n user{\n age\n }\n}\n"}' --compressed
2. 整個Request以json的格式發送到了服務端,服務端將Request反序列化為GraphQLRequest類型:
public class GraphQLRequest {[JsonProperty("query")]public string Query { get; set; }[JsonProperty("variables")]public JObject Variables { get; set; }[JsonProperty("operationName")]public string OperationName { get; set; }public Inputs GetInputs(){return GraphQLRequest.GetInputs(this.Variables);} }

針對上面的例子,實際上只有string Query屬性被反序列化為”"# Write your query or mutation here\nquery test{\n user{\n age\n }\n}\n"“

3.服務端解析Query,解析Query的過程是一個語法分析的過程,通過Paser將Query解析為AST:
var source = new Source(body);var result = _parser.Parse(source);

Parse后的結果是一個Document類:

public class Document : AbstractNode {public string OriginalQuery { get; set; }public Operations Operations { get; }public Fragments Fragments { get; } }

本例的Query將會被解析為一個Operations,一個Operations將包含若干個有層次結構的Operation,解析Query的目的是為了知道客戶端要查詢user.Age這個屬性。

4.有了一個Parse后的Document,接下來的工作將有DocumentExecuter來完成,DocumentExecuter定義了整個調用服務端資源的流程:
public async Task<ExecutionResult> ExecuteAsync(ExecutionOptions options) {//1. 打印開始時間//2. Parse Document//3. 驗證Document是否是一個合法的GrapQL語法請求//4. 在流程的各個階段執行Listener,用于在不同的時機切入代碼,類似于ASP.NET Core中的Filter//5. 選擇合適的執行策略//6. 執行服務端資源//7. 輸出Response }

以上就是GraphQL在.NET Core中的實現原理分析,下一篇將通過一個hello world級別的例子演示如何讓你的ASP.NET應用程序支持GraphQL.

原文地址:https://www.cnblogs.com/xiandnc/p/10398505.html

.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com


總結

以上是生活随笔為你收集整理的让ASP.NET Core支持GraphQL之-GraphQL的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。