0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring認(rèn)證_什么是Spring GraphQL

IT膠囊 ? 來(lái)源:「Spring」認(rèn)證安全架構(gòu) ? 作者:「Spring」認(rèn)證安全 ? 2021-08-06 14:30 ? 次閱讀

Spring GraphQL 為構(gòu)建在 GraphQL Java 上的 Spring 應(yīng)用程序提供支持。兩個(gè)團(tuán)隊(duì)之間的聯(lián)合聯(lián)合。我們的共同理念是少固執(zhí)己見,更專注于全面和廣泛的支持。

Spring GraphQL 是 GraphQL Java 團(tuán)隊(duì)的 GraphQL Java Spring 項(xiàng)目的繼承者。它將成為所有 Spring、GraphQL 應(yīng)用程序的基礎(chǔ)。

網(wǎng)絡(luò)傳輸

Spring GraphQL 支持通過(guò) HTTP 和 WebSocket 的 GraphQL 請(qǐng)求。

HTTP

GraphQlHttpHandler通過(guò) HTTP 請(qǐng)求處理 GraphQL,并委托給 Web 攔截執(zhí)行請(qǐng)求。有兩種變體,一種用于 Spring MVC,一種用于 Spring WebFlux。分別依賴周期性和非周期性 I/O 來(lái)寫 HTTP 響應(yīng)。

請(qǐng)求必須使用 HTTP POST 和 GraphQL 請(qǐng)求詳細(xì)信息作為 JSON 包含在請(qǐng)求正文中,如提議的 GraphQL over HTTP 規(guī)范中定義。成功解碼 JSON 正文后,HTTP 響應(yīng)狀態(tài)始終為 200(OK),并且 GraphQL 請(qǐng)求執(zhí)行中任何錯(cuò)誤都出現(xiàn)在 GraphQL 響應(yīng)的“錯(cuò)誤”部分。

GraphQlHttpHandler可以通過(guò)聲明一個(gè)RouterFunctionbean 并使用RouterFunctions來(lái)自 Spring MVC 或 WebFlux 的來(lái)創(chuàng)建路由來(lái)作為 HTTP 公開公開。啟動(dòng)啟動(dòng)器執(zhí)行此操作。

Spring GraphQL 存儲(chǔ)庫(kù)包含一個(gè) Spring MVC HTTP 示例應(yīng)用程序。

網(wǎng)絡(luò)結(jié)果

GraphQlWebSocketHandler基于graphql的協(xié)議通過(guò)WebSocket請(qǐng)求處理Graphws庫(kù)。在WebSocket上使用GraphQL的結(jié)果是訂閱,它允許發(fā)送GraphQL響應(yīng)流,但它也可以用于有一次響應(yīng)的經(jīng)常查詢處理程序。個(gè)請(qǐng)求委托給Web攔截鏈以進(jìn)一步執(zhí)行請(qǐng)求。

有兩種變體GraphQlWebSocketHandler,用于一種Spring MVC,用于Spring WebFlux。 回流處理請(qǐng)求并具有強(qiáng)大的壓處理功能。消息,這很有效,因?yàn)樵?GraphQL Java 中訂閱響應(yīng)是 Reactive Streams Publisher。

graphql-ws項(xiàng)目已經(jīng)全部供客戶使用的配方。

GraphQlWebSocketHandler通過(guò)聲明SimpleUrlHandlerMappingbean 并可以使用通信處理程序映射到 URL 路徑來(lái)公開為 WebSocket 需求。啟動(dòng)啟動(dòng)器具有啟用此功能的選項(xiàng),詳細(xì)信息或檢查或例如配置,請(qǐng)參閱 Web 頁(yè)面。GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration

Spring GraphQL 存儲(chǔ)庫(kù)包含一個(gè) WebFlux WebSocket 示例應(yīng)用程序。

網(wǎng)頁(yè)攔截

HTTP和WebSocket的傳輸處理程序委托給一個(gè)通用的網(wǎng)絡(luò)攔截鏈來(lái)執(zhí)行請(qǐng)求。鏈該由一系列WebInterceptor組件組成,一個(gè)后跟GraphQlService調(diào)用GraphQL的Java引擎的。

WebInterceptor在 Spring MVC 和 WebFlux 應(yīng)用程序中使用的通用組件。使用它來(lái)攔截請(qǐng)求、檢查 HTTP 請(qǐng)求標(biāo)頭或注冊(cè)以下內(nèi)容的轉(zhuǎn)換graphql.ExecutionInput

類 MyInterceptor 實(shí)現(xiàn)了 WebInterceptor {

@覆蓋

public Mono 攔截(WebInput webInput, WebGraphQlHandler next) {

webInput.configureExecutionInput((executionInput, builder) -> {

Map map = ... ;,>

返回 builder.extensions(map).build();

});

返回 next.handle(webInput);

}

}

使用WebInterceptor也攔截響應(yīng),增加HTTP響應(yīng)頭,或轉(zhuǎn)換graphql.ExecutionResult

類 MyInterceptor 實(shí)現(xiàn)了 WebInterceptor {

@覆蓋

public Mono 攔截(WebInput webInput, WebGraphQlHandler next) {

返回 next.handle(webInput)

.map(webOutput -> {

對(duì)象數(shù)據(jù) = webOutput.getData();

對(duì)象更新數(shù)據(jù) = ... ;

返回 webOutput.transform(builder -> builder.data(updatedData));

});

}

}

WebGraphQlHandler提供了一個(gè)builder來(lái)初始化Web攔截鏈。構(gòu)建鏈后,您可以使用結(jié)果WebGraphQlHandler來(lái)初始化HTTP或WebSocket傳輸處理程序。啟動(dòng)器配置了所有這些,有關(guān)詳細(xì)信息,請(qǐng)參見Web Endpoints,或檢查GraphQlWebMvcAutoConfigurationGraphQlWebFluxAutoConfiguration配置。

查詢執(zhí)行

GraphQlService是調(diào)用GraphQL Java 來(lái)執(zhí)行請(qǐng)求的主要Spring GraphQL 抽象。通過(guò)傳輸,例如Web 傳輸,委托GraphQlService來(lái)處理請(qǐng)求。

主要實(shí)現(xiàn)ExecutionGraphQlService是圍繞著調(diào)用的薄外觀graphql.GraphQL。它配置了一個(gè)GraphQlSource用于訪問(wèn)graphql.GraphQL實(shí)例。

GraphQLSource

GraphQlSource是核心 Spring GraphQL 抽象,用于訪問(wèn)graphql.GraphQL請(qǐng)求執(zhí)行的實(shí)例。它提供了一個(gè)構(gòu)建器 API 來(lái)初始化 GraphQL Java 并構(gòu)建一個(gè)GraphQlSource。

GraphQlSource可通過(guò)訪問(wèn)的默認(rèn)構(gòu)建器GraphQlSource.builder()支持Reactive DataFetcher、Context Propagation和Exception Resolution。

反應(yīng)式 DataFetcher

默認(rèn)GraphQlSource構(gòu)建器啟用對(duì)一個(gè)DataFetcher報(bào)道查看Mono或的請(qǐng)立即獲取iTunes Flux。報(bào)道查看無(wú)論類型適合在一個(gè)CompletableFutureFlux聚集,變成了一個(gè)列表值,除非請(qǐng)求是GraphQL訂閱請(qǐng)求,這種在情況下報(bào)道查看值保持在無(wú)流Publisher的流GraphQL響應(yīng)。

反應(yīng)式DataFetcher可以依賴對(duì)從傳輸層傳播的 Reactor 上下文的訪問(wèn),例如來(lái)自 WebFlux 請(qǐng)求處理,請(qǐng)參閱 WebFlux 上下文。

大約傳播

Spring GraphQL 支持從Web 傳輸、通過(guò)GraphQL 引擎以及DataFetcher它調(diào)用的其他組件透明地傳播上下文。這包括ThreadLocal來(lái)自SpringMVC 請(qǐng)求處理線程的上下文和Context來(lái)自WebFlux 處理管道的Reactor。

網(wǎng)管

DataFetcherGraphQL Java 調(diào)用的 A 和其他組件可能并不總是在與 Spring MVC 處理程序相同的線程上執(zhí)行,例如如果異步WebInterceptorDataFetcher切換到不同的線程。

Spring GraphQL 支持將ThreadLocal值從容器線程傳播到線程DataFetcher以及由 GraphQL 引擎調(diào)用的其他組件執(zhí)行。因此,應(yīng)用程序需要?jiǎng)?chuàng)建一個(gè)ThreadLocalAccessor來(lái)ThreadLocal提取生物的值:

公共類 RequestAttributesAccessor 實(shí)現(xiàn) ThreadLocalAccessor {

private static final String KEY = RequestAttributesAccessor.class.getName();

@覆蓋

公共無(wú)效提取值(地圖<字符串,對(duì)象>容器){

container.put(KEY, RequestContextHolder.getRequestAttributes());

}

@覆蓋

public void restoreValues(Map values) {,>

if (values.containsKey(KEY)) {

RequestContextHolder.setRequestAttributes((RequestAttributes) values.get(KEY));

}

}

@覆蓋

public void resetValues(Map values) {,>

RequestContextHolder.resetRequestAttributes();

}

}

一個(gè)ThreadLocalAccessor可以在 WebGraphHandler 構(gòu)建器中注冊(cè)。Boot starter 檢測(cè)這種類型的 bean 并自動(dòng)為 Spring MVC 應(yīng)用程序注冊(cè)它們,請(qǐng)參見 Web Endpoints。

網(wǎng)絡(luò)流量

一個(gè)反應(yīng)DataFetcher可以從獲取反應(yīng)背景下,WebFlux 口頭請(qǐng)求處理鏈。這包括由 WebInterceptor 組件添加的 Reactor 上下文。

異常解決

GraphQL Java 應(yīng)用程序可以注冊(cè)一個(gè)DataFetcherExceptionHandler來(lái)決定如何在 GraphQL 響應(yīng)的“錯(cuò)誤”部分中表示來(lái)自數(shù)據(jù)層的異常。

Spring GraphQL 有一個(gè)內(nèi)置的DataFetcherExceptionHandler,配置為供GraphQLSource構(gòu)建器使用。它使應(yīng)用程序注冊(cè)一個(gè)或多個(gè)DataFetcherExceptionResolver順序調(diào)用的 Spring 組件,直到將解析Exceptiongraphql.GraphQLError對(duì)象列表。

DataFetcherExceptionResolver是一個(gè)異步契約。對(duì)于大多數(shù)實(shí)現(xiàn),這將是悉尼的擴(kuò)展DataFetcherExceptionResolverAdapter和覆蓋其一個(gè)resolveToSingleErrorresolveToMultipleErrors方法是解決異常同步。

AGraphQLError可以分配一個(gè)graphql.ErrorClassification。Spring GraphQL 定義了一個(gè)ErrorType常見錯(cuò)誤分類類別的枚舉:

  • BAD_REQUEST

  • UNAUTHORIZED

  • FORBIDDEN

  • NOT_FOUND

  • INTERNAL_ERROR

應(yīng)用程序可以使用它來(lái)分類錯(cuò)誤。如果它錯(cuò)誤解決,則默認(rèn)情況下將標(biāo)記為INTERNAL_ERROR。

未完待續(xù)……

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104362
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14277
  • GraphQL
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    558
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Spring Cloud Gateway網(wǎng)關(guān)框架

    Spring Cloud Gateway網(wǎng)關(guān)框架 本軟件微服務(wù)架構(gòu)中采用Spring Cloud Gateway網(wǎng)關(guān)控制框架,Spring Cloud Gateway是Spring C
    的頭像 發(fā)表于 08-22 09:58 ?370次閱讀
    <b class='flag-5'>Spring</b> Cloud Gateway網(wǎng)關(guān)框架

    玩轉(zhuǎn)Spring狀態(tài)機(jī)

    說(shuō)起Spring狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒(méi)錯(cuò),Spring狀態(tài)機(jī)就是狀態(tài)模式的一種實(shí)現(xiàn),在介紹Spring狀態(tài)機(jī)之前,讓我們來(lái)看看設(shè)計(jì)模式中的狀態(tài)模式
    的頭像 發(fā)表于 06-25 14:21 ?811次閱讀
    玩轉(zhuǎn)<b class='flag-5'>Spring</b>狀態(tài)機(jī)

    Spring事務(wù)傳播性的相關(guān)知識(shí)

    本文主要介紹了Spring事務(wù)傳播性的相關(guān)知識(shí)。
    的頭像 發(fā)表于 01-10 09:29 ?349次閱讀
    <b class='flag-5'>Spring</b>事務(wù)傳播性的相關(guān)知識(shí)

    Spring狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法

    說(shuō)起 Spring 狀態(tài)機(jī),大家很容易聯(lián)想到這個(gè)狀態(tài)機(jī)和設(shè)計(jì)模式中狀態(tài)模式的區(qū)別是啥呢?沒(méi)錯(cuò),Spring 狀態(tài)機(jī)就是狀態(tài)模式的一種實(shí)現(xiàn),在介紹 Spring 狀態(tài)機(jī)之前,讓我們來(lái)看看設(shè)計(jì)模式中的狀態(tài)模式。
    的頭像 發(fā)表于 12-26 09:39 ?1778次閱讀
    <b class='flag-5'>Spring</b>狀態(tài)機(jī)的實(shí)現(xiàn)原理和使用方法

    Spring事務(wù)失效的十種常見場(chǎng)景

    Spring針對(duì)Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API(JPA)等事務(wù) API,實(shí)現(xiàn)了一致的編程模型,而
    的頭像 發(fā)表于 12-11 15:03 ?792次閱讀

    Spring中經(jīng)典的9種設(shè)計(jì)模式

    spring中常用的設(shè)計(jì)模式達(dá)到九種,我們一一舉例
    的頭像 發(fā)表于 12-11 09:56 ?833次閱讀
    <b class='flag-5'>Spring</b>中經(jīng)典的9種設(shè)計(jì)模式

    dubbo和spring cloud區(qū)別

    Dubbo和Spring Cloud是兩個(gè)非常流行的微服務(wù)框架,各有自己的特點(diǎn)和優(yōu)勢(shì)。在本文中,我們將詳細(xì)介紹Dubbo和Spring Cloud的區(qū)別。 1.架構(gòu)設(shè)計(jì): Dubbo是阿里巴巴開源
    的頭像 發(fā)表于 12-04 14:47 ?1465次閱讀

    如何在Spring Boot應(yīng)用程序中整合ZXing庫(kù)

    在數(shù)字化時(shí)代,二維碼已經(jīng)成為了信息交流的一種常見方式。它們被廣泛用于各種應(yīng)用,從產(chǎn)品標(biāo)簽到活動(dòng)傳單,以及電子支付。本文將向您展示如何在Spring Boot應(yīng)用程序中整合ZXing庫(kù),以創(chuàng)建和解析QR碼。
    的頭像 發(fā)表于 12-03 17:39 ?1030次閱讀

    Spring中依賴注入的四種方式

    Spring框架中,依賴注入是一種核心的概念和機(jī)制。通過(guò)依賴注入,我們可以讓對(duì)象之間的依賴關(guān)系更加松散,并且能夠方便地進(jìn)行單元測(cè)試和模塊化開發(fā)。在Spring中,有多種方式來(lái)實(shí)現(xiàn)依賴注入,下面將
    的頭像 發(fā)表于 12-03 15:11 ?1649次閱讀

    Spring MVC的工作原理

    Spring MVC是一種基于Java的Web應(yīng)用程序框架,它采用了Model-View-Controller(MVC)設(shè)計(jì)模式來(lái)分離應(yīng)用程序的不同方面。Spring MVC的工作原理涉及多個(gè)關(guān)鍵
    的頭像 發(fā)表于 12-03 11:49 ?701次閱讀

    Spring Boot 3.2支持虛擬線程和原生鏡像

    Spring Boot 3.2 前幾日發(fā)布,讓我們用 Java 21、GraalVM 和虛擬線程來(lái)嘗試一下。
    的頭像 發(fā)表于 11-30 16:22 ?629次閱讀

    Spring MVC的工作原理是怎樣的

    Spring MVC是一種基于Java的Web框架,它充分利用了Java的優(yōu)點(diǎn),如面向?qū)ο缶幊?、模塊化、可重用性和可擴(kuò)展性。Spring MVC的工作原理可以總結(jié)為以下幾個(gè)步驟:請(qǐng)求的發(fā)送、請(qǐng)求
    的頭像 發(fā)表于 11-22 16:53 ?726次閱讀

    Spring依賴注入的方式

    Spring 是一個(gè)開源的輕量級(jí)框架,可以用于構(gòu)建企業(yè)級(jí)應(yīng)用程序。其最重要的特性之一是依賴注入(Dependency Injection,DI),這是一種設(shè)計(jì)模式,它可以幫助我們解耦代碼、提高
    的頭像 發(fā)表于 11-22 15:12 ?426次閱讀

    spring分布式框架有哪些

    Spring分布式框架是一套基于Spring框架的解決方案,用于構(gòu)建分布式系統(tǒng)。它提供了一系列的組件和模塊,可以幫助開發(fā)人員輕松地構(gòu)建可擴(kuò)展、高可用、高性能的分布式應(yīng)用程序。下面將詳細(xì)介紹一些常用
    的頭像 發(fā)表于 11-16 10:58 ?707次閱讀

    Spring布能用來(lái)搭建基礎(chǔ)架構(gòu)嗎

    Spring Boot 是一個(gè)用于簡(jiǎn)化 Spring 應(yīng)用程序開發(fā)的框架,它利用 Spring 框架的強(qiáng)大功能,使得基礎(chǔ)架構(gòu)的搭建變得更加簡(jiǎn)單、輕量級(jí)、易于維護(hù)。在本文中,我們將詳細(xì)討論
    的頭像 發(fā)表于 11-16 10:56 ?347次閱讀