GraphQL風格的介面傳送GET、POST請求
上一篇 部落格最後留下了幾個問題,其中有一個是graphql風格介面怎麼傳送post請求儲存資料,這一篇來介紹一下方法
準備環境
graphql風格介面的搭建可以看上一篇 部落格,這裡不多說
既然要儲存資料,這篇部落格是在上一篇部落格的基礎了將資料來源改成了jpa從資料庫裡查詢的了,這一塊不多說
請求
上一篇最後測試用的是graphql-playground
工具測試的,其實是不知道它背後怎麼傳送的請求
那麼graphql風格介面使用傳統的呼叫介面的方式,連結應該是怎麼樣的呢?
GET和POST都一樣:http://localhost:8080/graphql?query={bookById(id: 1) {id,name, pageCount, author{id, name}, category {id, name}}}
就一個引數query
後面的內容就是使用graphql-playground
工具測試寫的內容了,知道怎麼寫的了,其它的比如鑑權,刪除都會了,下面給一個例子
定義Query
既然要新增post請求,肯定要在schema裡定義一個query方法
type Query { bookById(id: ID): Book books: [Book], # 儲存資料的介面 bookSave(name: String, pageCount: Int, authorId: Int, categoryId: Int): Book }
實現
在GraphQLProvider
類裡修改方法buildWiring()
內容
private RuntimeWiring buildWiring() { return RuntimeWiring.newRuntimeWiring() // 指定Query物件裡定義的方法如何實現 .type(newTypeWiring("Query") .dataFetcher("books", graphQLDataFetchers.getBooksDataFetcher()) .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()) // 定義bookSave方法的實現方式 .dataFetcher("bookSave", graphQLDataFetchers.saveBookDataFetcher()) ) // 指定Book物件裡定義的物件如何查詢 .type(newTypeWiring("Book") .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()) .dataFetcher("category", graphQLDataFetchers.getCategoryDataFetcher())) .build(); }
原鏈文接:https://tomoya92.github.io/2019/04/06/graphql-get-post/
另外在類GraphQLDataFetchers
中新增bookSave()
方法的實現,就是將請求引數裡的內容持久化到資料庫
public DataFetcher saveBookDataFetcher() { return dataFetchingEnvironment -> { // 這裡getArgument方法返回的是一個泛型T,也就是在schema裡定義方法時指定引數的型別是啥,這裡就用啥型別接收,不用轉換 // 如果轉換這裡還會報錯 String name = dataFetchingEnvironment.getArgument("name"); Integer pageCount = dataFetchingEnvironment.getArgument("pageCount"); Integer authorId = dataFetchingEnvironment.getArgument("authorId"); Integer categoryId = dataFetchingEnvironment.getArgument("categoryId"); // 呼叫jpa save方法,將資料入庫 return bookService.save(name, pageCount, authorId, categoryId); }; }
測試
直接在postman裡傳送請求http://localhost:8080/graphql?query={bookSave(name: "Node.JS入門與精通", pageCount: 300, authorId: 2, categoryId: 2) {id,name, pageCount, author{id, name}, category {id, name}}}
返回值
{ "data": { "bookSave": { "id": "5", "name": "Node.JS入門與精通", "pageCount": 300, "author": { "id": "2", "name": "李四" }, "category": { "id": "2", "name": "文學" } } } }
其實到這裡應該就能看出來了,graphql風格接口裡貌似沒有get, post, put, delete等概念了,這樣一想,又有新問題了。。
總結
測試中可以看到,get,post請求已經沒有那麼明顯的區別了,那麼
- 檔案上傳怎麼辦呢?
- 另外還有一點,有沒有發現java bean中的屬性跟定義的schema是不是很像,那麼spring框架有沒有對這個做複用的處理方式呢?
繼續折騰中。。。
寫部落格不易,轉載請保留原文連結,謝謝!
原文連結: