搜尋
首頁Javajava教程SpringBoot怎麼使用GraphQL開發Web API

SpringBoot怎麼使用GraphQL開發Web API

May 13, 2023 am 10:52 AM
apigraphqlspringboot

前言

傳統的Restful API 存在諸多的問題,首先它無法控制返回的字段,前端也無法預判後端的返回結果,另外不同的返回結果對應不同的請求地址,這就導致了多次請求的問題。而GraphQL正是基於這樣的背景而建構出來的API查詢語言,相對於傳統Restful API 它具有以下幾個優點:

  • 靈活性:GraphQL 可以根據客戶端的需求靈活地查詢數據,而不是像RESTful API 那樣傳回固定結構的資料。

  • 減少網路請求:GraphQL 允許客戶端在一次請求中取得多個資源,這有助於減少網路請求的數量並提高效能。

  • 強型別:GraphQL 有一個強型別系統,客戶端可以在編譯時偵測到查詢中的錯誤,這有助於減少執行時間錯誤。

  • 可快取:GraphQL 具有可快取性,這意味著伺服器可以快取查詢的結果,從而提高效能和可擴展性。

  • 文件化:GraphQL 具有自我文件化的能力,使得開發者可以快速了解 API 的結構和功能。

Spring Boot中GraphQL的實作方案

如果後端語言為Java,那麼GraphQL Java就是實作GraphQL的基礎函式庫。另外Spring已經整合了GraphQL,如果專案中使用了Spring,那麼就更推薦Spring GraphQL。

Spring GraphQL的開發總體分為以下幾個步驟

新增 Spring GraphQL 依賴項

在您的專案中新增 Spring GraphQL 依賴項。您可以透過 Maven 或 Gradle 等建置工具來新增依賴項。例如,如果您使用 Maven,則可以新增下列相依性

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-graphql</artifactId>
        </dependency>

定義 GraphQL Schema

在您的應用程式中定義 GraphQL Schema。 Schema 定義了可查詢的類型和欄位。您可以使用 SDL(Schema Definition Language)或程式設計方式定義 Schema。

對於Spring Boot 工程來說schema檔案放到resources/graphql/目錄下,檔案名稱後綴graphqls,下面是我定義一個的簡單的schema.graphqls。

它指定了兩個查詢實現,author(id:Int)表示透過id查詢Author,allAuthors則表示查詢Author數組。

schema {
    query: Query
}

type Query {
    author(id:Int): Author
    allAuthors: [Author]
}

type Author {
    id:Int
    firstName:String
    lastName:String
    email:String
    birthdate:
    email:String

    birthdate:
}

##}

##實作RuntimeWiringConfigurer

RuntimeWiringConfigurer是實現GraphQL取得資料的核心,使用GraphQL並不能直接去掉Mybatis/Jpa這類持久層框架,從資料庫取得資料仍需要這類框架的支援。

而RuntimeWiringConfigurer則類似於Spring中的service層,它是實現基礎資料的核心。

以下是一個簡單範例:

@Component
public class AuthorWiring implements RuntimeWiringConfigurer {
    private final AuthorRepository authorRepository;
    public AuthorWiring(AuthorRepository authorRepository) {
        this.authorRepository = authorRepository;
    }
    @Override
    public void configure(RuntimeWiring.Builder builder) {
        builder.type("Query", typeWiring -> typeWiring
                        .dataFetcher("allAuthors", environment -> authorRepository.findAll())
                        .dataFetcher("author", environment -> authorRepository.getReferenceById(environment.getArgument("id")))
    }
}

這裡configure方法內部分別定義了兩個DataFetcher對象,用來指定author和allAuthors查詢資料的方式,可以看出依然是透過JPA去查詢資料。

定義GraphQL Controller

我麼定義GraphQLController用來接收web請求的入參,範例如下:

@RestController
@RequestMapping("graphql")
public class GraphQLController {
    private final GraphQL graphQL;
    @Autowired
    public GraphQLController(GraphQlSource graphQlSource) {
        graphQL = graphQlSource.graphQl();
    }
    @PostMapping("query")
    public ResponseEntity<Object> query(@RequestBody String query) {
        ExecutionResult result = graphQL.execute(query);
        return ResponseEntity.ok(result.getData());
    }
}

程式碼中GraphQL物件是執行查詢的入口,但GraphQL只有一個私有的建構方法,所以不能直接注入,必須透過注入GraphQlSource的方式來取得GraphQL物件。

注意在GraphQL中我們只能使用String來接收參數,無法使用model對象,這是因為Graph請求參數並不是json結構。

測試Graph請求

我們建立一個graphql.http的文件,用於在idea中執行http請求



Send POST request with json body

POST http://localhost:8080/graphql/query

Content-Type: application/json

{
  author(id: 1) {
    id
    firstName
    lastName
    birthdate

  }

}

Send POST request with json body

POST http://localhost:8080/graphql/query##Content -Type: application/json

{
  allAuthors {
    id
    firstName
    lastName
    birthdate

  }
#}

} #執行author(id: 1) 的查詢,可以看到正常回傳結果了。如果我們只需要 firstName和lastName兩個字段,那麼在請求入參中直接去掉id和birthdate就好了,而不用改動任何後端代碼。

SpringBoot怎麼使用GraphQL開發Web API

SpringBoot怎麼使用GraphQL開發Web API

###

以上是SpringBoot怎麼使用GraphQL開發Web API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
Java平台獨立性:與不同的操作系統的兼容性Java平台獨立性:與不同的操作系統的兼容性May 13, 2025 am 12:11 AM

JavaachievesPlatFormIndependencethroughTheJavavIrtualMachine(JVM),允許Codetorunondifferentoperatingsystemsswithoutmodification.thejvmcompilesjavacodeintoplatform-interploplatform-interpectentbybyteentbytybyteentbybytecode,whatittheninternterninterpretsandectectececutesoneonthepecificos,atrafficteyos,Afferctinginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginginging

什麼功能使Java仍然強大什麼功能使Java仍然強大May 13, 2025 am 12:05 AM

JavaispoperfulduetoitsplatFormitiondence,對象與偏見,RichstandardLibrary,PerformanceCapabilities和StrongsecurityFeatures.1)Platform-dimplighandependectionceallowsenceallowsenceallowsenceallowsencationSapplicationStornanyDevicesupportingJava.2)

頂級Java功能:開發人員的綜合指南頂級Java功能:開發人員的綜合指南May 13, 2025 am 12:04 AM

Java的頂級功能包括:1)面向對象編程,支持多態性,提升代碼的靈活性和可維護性;2)異常處理機制,通過try-catch-finally塊提高代碼的魯棒性;3)垃圾回收,簡化內存管理;4)泛型,增強類型安全性;5)ambda表達式和函數式編程,使代碼更簡潔和表達性強;6)豐富的標準庫,提供優化過的數據結構和算法。

Java真的平台獨立嗎? '寫一次,在任何地方運行”如何起作用Java真的平台獨立嗎? '寫一次,在任何地方運行”如何起作用May 13, 2025 am 12:03 AM

javaisnotirelyplatemententedduetojvmvariationsandnativecodinteinteration,butitlargelyupholdsitsitsworapromise.1)javacompilestobytecoderunbythejvm

揭示JVM:您了解Java執行的關鍵揭示JVM:您了解Java執行的關鍵May 13, 2025 am 12:02 AM

thejavavirtualmachine(JVM)IsanabtractComputingmachinecrucialforjavaexecutionasitrunsjavabytecode,使“ writeononce,runanywhere”能力

Java仍然是基於新功能的好語言嗎?Java仍然是基於新功能的好語言嗎?May 12, 2025 am 12:12 AM

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

是什麼使Java很棒?關鍵特徵和好處是什麼使Java很棒?關鍵特徵和好處May 12, 2025 am 12:11 AM

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

前5個Java功能:示例和解釋前5個Java功能:示例和解釋May 12, 2025 am 12:09 AM

Java的五大特色是多態性、Lambda表達式、StreamsAPI、泛型和異常處理。 1.多態性讓不同類的對象可以作為共同基類的對象使用。 2.Lambda表達式使代碼更簡潔,特別適合處理集合和流。 3.StreamsAPI高效處理大數據集,支持聲明式操作。 4.泛型提供類型安全和重用性,編譯時捕獲類型錯誤。 5.異常處理幫助優雅處理錯誤,編寫可靠軟件。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器