package com.foxinmy.weixin4j.http.weixin; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.TypeReference; import com.foxinmy.weixin4j.http.HttpHeaders; import com.foxinmy.weixin4j.http.HttpResponse; import com.foxinmy.weixin4j.http.HttpStatus; import com.foxinmy.weixin4j.http.HttpVersion; import com.foxinmy.weixin4j.http.message.JsonMessageConverter; import com.foxinmy.weixin4j.http.message.MessageConverter; import com.foxinmy.weixin4j.http.message.XmlMessageConverter; import com.foxinmy.weixin4j.util.StringUtil; /** * 调用微信接口响应 * * @className WeixinResponse * @author jinyu * @date Jul 21, 2016 * @since JDK 1.6 */ public class WeixinResponse implements HttpResponse { private volatile String text; private final HttpResponse response; private static List<MessageConverter> messageConverters = new ArrayList<MessageConverter>(); private final TypeReference<ApiResult> APIRESULT_CLAZZ = new TypeReference<ApiResult>() { }; private final TypeReference<XmlResult> XMLRESULT_CLAZZ = new TypeReference<XmlResult>() { }; private final TypeReference<JSONObject> JSONOBJECT_CLAZZ = new TypeReference<JSONObject>() { }; static { messageConverters.add(new JsonMessageConverter()); messageConverters.add(new XmlMessageConverter()); } public WeixinResponse(HttpResponse response) { this.response = response; } public String getAsString() { if (text == null) { text = StringUtil.newStringUtf8(getContent()); } return text; } public ApiResult getAsResult() { return getAsObject(APIRESULT_CLAZZ); } public JSONObject getAsJson() { return getAsObject(JSONOBJECT_CLAZZ); } public XmlResult getAsXml() { return getAsObject(XMLRESULT_CLAZZ); } @SuppressWarnings("unchecked") public <T> T getAsObject(TypeReference<T> typeReference) { Class<T> clazz = (Class<T>) typeReference.getType(); for (MessageConverter messageConverter : messageConverters) { if (messageConverter.canConvert(clazz, response)) { try { return messageConverter.convert(clazz, response); } catch (IOException e) { throw new RuntimeException("IO error on convert to " + clazz, e); } } } if (clazz.isAssignableFrom(ApiResult.class)) { return (T) new ApiResult(); } throw new RuntimeException("cannot convert to " + clazz); } @Override public HttpHeaders getHeaders() { return response.getHeaders(); } @Override public HttpStatus getStatus() { return response.getStatus(); } @Override public byte[] getContent() { return response.getContent(); } @Override public InputStream getBody() { return response.getBody(); } @Override public HttpVersion getProtocol() { return response.getProtocol(); } @Override public void close() { response.close(); } }