我尝试了一下GraphQL
什么是GraphQL?
这是一种用于API(客户端和服务器之间)的查询语言。(例如:REST API等)
官方网页
优点:
-
- 特別な環境に縛られることなく、様々プログラミング言語に対してライブラリが提供されている。
-
- クエリの形はレスポンスのJsonの構造と同じであるため、直感的でわかりやすい。
-
- サーバ側ではなく、クライアント側でどのようにレスポンスを返すかをクエリに定義することによって、決めることができる。
- ↑のメリットにより、本来何回もリクエストしなくてはならないものが一回のリクエストで実現することができる。
让我们实际看一下GraphQL。
前提:尽管有多种为编程提供的库可供选择,但本次我们将使用golang在Mac中进行。
-
- 我们将在本地获取用于golang的GraphQL库。(在这里,我们将获取每种语言的库。本次使用golang。)
-
- 通过终端输入”go get github.com/graphql-go/graphql”来安装库。
- 让我们看一下库中的示例。
package 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"`
}
// JSONデータ格納用
var data map[string]user
// レスポンスのタイプを定義する
var userType = graphql.NewObject(
graphql.ObjectConfig{
Name: "User",
Fields: graphql.Fields{
"id": &graphql.Field{
Type: graphql.String,
},
"name": &graphql.Field{
Type: graphql.String,
},
},
},
)
// クエリの定義
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
},
},
},
})
var schema, _ = graphql.NewSchema(
graphql.SchemaConfig{
Query: queryType,
},
)
// graphqlでリクエストされた時に実行される。
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
}
func main() {
//data.jsonを取り込む
_ = importJSONDataFromFile("data.json", &data)
//ハンドラを登録
http.HandleFunc("/graphql", func(w http.ResponseWriter, r *http.Request) {
result := executeQuery(r.URL.Query().Get("query"), schema)
json.NewEncoder(w).Encode(result)
})
fmt.Println("Now server is running on port 8080")
fmt.Println("Test with Get : curl -g 'http://localhost:8080/graphql?query={user(id:\"1\"){name}}'")
http.ListenAndServe(":8080", nil)
}
//data.jsonをmap型変数のdataに代入
func importJSONDataFromFile(fileName string, result interface{}) (isOK bool) {
isOK = true
content, err := ioutil.ReadFile(fileName)
if err != nil {
fmt.Print("Error:", err)
isOK = false
}
err = json.Unmarshal(content, result)
if err != nil {
isOK = false
fmt.Print("Error:", err)
}
return
}
执行结果
执行go.main,并访问下列URL:http://localhost:8080/graphql?query={user(id:”1″){name}}
原始数据 de
{
"1": {
"id": "1",
"name": "Dan"
},
"2": {
"id": "2",
"name": "Lee"
},
"3": {
"id": "3",
"name": "Nick"
}
}
outcome
正在从原始数据中获取用户ID为1的用户名。