GraphQL风格的接口发送GETPOST请求
Posted 程序员老姜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GraphQL风格的接口发送GETPOST请求相关的知识,希望对你有一定的参考价值。
https://tomoya92.github.io/2019/04/06/graphql-get-post/
博客最后留下了几个问题,其中有一个是graphql风格接口怎么发送post请求保存数据,这一篇来介绍一下方法
准备环境
graphq l风格接口的搭建可以看 博客,这里不多说
既然要保存数据,这篇博客是在上一篇博客的基础了将数据源改成了jpa从数据库里查询的了,这一块不多说
请求
上一篇最后测试用的是 graphql-playground
工具测试的,其实是不知道它背后怎么发送的请求
那么graphql风格接口使用传统的调用接口的方式,链接应该是怎么样的呢?
GET和POST都一样: http://localhost:8080/graphql?query={bookById(id: 1) {id,name, pageCount, author{id, name}, category {id, name}}}
就一个参数 query
后面的内容就是使用 graphql-playground
工具测试写的内容了,知道怎么写的了,其它的比如鉴权,删除都会了,下面给一个例子
定义Query
既然要添加post请求,肯定要在schema里定义一个query方法
1type Query {
2 bookById(id: ID): Book
3 books: [Book],
4 # 保存数据的接口
5 bookSave(name: String, pageCount: Int, authorId: Int, categoryId: Int): Book
6}
实现
在 GraphQLProvider
类里修改方法 buildWiring()
内容
1private RuntimeWiring buildWiring() {
2 return RuntimeWiring.newRuntimeWiring()
3 // 指定Query对象里定义的方法如何实现
4 .type(newTypeWiring("Query")
5 .dataFetcher("books", graphQLDataFetchers.getBooksDataFetcher())
6 .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher())
7 // 定义bookSave方法的实现方式
8 .dataFetcher("bookSave", graphQLDataFetchers.saveBookDataFetcher())
9 )
10 // 指定Book对象里定义的对象如何查询
11 .type(newTypeWiring("Book")
12 .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher())
13 .dataFetcher("category", graphQLDataFetchers.getCategoryDataFetcher()))
14 .build();
15}
另外在类 GraphQLDataFetchers
中添加 bookSave()
方法的实现,就是将请求参数里的内容持久化到数据库
1public DataFetcher saveBookDataFetcher() {
2 return dataFetchingEnvironment -> {
3 // 这里getArgument方法返回的是一个泛型T,也就是在schema里定义方法时指定参数的类型是啥,这里就用啥类型接收,不用转换
4 // 如果转换这里还会报错
5 String name = dataFetchingEnvironment.getArgument("name");
6 Integer pageCount = dataFetchingEnvironment.getArgument("pageCount");
7 Integer authorId = dataFetchingEnvironment.getArgument("authorId");
8 Integer categoryId = dataFetchingEnvironment.getArgument("categoryId");
9 // 调用jpa save方法,将数据入库
10 return bookService.save(name, pageCount, authorId, categoryId);
11 };
12}
测试
直接在postman里发送请求 http://localhost:8080/graphql?query={bookSave(name: "Node.JS入门与精通", pageCount: 300, authorId: 2, categoryId: 2) {id,name, pageCount, author{id, name}, category {id, name}}}
返回值
1{
2 "data": {
3 "bookSave": {
4 "id": "5",
5 "name": "Node.JS入门与精通",
6 "pageCount": 300,
7 "author": {
8 "id": "2",
9 "name": "李四"
10 },
11 "category": {
12 "id": "2",
13 "name": "文学"
14 }
15 }
16 }
17}
其实到这里应该就能看出来了,graphql风格接口里貌似没有get, post, put, delete等概念了,这样一想,又有新问题了。。
总结
测试中可以看到,get,post请求已经没有那么明显的区别了,那么
文件上传怎么办呢?
另外还有一点,有没有发现java bean中的属性跟定义的schema是不是很像,那么spring框架有没有对这个做复用的处理方式呢?
继续折腾中。。。
相关文章
END-
以上是关于GraphQL风格的接口发送GETPOST请求的主要内容,如果未能解决你的问题,请参考以下文章