graphql---go http請求使用詳解
1. Graphql是什麼?
GraphQL是Facebook 在2012年開發的,2015年開源,2016年下半年Facebook宣佈可以在生產環境使用,而其內部早就已經廣泛應用了,用於替代 REST API。facebook的解決方案和簡單:用一個“聰明”的節點來進行復雜的查詢,將資料按照客戶端的要求傳回去,後端根據GraphQL機制提供一個具有強大功能的介面,用以滿足前端資料的個性化需求,既保證了多樣性,又控制了介面數量。
GraphQL並不是一門程式語言或者框架,它是描述你的請求資料的一種規範,是協議而非儲存,GraphQL本身並不直接提供後端儲存的能力,它不繫結任何的資料庫或者儲存引擎,它可以利用已有的程式碼和技術來進行資料來源管理。
一個GraphQL查詢是一個被髮往服務端的字串,該查詢在服務端被解釋和執行後返回JSON資料給客戶端。
2. Graphql和Rest Api的對比
RESTful:服務端決定有哪些資料獲取方式,客戶端只能挑選使用,如果資料過於冗餘也只能默默接收再對資料進行處理;而資料不能滿足需求則需要請求更多的介面。
GraphQL:給客戶端自主選擇資料內容的能力,客戶端完全自主決定獲取資訊的內容,服務端負責精確的返回目標資料。提供一種更嚴格、可擴充套件、可維護的資料查詢方式。
3. Graphql在go語言中使用
1.定義 graphql 使用者型別userType; Fields為user引數
/* 定義 graphql 使用者型別userType; Fields為user引數 */ var userType = graphql.NewObject( graphql.ObjectConfig{ Name: "User",Fields: graphql.Fields{ "id": &graphql.Field{ Type: graphql.String,},"name": &graphql.Field{ Type: graphql.String,)
2.定義graphql 查詢型別 Resolve 通過Id 獲取使用者資訊
/* 定義graphql 查詢型別 Resolve 通過Id 獲取使用者資訊 */ var queryType = graphql.NewObject( graphql.ObjectConfig{ Name: "Query",Fields: graphql.Fields{ "user": &graphql.Field{ Type: userType,Args: graphql.FieldConfigArgument{ "id": &graphql.ArgumentConfig{ Type: graphql.String,Resolve: func(p graphql.ResolveParams) (interface{},error) { idQuery,isOK := p.Args["id"].(string) if isOK { return data[idQuery],nil } return nil,nil },})
3.定義 graphql schemad物件
var schema,_ = graphql.NewSchema( graphql.SchemaConfig{ Query: queryType,)
4.執行查詢方法
func executeQuery(query string,schema graphql.Schema) *graphql.Result { result := graphql.Do(graphql.Params{ Schema: schema,RequestString: query,}) if len(result.Errors) > 0 { fmt.Printf("wrong result,unexpected errors: %v",result.Errors) } return result }
5.main 函式執行:
import ( "encoding/json" "fmt" "io/ioutil" "net/http" "github.com/graphql-go/graphql" ) type user struct { ID string `json:"id"` Name string `json:"name"`}var data map[string]user func main() { data = make(map[string]user) data["1"] = user{ ID: "1",Name: "wt",} data["2"] = user{ ID: "2",Name: "go",} http.HandleFunc("/graphql",func(w http.ResponseWriter,r *http.Request) { result := executeQuery(r.URL.Query().Get("query"),schema) json.NewEncoder(w).Encode(result) }) http.ListenAndServe(":8080",nil) }
4. 結果輸出,總結
遊覽器輸入:
http://127.0.0.1:8080/graphql?query={user(id:"1"){id,name}}
輸出結果:
{"data":{"user":{"id":"1","name":"wt"}}}
使用 graphql 再也不需要對介面的文件進行維護了。
go語言庫地址:https://github.com/graphql-go/graphql
補充:golang使用http傳送graphql請求
請求內容:
query格式:
query UnitList($Ids: String!,$offset: Int! ){UnitList(searchParams: {Ids: $Ids,offset: $offset},searchType: BASE) {list { score score_addbusinesstravel UnitTags commentScore } isOver count}}
data資料:
{"Ids":"123","offset":0}
get/post傳送http請求:
package main import ( "fmt" "strings" "net/http" "io/ioutil" ) func main() { url := "http://**************/graphql/" method := "POST" / "GET" payload := strings.NewReader("{\"query\":\"query UnitList($Ids: String!,$offset: Int!,){UnitList(searchParams: {Ids: $Ids,searchType: BASE) {list { score score_addbusinesstravel UnitTags commentScore } isOver count}}\",\"variables\":{\"luIds\":\"123\",\"offset\":0}}") client := &http.Client { } req,err := http.NewRequest(method,url,payload) if err != nil { fmt.Println(err) } req.Header.Add("Content-Type","application/json") res,err := client.Do(req) defer res.Body.Close() body,err := ioutil.ReadAll(res.Body) fmt.Println(string(body)) }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。