1. 程式人生 > 程式設計 >graphql---go http請求使用詳解

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))
}

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。