Java11 Httpclient のレスポンスをJSONとして受け取るケース

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-jackJSON読込みツール 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();