In diesem Blog verwenden wir den Java Standard java.net.http.HttpClient, welcher seit Java 11 vorhanden ist.
package ch.std.blog.rest.client;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.util.HashMap;
import java.util.Map;
import ch.std.blog.rest.json.JsonBodyHandler;
public class JsonRestClient {
public static void main(String[] args) throws IOException, InterruptedException {
String url = "https://www.simtech-ag.ch/std-ajax/randomservice?min=0&max=1000";
if (args.length > 1) {
url = args[0];
}
// create a client
var client = HttpClient.newHttpClient();
// create a request
var request = HttpRequest.newBuilder(URI.create(url))
.header("accept", "application/json").build();
// use the client to send the request
var response = client.send(request, new JsonBodyHandler<>(HashMap.class));
Map<?,?> responseMap = response.body().get();
System.out.println(responseMap);
}
}
package ch.std.blog.rest.json;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.net.http.HttpResponse;
import java.util.function.Supplier;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonBodyHandler<T> implements HttpResponse.BodyHandler<Supplier<T>> {
private static final ObjectMapper om = new ObjectMapper();
private final Class<T> targetClass;
public JsonBodyHandler(Class<T> targetClass) {
this.targetClass = targetClass;
}
@Override
public HttpResponse.BodySubscriber<Supplier<T>> apply(HttpResponse.ResponseInfo responseInfo) {
return asJSON(this.targetClass);
}
public static <W> HttpResponse.BodySubscriber<Supplier<W>> asJSON(Class<W> targetType) {
HttpResponse.BodySubscriber<InputStream> upstream = HttpResponse.BodySubscribers.ofInputStream();
return HttpResponse.BodySubscribers.mapping(
upstream,
inputStream -> toSupplierOfType(inputStream, targetType));
}
public static <W> Supplier<W> toSupplierOfType(InputStream inputStream, Class<W> targetType) {
return () -> {
try (InputStream stream = inputStream) {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(stream, targetType);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
};
}
}