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请求的主要内容,如果未能解决你的问题,请参考以下文章

HttpClient发送get,post接口请求

java发送http的getpost请求

java发送http的getpost请求

Java中发送http的getpost请求

java发送http的getpost请求

java发送http的getpost请求