美文网首页
(原创)GraphQL API的参数怎么传?

(原创)GraphQL API的参数怎么传?

作者: mona_alwyn | 来源:发表于2019-05-15 21:25 被阅读0次

初次听闻GraphQL时,我是将其与SQL对标的,脑回路如下:

SQL         -->     Structured Query Language      结构化查询语言
GrapqhQL    -->      Graph Query Language          图形化查询语言?

我当然错了,GrapqhQL是一种用于 API 的查询语言,并不是用于查询数据库的,事实上它对标的是RestFul。
这篇博客并不是为了GraphQL的入门科普,所以详情请咨询graphql.cn或者graphql.org

正所谓"demo is demo"(business is business),哪怕有详细的API文档和丰富的demos(比如graphql-java),对于类似我这样的初学者来说,有些地方一旦没有点明,是会有阻塞的。

啪!闲言碎语不要讲,单把传参讲一讲.

首先假设一个本地的graphql server有test.graphqls如下:

schema {
    query: Query
}

type Query{
    some:[Test]
}

type Test{
    a: String!
    b: String!
    c: String!
}

那么相应的origin url 为localhost:8080/graphql?query=query{ some{ a b c } },由于url不允许{}这种特殊符号的存在,所以实际访问时需要进行urlencode,当然要注意的是只encode"query="之后的部分,实际访问地址为localhost:8080/graphql?query=query%7B%20some%7B%20a%20b%20c%20%7D%20%7D.
使用querystring即可实现:

1.png

传参实现

  1. 修改grapqhls文件
    假如我们要传入nametime两个参数,其中name为必要time为可选,相应修改为:
schema {
    query: Query
}

type Query{
    some(name: String!, time: String):[Test]
}

type Test{
    a: String!
    b: String!
    c: String!
}
  • !表示必传,同时会进行Null检查
  • 因为不支持DateTimeStamp格式,所以只能使用String或者Long来传递时间类参数

2)API URL的调整
假设name = ttt, time = 123456789
这部分的调整实现有两种方式,区别在于是否使用variables:

  • no variables
    origin url: localhost:8080/graphql?query=query{ some(name: "ttt", time: "123456789"){ a b c } }
    encoded url: localhost:8080/graphql?query=query%7B%20some(name%3A%20%22ttt%22%2C%20time%3A%20%22123456789%22)%7B%20a%20b%20c%20%7D%20%7D

  • use variables
    origin url: localhost:8080/graphql?query=query($name: String!, $time: String){ some(name: $name, time: $time){ a b c } }&variables={"name": "ttt", "time": "123456789"}
    encoded url: localhost:8080/graphql?query=query(%24name%3A%20String!%2C%20%24time%3A%20String)%7B%20some(name%3A%20%24name%2C%20time%3A%20%24time)%7B%20a%20b%20c%20%7D%20%7D&variables=%7B%22name%22%3A%20%22ttt%22%2C%20%22time%22%3A%20%22123456789%22%7D

使用variables时需要注意:
<1> 使用$来定义变量,类似于placeholder的作用,没有它的声明,variables是解析不出变量的
<2> &不可以被炼化,哦不,不可以被urlencode,即queryvariables两部分要分别进行urlencode,否则variables解析会失常

以上对比明显可以看到,使用variables时API更复杂,那么这样图啥?
主要是variables解析结果不同,直接上实操图吧,这是基于graphql-java-examples二三四次修改开发的,图中是两种传参方式的解析结果对比:

2.png

关于传参更准确的解释还是参考官方文档passing-arguments
折腾两三回之后再回头去看文档,发现自己明白了更多,从0开始的时候,明明白白地写在眼前也是有可能被忽略的。

其实最好玩的是graphiql:

3.png

相关文章

网友评论

      本文标题:(原创)GraphQL API的参数怎么传?

      本文链接:https://www.haomeiwen.com/subject/ypgmaqtx.html