Java11 Httpclient のレスポンスをJSONとして受け取るケースを工夫してみる。
HttpResponse<String> で String 取得してからJSON にする方法
String url; // TODO URL string HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .GET() .build(); HttpClient client = HttpClient.newBuilder().version(HttpClient.Version.HTTP_1_1) .followRedirects(HttpClient.Redirect.NORMAL) .connectTimeout(Duration.ofSeconds(10)) .build(); // HTTP-BODY を String として受け取る HttpResponse<String> response = client.send(request, BodyHandlers.ofString()); // TODO HTTP status を確認する int httpstatus = response.statusCode();
https://github.com/yipuran/yipuran-jack の JSON読込みツール org.yipuran.json.JsonNodeParse を使って
import org.yipuran.json.JsonNodeParse; import com.fasterxml.jackson.databind.JsonNode;
String body = response.body(); // HTTP=BODY → JsonNode JsonNodeParse parser = new JsonNodeParse(); JsonNode node = parser.readTree(body);
JSON を表現する任意クラス(T) HttpResponse<T> で取得する方法
HttpRequest送信する sendメソッド引数を BodyHandlers<T> 実装を指定することになる。
ハンドラ内で、Jackson ObjectMapper で目的のクラスにデシリアライズする。
HttpResponse<T> response = client.send(request, responseInfo-> HttpResponse.BodySubscribers.mapping( HttpResponse.BodySubscribers.ofByteArray(), byteArray->{ try{ return new ObjectMapper().readValue(new ByteArrayInputStream(byteArray), LoginInfo.class); }catch(StreamReadException e){ // TODO Error }catch(DatabindException e){ // TODO Error }catch(IOException e){ // TODO Error } return null; } )); T t = response.body();
例外捕捉を書くのが煩わしい。
簡潔に書きたいので、yipuran-core で提供している Throwable な Function の実装を
使用する。
https://github.com/yipuran/yipuran-core/blob/master/src/main/java/org/yipuran/function/ThrowableFunction.java
HttpResponse<LoginInfo> response = client.send(request, responseInfo-> HttpResponse.BodySubscribers.mapping( HttpResponse.BodySubscribers.ofByteArray(), ThrowableFunction.of(byteArray-> new ObjectMapper().readValue(new ByteArrayInputStream(byteArray), T.class) ))); T t = response.body();