/* * Copyright (c) 2018-2028, DreamLu All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: DreamLu 卢春梦 (596392912@qq.com) */ package org.springblade.core.http; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import okhttp3.*; import okhttp3.internal.Util; import org.springblade.core.tool.jackson.JsonUtil; import org.springblade.core.tool.utils.Exceptions; import javax.annotation.Nullable; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; /** * ok http 封装,相应结构体 * * @author L.cm */ public class HttpResponse implements ResponseSpec, Closeable { private final Request request; private final Response response; private final ResponseBody body; HttpResponse(final Response response) { this.request = response.request(); this.response = response; this.body = ifNullBodyToEmpty(response.body()); } @Override public int code() { return response.code(); } @Override public String message() { return response.message(); } @Override public boolean isOk() { return response.isSuccessful(); } @Override public boolean isRedirect() { return response.isRedirect(); } @Override public Headers headers() { return response.headers(); } @Override public List cookies() { return Cookie.parseAll(request.url(), this.headers()); } @Override public Request rawRequest() { return this.request; } @Override public Response rawResponse() { return this.response; } @Override public ResponseBody rawBody() { return this.body; } @Override public String asString() { try { return body.string(); } catch (IOException e) { throw Exceptions.unchecked(e); } } @Override public byte[] asBytes() { try { return body.bytes(); } catch (IOException e) { throw Exceptions.unchecked(e); } } @Override public InputStream asStream() { return body.byteStream(); } @Override public JsonNode asJsonNode() { return JsonUtil.readTree(asBytes()); } @Override public T asValue(Class valueType) { return JsonUtil.readValue(asBytes(), valueType); } @Override public T asValue(TypeReference typeReference) { return JsonUtil.readValue(asBytes(), typeReference); } @Override public List asList(Class valueType) { return JsonUtil.readList(asBytes(), valueType); } @Override public Map asMap(Class keyClass, Class valueType) { return JsonUtil.readMap(asBytes(), keyClass, valueType); } @Override public Map asMap(Class valueType) { return this.asMap(String.class, valueType); } @Override public T asDomValue(Class valueType) { return DomMapper.readValue(this.asStream(), valueType); } @Override public List asDomList(Class valueType) { return DomMapper.readList(this.asStream(), valueType); } @Override public File toFile(File file) { toFile(file.toPath()); return file; } @Override public Path toFile(Path path) { try { Files.copy(this.asStream(), path); return path; } catch (IOException e) { throw Exceptions.unchecked(e); } } @Override public MediaType contentType() { return body.contentType(); } @Override public long contentLength() { return body.contentLength(); } @Override public String toString() { return response.toString(); } private static ResponseBody ifNullBodyToEmpty(@Nullable ResponseBody body) { return body == null ? Util.EMPTY_RESPONSE : body; } @Override public void close() throws IOException { Util.closeQuietly(this.body); } }