java使用graphql client

2023-05-16

在项目中引用graphql client

目前这个graphql client只支持post的graphql server

使用maven构建依赖关系

<dependency>
  <groupId>org.mountcloud</groupId>
  <artifactId>graphql-client</artifactId>
  <version>1.2</version>
</dependency>

项目地址:GitHub

更新 1.2 日志

请求的参数支持自定义复杂类型和Enum类型。

用例

QUERY

构建graphql client

//graphql服务器地址
String serverUrl = "http://localhost:8080/graphql";
//build一个新的graphqlclient
GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);

//如果说graphql需要健全信息我们可以用map来进行传递
Map<String,String> httpHeaders = new HashMap<>();
httpHeaders.put("token","graphqltesttoken");
//设置http请求的头
graphqlClient.setHttpHeaders(httpHeaders);

发起一个简单的query查询

//创建一个Query并设置query的名字为findUser
//如果有特殊需要可以自己继承GraphqlQuery,DefaultGraphqlQuery已经可以满足所有请求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");

//我们需要查询user的名字,性别还有年龄,设置需要查询的这三个属性。
query.addResultAttributes("name","sex","age");

try {
    //执行query
    GraphqlResponse response = graphqlClient.doQuery(query);
    //获取数据,数据为map类型
    Map result = response.getData();
} catch (IOException e) {
    e.printStackTrace();
}

对应的graphql语句为:

query{
	findUser{
		name
		sex
		age
	}
}

 

设置复杂的查询结果

 

//创建一个Query并设置query的名字为findUser
//如果有特殊需要可以自己继承GraphqlQuery,DefaultGraphqlQuery已经可以满足所有请求了
GraphqlQuery query = new DefaultGraphqlQuery("findUser");

//------------------------------------------------------------------------
//查询名字为张三,年龄为23岁的人,这里的参数类型一定要与query的参数类型一致
query.addParameter("name","张三").addParameter("age",23);

//------------------------------------------------------------------------
//我们需要查询user的名字,性别还有年龄,设置需要查询的这三个属性。
query.addResultAttributes("name","sex","age");

//------------------------------------------------------------------------
//查询用户的部门
ResultAttributtes departmentAttr = new ResultAttributtes("department");
//查询部门的名字和编号
departmentAttr.addResultAttributes("name","code");

//查询部门所属的公司
ResultAttributtes companyAttr = new ResultAttributtes("company");
//查询部门所属公司的名字
companyAttr.addResultAttributes("name");

//将部门和公司两者关联起来
departmentAttr.addResultAttributes(companyAttr);

//将需要查询的这个语句放到query里
query.addResultAttributes(departmentAttr);

//------------------------------------------------------------------------
try {
    //执行query
    GraphqlResponse response = graphqlClient.doQuery(query);
    //获取数据,数据为map类型
    Map result = response.getData();
} catch (IOException e) {
    e.printStackTrace();
}

对应的graphql语句为:

query{
	findUser(name:"张三",age:23){
		name
		sex
		age
		department{
			name
			code
			company{
				name
			}
		}
	}
}

 

 

 

MUTATION

这里只写一个复杂的mutaion,其实跟query一样

//创建一个mutation并设置名字为updateUser
GraphqlMutation mutation = new DefaultGraphqlMutation("updateUser");

//设置参数,用户id为12,名字为张三,年龄为24
mutation.addParameter("id",12).addParameter("name","张三").addParameter("age",24);

//获取修改的结果
mutation.addResultAttributes("code");

//获取结果里的数据:data对象昂
ResultAttributtes dataAttr = new ResultAttributtes("data");
//获取data里的消息、修改执行状态与时间戳
dataAttr.addResultAttributes("message","state","date");

//将data与mutation关联起来
mutation.addResultAttributes(dataAttr);

//执行mutation
try {
    GraphqlResponse mutationResponse = graphqlClient.doMutation(mutation);
    //同样返回的数据也是map的
    Map mutationResult = mutationResponse.getData();
} catch (IOException e) {
    e.printStackTrace();
}

 

如何实现一个复杂请求

用Mutation做演示,query与mutation原理一样.

    @Test
    public void testObjectParameter() throws IOException {


        
        String serverUrl = "http://localhost:8080/graphql";
        
        GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);

        
        Map<String,String> httpHeaders = new HashMap<>();
        httpHeaders.put("token","graphqltesttoken");
        
        graphqlClient.setHttpHeaders(httpHeaders);

        GraphqlMutation mutation = new DefaultGraphqlMutation("addUser");

        List<User> users = new ArrayList<>();
        users.add(new User("tim",SexEnum.M));
        users.add(new User("sdf",SexEnum.F));
        mutation.getRequestParameter().addParameter("classId","123").addObjectParameter("users",users);

        mutation.addResultAttributes("code");

        System.out.println(mutation.toString());

    }

    /**
     * test user
     */
    class User{
        public User(String name, SexEnum sexEnum) {
            this.name = name;
            this.sexEnum = sexEnum;
        }

        private String name;
        private SexEnum sexEnum;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public SexEnum getSexEnum() {
            return sexEnum;
        }

        public void setSexEnum(SexEnum sexEnum) {
            this.sexEnum = sexEnum;
        }
    }

    /**
     * test user sex
     */
    enum SexEnum{
        M,
        F
    }

对应的mutation语句:

mutation{
  addUser(classId:"123",users:[{name:"tim",sexEnum:M},{name:"sdf",sexEnum:F}]){
    code
  }
}

欢迎评论留言讨论。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java使用graphql client 的相关文章

  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • 从插件设置 Maven 属性

    我在这里阅读了一些关于如何从 Maven 插件设置属性的问题 其中大多数讨论了应用程序的版本号 似乎没有简单的方法可以做到这一点 我发现的最佳解决方案是拥有一个从插件更新的 filter properties 文件 并由主 pom 文件使用
  • 如何制作具有两个索引的 Map?

    我在java中有一张这样的地图 Map
  • 确定列表编号是否连续

    我在 Java 工作 我有一个无序列表 包含 5 个数字 范围从 0 100 没有重复 我想检测其中 3 个数字是否连续且没有间隙 例子 9 12 13 11 10 true 17 1 2 3 5 true 19 22 23 27 55 f
  • JCombobox 字符串项(可见)和整数键(固有)

    我有一个数据库模式 它将作为 JTable 列显示在 JCombobox 中以选择名称 但我希望将 ID 字段插入 作为外键 到另一个表中 通常 在下拉列表中选择一个项目 将所选项目带到组合框的显示区域 我想要做的是 当选择组合框中的任何项
  • HashMap何时以及如何将桶从链表转换为红黑树? [复制]

    这个问题在这里已经有答案了 我正在研究 java 8 功能 发现当存储桶上的条目集数量增加时 哈希图使用红黑树而不是链表 但是 这是否不需要密钥是可比较的或存在某种密钥排序以及这是如何工作的 这种转变何时真正发生以及如何发生 当有at le
  • Java生成范围内不重复的随机数

    我想生成 1 到 4 范围内的随机数 包括 4 这是我的代码 int num r nextInt 4 1 r is instance of Random 但是 我在循环中运行上述代码 并且不想重复随机数 现在发生的事情我经常得到 1 1 1
  • IDEA:javac:源版本1.7需要目标版本1.7

    使用 IntelliJ IDEA 运行 JUnit 测试时 我得到 我该如何纠正这个问题 使用SDK 1 7 模块语言级别为1 7 Maven 构建工作正常 这就是为什么我相信IDEA配置问题 您很可能在此处从 Maven 导入了不正确的编
  • 从多个地方绘制 JPanel

    我目前正在为学校开发一款 Java 2D 游戏 我们必须使用抽象工厂设计模式 对于 2D 实现 我使用工厂如下 public class Java2DFact extends AbstractFactory public Display d
  • 如何将 Perforce 仓库位置转换为客户端视图位置

    我想知道如何将 Perforce 仓库位置转换为客户端视图位置以用于脚本编写 我有一个脚本 它首先检查文件以进行编辑 然后与该文件进行交互 我需要将仓库位置 即 Projects Project6 转换为客户端视图位置 即 d Projec
  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • JList 类型不采用参数类型

    当我尝试编译一些代码时 我不断收到这些错误 CCC java 21 type javax swing JList does not take parameters JList
  • 如何使用JSqlParser向sql添加where条件?

    我想用JSqlParser向sql添加where条件 例如 Before select from test table where a 1 group by c After select from test table where a 1
  • 从 Brixton.RC1 开始的 ZuulProxy 未传递授权标头

    从 Spring Cloud 切换时Brixton M5 to Brixton RC1我的 ZuulProxy 不再通过Authorization标头下游到我的代理服务 我的设置中有各种各样的角色 但大多数都相当简单 Authorizati
  • 正确的单元测试技术

    在使用 TDD 时 我发现自己需要测试一个包含查找值的常量 最终 哈希图 请查看更新中出现这种情况的原因 见下文 private static final Map
  • 如何找到 JAR:/home/hadoop/contrib/streaming/hadoop-streaming.jar

    我正在练习有关 Amazon EMR 的复数视角视频教程 我被困住了 因为我收到此错误而无法继续 Not a valid JAR home hadoop contrib streaming hadoop streaming jar 请注意
  • Java 8 流过滤器 - 基于排序的更新

    我正在尝试对过滤器中的字段进行排序 输入文件 样本记录 DocumentList Document id 5975ff00a213745b5e1a8ed9 u id mailboxcontent id 5975ff00a213745b5e1
  • java 更新进度条

    我有一个 JFrame 和以下组件 JButton jButton1 Progress Bar ProgressBar 及其公共静态 JLabel 状态及其公共静态 单击按钮时会执行不同的语句 我想在每个语句后更新我的进度条 这是我的代码

随机推荐