GraphQL 是一种用于应用编程接口(API)的查询语言和服务器端运行时,它可以使客户端准确地获得所需的数据,没有任何冗余。
graphql-on-http.png

优点

GraphQL 模式会在 GraphQL 应用中设置单一事实来源。它为企业提供了一种整合其整个 API 的方法。
一次往返通讯可以处理多个 GraphQL 调用。客户端可得到自己所请求的内容,不会超量。
严格定义的数据类型可减少客户端与服务器之间的通信错误。
GraphQL 具有自检功能。客户端可以请求一个可用数据类型的列表。这非常适合文档的自动生成。
GraphQL 允许应用 API 进行更新优化,而无需破坏现有查询。
许多开源 GraphQL 扩展可提供 REST API 所不具备的功能。
GraphQL 不指定特定的应用架构。它能够以现有的 REST API 为基础,并与现有的 API 管理工具配合使用。

缺点

即便是熟悉 REST API 的开发人员,也需要一定时间才能掌握 GraphQL。
GraphQL 将数据查询的大部分工作都转移到服务器端,由此增加了服务器开发人员工作的复杂度。
根据不同的实施方式,GraphQL 可能需要不同于 REST API 的 API 管理策略,尤其是在考虑速率限制和定价的情况下。
缓存机制比 REST 更加复杂。
API 维护人员还会面临编写可维护 GraphQL 模式的额外任务。

示例

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "log"
  6. "github.com/graphql-go/graphql"
  7. )
  8. func main() {
  9. // Schema
  10. fields := graphql.Fields{
  11. "hello": &graphql.Field{
  12. Type: graphql.String, // 核心:声明字段类型
  13. Resolve: func(p graphql.ResolveParams) (interface{}, error) {
  14. return "world", nil // 核心:响应处理方法
  15. },
  16. },
  17. }
  18. rootQuery := graphql.ObjectConfig{Name: "RootQuery", Fields: fields}
  19. schemaConfig := graphql.SchemaConfig{Query: graphql.NewObject(rootQuery)}
  20. schema, err := graphql.NewSchema(schemaConfig)
  21. if err != nil {
  22. log.Fatalf("failed to create new schema, error: %v", err)
  23. }
  24. // Query
  25. query := `
  26. {
  27. hello
  28. }
  29. `
  30. params := graphql.Params{Schema: schema, RequestString: query}
  31. r := graphql.Do(params)
  32. if len(r.Errors) > 0 {
  33. log.Fatalf("failed to execute graphql operation, errors: %+v", r.Errors)
  34. }
  35. rJSON, _ := json.Marshal(r)
  36. fmt.Printf("%s \n", rJSON) // {"data":{"hello":"world"}}
  37. }

完整示例:
GitHub - JasonkayZK/go-learn at graphql
需要切换到graphql分支

GraphQL | A query language for your API
一文带你看懂 GraphQL 是什么?- 红帽
https://github.com/graphql-go/graphql