vlambda博客
学习文章列表

GraphQL接口概念及测试ABC

GraphQL简介及例子

GraphQL简介

RESTFul接口规范提出于2000年,在移动互联网的时代得到了大力的发展,成为目前最流行的接口设计规范。随着手机性能的日渐强大,手机端APP功能越来越复杂,与之对应的接口定义越来越多,越来越复杂,性能及维护面临的问题越来越严重。为了应对这种发展的趋势,Facebook在2015年开源了一种新的API接口规范,称为GraphQL,作为REST的替代技术。

GraphQL的资源

中文主站:https://graphql.cn/
英文主站:https://graphql.org/

GraphQL vs REST

我们分别以REST和GraphQL,编写一下CRUD的接口,如下:
Rest接口:

#查询
GET /posts
GET /post/1
#创建
POST /post
#修改
PUT /post/1
#删除
DELETE /post/1

GraphQL接口:

# 查询所有:POST
{
  posts {
    id
    title
    content
    createDate
  }
}
# 查询指定id的title:POST
{
  post(id"5cccc45b7ed65eacb3372aba") {
    id
    title
  }
}
# 创建: POST
mutation {
  createPost(post: {title: "New Posts", content: "New Post Content"}) {
    id
    title
    content
    createDate
  }
}
# 删除:POST
mutation {
  deletePost(id"5cccc45b7ed65eacb3372aba")
}

GraphiQL

GraphiQL是GraphQL的一个调试工具,可以做简单的功能验证

GraphQL接口定义

这是一个GraphQL接口的设计文档:

type Post {
    id: ID,
    titleString,
    contentString,
    createDateString
}

input PostInput{
    titleString!,
    contentString!
}

type Query{
    posts: [Post]
    post(id: ID!): Post
}

type Mutation{
    createPost(post: PostInput): Post!
    updatePost(id: ID!, post: PostInput): Post!
    deletePost(id: ID!): String
}

Demo

我们可以用传统的接口测试工具测试GraphQL接口,比如Postman,JMeter等,这里介绍几个命令行的例子帮助理解:
Query All:

# curl -XPOST -H "Content-Type: application/json" -d {\"query\":\"{posts{id,title,content,createDate}}\"} http://locallhost:8080/testerq/graphql
or with httpie:
# http POST http://<IP>/testerq/graphql query={posts{id,title,content,createDate}}

Query One:

# http POST http://<IP>/testerq/graphql query={post(id:\"5d71ea7ee765824b54bd5060\"){id,title,content,createDate}}

Create:

# http POST http://<IP>/testerq/graphql query="mutation{createPost(post:{title:\"New Posts\",content:\"New Post Content\"}){id,title,content,createDate}}"

Update:

# http POST http://<IP>/testerq/graphql query="mutation { updatePost(id: \"5d71fc7ee765824b54bd5063\", post: {title: \"Update Posts\", content: \"Update Post Content\"}) { id, title, content, createDate}}"

Delete:

# http POST http://<IP>/testerq/graphql query="mutation { deletePost(id: \"5d71fc7ee765824b54bd5063\") }"

显然,以上命令所带的参数都来自于前文介绍的接口设计文档,通过一个URL即可实现了数据的CRUD操作!