package com.primeton.dgs.web.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.net.HttpHeaders;
import com.google.common.net.MediaType;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.io.Writer;
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.List;
/**
*
* Rest 服务转换. Add:METQI-45,Http RestApi 输入输出工具类
*
*
*
* Created by zhaopx.
* User: zhaopx
* Date: 2019/9/5
* Time: 09:21
*
*
*
* @author zhaopx
*/
public class RestApiIOUtils {
/**
* 把 Java Bean 转为 JSON 字符串
* @param bean
* @return
*/
public static String convertString(Object bean) {
if(bean instanceof JSON) {
// 如果是 JSON 对象
return ((JSON)bean).toJSONString();
}
if(bean instanceof Array || bean instanceof Collection) {
// 集合类型、数组类型返回 array 数组
return JSONArray.toJSONString(bean);
}
return JSONObject.toJSONString(bean);
}
/**
* 把 Java Bean 转为 JSON 字符串
* @param bean
* @return
*/
public static void output(T bean, OutputStream out) throws IOException {
IOUtils.copy(new StringReader(convertString(bean)), out);
}
/**
* 把 Java Bean 转为 JSON 字符串
* @param bean
* @return
*/
public static void output(Object bean, Writer out) throws IOException {
IOUtils.copy(new StringReader(convertString(bean)), out);
}
/**
* 把 Java Bean 转为 JSON 字符串,并从 HttpServletResponse 输出
* @param bean
* @return
*/
public static void output(Object bean,
HttpServletResponse response) {
output(bean, response, "UTF-8");
}
/**
* 把 Java Bean 转为 JSON 字符串,并从 HttpServletResponse 输出
* @param bean
* @return
*/
public static void output(Object bean,
HttpServletResponse response,
String charset) {
response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.JSON_UTF_8.toString());
response.setCharacterEncoding(charset);
try {
IOUtils.copy(new StringReader(convertString(bean)), response.getWriter());
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* 把 Rest API 中提交的 JSON 表单数据,转为 clazz 指定的 Bean 类型的 LIST 集合
* @param request HttpRestAPI
* * @param clazz JSON 能转换的 Class
* @return
*/
public static List beanArray(HttpServletRequest request,
Class clazz) {
String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
try {
String json = StringUtils.trim(IOUtils.toString(request.getReader()));
// Rest API 接口
if(json.startsWith("[") && json.endsWith("]")) {
return JSONObject.parseArray(json, clazz);
}
throw new IllegalArgumentException("错误的数组消息实体。" + json);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* 把 Rest API 中提交的 JSON 表单数据,转为 clazz 指定的 Bean 类型
* @param request HttpRestAPI
* @param clazz JSON 能转换的 Class
* @return
*/
public static T beanObject(HttpServletRequest request,
Class clazz) {
String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
try {
String json = StringUtils.trim(IOUtils.toString(request.getReader()));
// Rest API 接口
if(json.startsWith("{") && json.endsWith("}")) {
return JSONObject.parseObject(json, clazz);
}
throw new IllegalArgumentException("错误的消息对象实体。" + json);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
/**
* 把 Rest API 中提交的 JSON 表单数据,转为 JSON 类型
* @param request HttpRestAPI
* @return
*/
public static JSON jsonObject(HttpServletRequest request) {
String contentType = request.getHeader(HttpHeaders.CONTENT_TYPE);
try {
String json = StringUtils.trim(IOUtils.toString(request.getReader()));
// Rest API 接口
if(json.startsWith("{") && json.endsWith("}")) {
return JSONObject.parseObject(json);
} else if(json.startsWith("[") && json.endsWith("]")) {
return JSON.parseArray(json);
}
throw new IllegalArgumentException("错误的消息对象实体。" + json);
} catch (IOException e) {
throw new IllegalStateException(e);
}
}
}