Go 搭建GraphQL 服務端

2021-09-13 23:02:40 字數 3502 閱讀 6561

github提供的graphql介面非常全面,那麼我們該如何搭建出自己的介面呢?好在graphql提供了很多語言的解決方案。本文主要闡述如何用go搭建自己的graphql伺服器。如果了解graphql建議先閱讀graphql — api查詢語言 或相關資料。

an implementation of graphql in go. follows the official reference implementation

graphql-js.

一套比較完善的框架,眾所周知go的結構體對json非常友好,所以並不需要對資料有特殊的處理,還是很方便的。開啟終端輸入命令

在服務端程式設計中,編寫的一切都可以稱之為物件(object)。例如乙個商品(goods)的例項可以有商品名(name)、**(price)、購買鏈結(url)三個字段。此時商品可以很自然的被稱為乙個object,查詢的語句可以寫成:

}

如果此時我們要查詢商品和文章兩種object的資訊:

/* query 可以省去 */

query

article

}

是否你已經發覺,query像乙個大的object,它有goods和article兩個字段。除此之外,mutation也是如此:

mutation

}

這裡的addgoods可以看做是乙個可以處理引數的物件,也就是某種意義上的函式

總之,graphql服務端的程式設計就是乙個又乙個的物件將形成的巢狀結構(schema)組織起來,並對外提供服務。

為了防止低階錯誤的發生,在當前pkg下新建乙個名為query.go(隨便起)的檔案。

)定義good object

type goods struct 

var goodstype = graphql.newobject(

graphql.objectconfig,

"name": &graphql.field,

"price": &graphql.field,

"url": &graphql.field,

},},

)var goodslisttype = graphql.newlist(goodstype)

注意:陣列相當於新的object型別。

定義query object

var querytype = graphql.newobject(

graphql.objectconfig, error) ,

},// 引數是id

"goods": &graphql.field,

},resolve: func(p graphql.resolveparams) (inte***ce{}, error)

err := errors.new("field 'goods' is missing required arguments: id. ")

return nil, err

},},

},},

)

mutation定義基本相同,新建乙個名為mutation.go的檔案:

定義input object

var goodsinputtype = graphql.newinputobject(

graphql.inputobjectconfig,

"price": &graphql.inputobjectfieldconfig,

"url": &graphql.inputobjectfieldconfig,

},},

)

定義 mutation object

var mutationtype = graphql.newobject(

graphql.objectconfig,

},resolve: func(p graphql.resolveparams) (inte***ce{}, error)

result := goods

// 處理資料

return result,err

},},

},},

)

然而,input型別並不能直接轉換為struct,而是乙個map[string]inte***ce{}型別,還需要進行手動轉換。

定義schema

var schema, _ = graphql.newschema(

graphql.schemaconfig,

)

至此,我們的全部的object定義完成。

graphql-go為我們提供了乙個方便的介面,封裝好的handler可以直接與go自帶的http包繫結。

}

func main()
開啟瀏覽器,訪問http://localhost:apiport/graphql, 檢視你自己的graphiql介面吧!

如果你覺得這樣的**談不上優雅,甚至非常醜陋,那就對了。因為我也這樣覺得,看一看隔壁python的實現方式:

import graphene

class query(graphene.objecttype):

hello = graphene.string()

def resolve_hello(self, args, context, info):

return 'hello world!'

schema = graphene.schema(query=query)

有沒有湧來一口老血。

可能是受限與golang本身反射系統並不夠完善,沒有python各種各樣的魔術方法,沒有泛型,或者說go本身不太適合編寫框架類的**。在編寫的過程中,冗餘非常多,當然也可能是框架本身的問題

不可否認的是,go確實是非常不錯的一門語言,雖然開發效率無法與python媲美,但是在多併發環境下,go表現出非常出色,同時擁有與c級別的執行速度和豐富的生態。

go還年輕,其他它越來越好!

服務計算 搭建GraphQL 服務端

這次專案中負責後台的工作,學習了如何用graphql框架搭建服務端。graphql官網給出定義 graphql既是一種用於api的查詢語言 也是乙個滿足你資料查詢的執行時 graphql對你的api中的資料提供了一套易於理解的完整描述 使得客戶端能夠準確地獲得它需要的資料 而且沒有任何冗餘,也讓ap...

go 搭建WebSocket服務端

原帖 使用 執行go run websoketdemo01.go var wsserver ws localhost 1234 var websocket new websocket wsserver websocket.onopen function evt websocket.onclose f...

go服務端 使用gin框架搭建簡易服務

go語言web框架挺多的,各有各的特點和風格。我之所以在專案中使用gin框架,是因為專案一開始是用的martini,乙個設計得很好的框架,但是存在乙個比較嚴重的問題,就是大量使用反射使用太多導致效率過低 這個問題也導致了程式在訪問量暴漲時記憶體 過快的問題 而且這個框架在去年就沒有人維護了,而作者推...