Another option to call the Internet Computer canisters from Java is to use QueryBuilder and UpdateBuilder.
Use these options if direct manipulation with Candid data is required or there is a requirement for dynamic invocation.
Create byte[] array binary Candid payload as an input argument using IDLArgs.
List<IDLValue> args = new ArrayList<IDLValue>();
BigInteger intValue = new BigInteger("10000");
args.add(IDLValue.create(intValue));
IDLArgs idlArgs = IDLArgs.create(args);
byte[] payload = idlArgs.toBytes();
QueryBuilder Method create has 3 arguments, agent, canister id principal and method name.
Optionally, the expiration time can be set using Methods expireAfter or expireAt.
Pass binary payload as a parameter of arg method and execute using Method call.
CompletableFuture<byte[]> response = QueryBuilder
.create(agent, Principal.fromString(canisterid), "echoInt")
.expireAfter(Duration.ofMinutes(3))
.arg(payload)
.call();
UpdateBuilder uses very similar syntax to Method create, but has one extra method, **callAndWait ,**if explicit Waiter definition is required.
CompletableFuture<byte[]> response = UpdateBuilder
.create(agent, Principal.fromString(canisterid), "greet")
.expireAfter(Duration.ofMinutes(3))
.arg(payload)
.callAndWait(Waiter.create(60, 5));
Use this to convert response payload to Java objects from binary Candid response payload.
byte[] output = response.get();
IDLArgs outArgs = IDLArgs.fromBytes(output);