public class HttpUtil {
// 支持直接在String参数中传入文件
public static final String FILE_LABEL = "file:";
public static IResponse executeRequest(String url, String param, RequestMethod method,
Map<String, String> headers) {
return executeRequest(createDefaultHelper(), url, param, method, headers);
}
public static IResponse executeRequest(IHttpHelper httpHelper, String url, String param,
RequestMethod method, Map<String, String> headers) {
IResponse response = null;
if (param != null && param.startsWith(FILE_LABEL)) {
// 单个文件
File file = new File(param.substring(FILE_LABEL.length()));
response = httpHelper.executeRequest(new RequestParam(url, file, method, headers));
} else {
JSONObject jsonData = safeParseAsJson(param);
if (jsonData != null) {
if (param.contains(FILE_LABEL)) {
// 参数中包含文件
HashMap<String, Object> paramMap = new HashMap<String, Object>(5);
for (Map.Entry<String, Object> entry : jsonData.entrySet()) {
if (entry.getValue() instanceof String
&& ((String) entry.getValue()).startsWith(FILE_LABEL)) {
File newFile = new File(((String) entry.getValue()).substring(FILE_LABEL.length()));
// 转换为File对象
paramMap.put(entry.getKey(), newFile);
} else {
paramMap.put(entry.getKey(), entry.getValue());
}
}
response = httpHelper.executeRequest(new RequestParam(url, paramMap, method, headers));
} else {
response = httpHelper.executeRequest(new RequestParam(url, jsonData, method, headers));
}
} else {
response = httpHelper.executeRequest(new RequestParam(url, param, method, headers));
}
}
return response;
}
public static IResponse executeRequest(String url, String param, RequestMethod method) {
return executeRequest(url, param, method, null);
}
public static IResponse executeRequest(String url, String param) {
return executeRequest(url, param, RequestMethod.GET, null);
}
public static IResponse executeRequest(String url) {
return executeRequest(url, null, RequestMethod.GET, null);
}
public static IResponse executeRequest(RequestParam param) {
return executeRequest(createDefaultHelper(), param);
}
private static IResponse executeRequest(IHttpHelper httpHelper, RequestParam param) {
if (param.getParam() != null && param.getParam() instanceof String) {
return executeRequest(httpHelper, param.getUrl(), (String) param.getParam(),
param.getMethod(), param.getHeaders());
} else {
return httpHelper.executeRequest(param);
}
}
public static IResponse[] executeRequest(RequestParam[] params) {
if (params != null && params.length > 0) {
IHttpHelper httpHelper = createDefaultHelper();
IResponse[] responseArray = new IResponse[params.length];
for (int i = 0; i < params.length; i++) {
responseArray[i] = executeRequest(httpHelper, params[i]);
}
return responseArray;
}
return null;
}
public static List<IResponse> executeRequest(List<RequestParam> params) {
if (params != null && params.size() > 0) {
IHttpHelper httpHelper = createDefaultHelper();
ArrayList<IResponse> list = new ArrayList<IResponse>();
for (int i = 0; i < params.size(); i++) {
list.add(executeRequest(httpHelper, params.get(i)));
}
return list;
}
return null;
}
public static String executeRequestForText(String url, String param, RequestMethod method,
Map<String, String> headers) {
IResponse response = executeRequest(url, param, method, headers);
return response.parseAsString();
}
public static String executeRequestForText(String url, String param, RequestMethod method) {
return executeRequestForText(url, param, method, null);
}
public static String executeRequestForText(String url, String param) {
return executeRequestForText(url, param, RequestMethod.GET, null);
}
public static String executeRequestForText(String url) {
return executeRequestForText(url, null, RequestMethod.GET, null);
}
public static String executeRequestForText(RequestParam param) {
return createDefaultHelper().executeRequest(param).parseAsString();
}
private static OkHttpHelper createOkHttpHelper() {
return new OkHttpHelper();
}
public static IHttpHelper createDefaultHelper() {
return createOkHttpHelper();
}
private static JSONObject safeParseAsJson(String jsonStr) {
try {
Object obj = JSON.parseObject(jsonStr);
if (obj != null && obj instanceof JSONObject) {
return (JSONObject) obj;
}
} catch (Exception e) {
// e.printStackTrace();
}
return null;
}
}
public interface IHttpHelper {
IResponse executeRequest(RequestParam param);
enum RequestMethod {
GET, POST, PUT, DELETE
}
interface IResponse {
int status();
String message();
boolean isSuccessful();
long costTime();
long contentLength();
InputStream inputStream();
String parseAsString();
String header(String name);
}
class RequestParam {
private RequestMethod method;
private String url;
private Object param;
private Map<String, String> headers;
public RequestParam(String url, Object param, RequestMethod method,
Map<String, String> headers) {
this.url = url;
this.param = param;
this.method = method;
this.headers = headers;
}
public RequestParam(String url, Object param, RequestMethod method) {
this(url, param, method, null);
}
public RequestParam(String url, Object param) {
this(url, param, RequestMethod.GET, null);
}
public RequestParam(String url) {
this(url, null, RequestMethod.GET, null);
}
public RequestMethod getMethod() {
return method;
}
public void setMethod(RequestMethod method) {
this.method = method;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public Object getParam() {
return param;
}
public void setParam(Object param) {
this.param = param;
}
public Map<String, String> getHeaders() {
return headers;
}
public void setHeaders(Map<String, String> headers) {
this.headers = headers;
}
}
}
public class OkHttpHelper implements IHttpHelper {
private final static String CHAR_SET = "utf-8";
private final static int CONNECT_TIME_IN_SECOND = 60;
private final static int WRITE_TIME_IN_SECOND = 60;
private final static int READ_TIME_IN_SECOND = 60;
public ConnectionPool connectionPool;
private OkHttpClient httpClient;
public OkHttpHelper() {
init();
}
private void init() {
connectionPool = new ConnectionPool(1, 5L, TimeUnit.SECONDS);
httpClient = new OkHttpClient.Builder().connectionPool(connectionPool)
.connectTimeout(CONNECT_TIME_IN_SECOND, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIME_IN_SECOND, TimeUnit.SECONDS)
.readTimeout(READ_TIME_IN_SECOND, TimeUnit.SECONDS).cookieJar(new CookieJar() {
// 增加cookie支持(保持session)
private HashMap<String, List<Cookie>> cookieMap = new HashMap<String, List<Cookie>>(1);
public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {
cookieMap.put(httpUrl.host(), list);
}
public List<Cookie> loadForRequest(HttpUrl httpUrl) {
List<Cookie> list = cookieMap.get(httpUrl.host());
if (list == null) {
list = new ArrayList<Cookie>();
}
return list;
}
}).build();
}
public OkHttpResponse executeRequest(String url, Object param, RequestMethod method,
Map<String, String> headers) {
Request request = makeRequest(url, param, method, headers);
return executeRequest(request);
}
public OkHttpResponse executeRequest(String url, Map<String, Object> params, RequestMethod method,
Map<String, String> headers) {
Request request = makeRequest(url, params, method, headers);
return executeRequest(request);
}
public OkHttpResponse executeRequest(String url) {
return executeRequest(url, null);
}
public OkHttpResponse executeRequest(String url, Map<String, Object> params) {
return executeRequest(url, params, RequestMethod.GET);
}
public OkHttpResponse executeRequest(String url, Object param) {
return executeRequest(url, param, RequestMethod.GET);
}
public OkHttpResponse executeRequest(String url, Object param, RequestMethod method) {
return executeRequest(url, param, method, null);
}
public OkHttpResponse executeRequest(String url, Map<String, Object> params,
RequestMethod method) {
return executeRequest(url, params, method, null);
}
public IResponse executeRequest(RequestParam param) {
if (param.getParam() != null && param.getParam() instanceof Map) {
return executeRequest(param.getUrl(), (Map<String, Object>) param.getParam(),
param.getMethod(), param.getHeaders());
} else {
return executeRequest(param.getUrl(), param.getParam(), param.getMethod(),
param.getHeaders());
}
}
public OkHttpResponse executeRequest(Request request) {
try {
Response response = httpClient.newCall(request).execute();
return new OkHttpResponse(response);
} catch (IOException e) {
e.printStackTrace();
OkHttpResponse res = new OkHttpResponse(null);
res.setException(e);
return res;
}
}
protected Request makeRequest(String url, Object param, RequestMethod method,
Map<String, String> headers) {
Request.Builder builder = new Request.Builder();
builder.url(url);
Headers newHeaders = buildHeader(headers);
if (newHeaders != null) {
builder.headers(newHeaders);
}
switch (method) {
case GET:
if (param != null && param instanceof String) {
String newUrl = buildUrl(url, (String) param);
builder.url(newUrl);
}
builder.get();
break;
case POST:
builder.post(buildBody(param));
break;
case PUT:
builder.put(buildBody(param));
break;
case DELETE:
if (param == null) {
builder.delete();
} else {
builder.delete(buildBody(param));
}
break;
default:
break;
}
return builder.build();
}
protected Request makeRequest(String url, Map<String, Object> params, RequestMethod method,
Map<String, String> headers) {
Request.Builder builder = new Request.Builder();
builder.url(url);
Headers newHeaders = buildHeader(headers);
if (newHeaders != null) {
builder.headers(newHeaders);
}
switch (method) {
case GET:
String newUrl = buildUrl(url, params);
builder.url(newUrl);
builder.get();
break;
case POST:
builder.post(buildBody(params));
break;
case PUT:
builder.put(buildBody(params));
break;
case DELETE:
if (params == null) {
builder.delete();
} else {
builder.delete(buildBody(params));
}
break;
default:
break;
}
return builder.build();
}
private Headers buildHeader(Map<String, String> headers) {
if (!isEmpty(headers)) {
Headers.Builder builder = new Builder();
for (Map.Entry<String, String> entry : headers.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
return builder.build();
}
return null;
}
private String buildUrl(String url, Map<String, Object> params) {
if (url != null && !isEmpty(params)) {
StringBuilder sb = new StringBuilder(url);
for (Map.Entry<String, Object> entry : params.entrySet()) {
if (sb.indexOf("?") == -1) {
sb.append("?");
} else {
sb.append("&");
}
sb.append(entry.getKey());
sb.append("=");
sb.append(entry.getValue());
}
return sb.toString();
}
return url;
}
private String buildUrl(String url, String param) {
if (url != null && param != null) {
StringBuilder sb = new StringBuilder(url);
if (sb.indexOf("?") == -1) {
sb.append("?");
} else {
sb.append("&");
}
sb.append(param);
return sb.toString();
}
return url;
}
private RequestBody buildBody(Map<String, Object> params) {
if (!isEmpty(params)) {
if (isSimpleFormParam(params)) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, Object> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue().toString());
}
return builder.build();
} else {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
for (Map.Entry<String, Object> entry : params.entrySet()) {
Object data = entry.getValue();
if (isSupportMedia(data)) {
addSupportMedia(builder, entry.getKey(), data);
} else {
builder.addFormDataPart(entry.getKey(), data.toString());
}
}
return builder.build();
}
}
return null;
}
private RequestBody buildBody(Object param) {
if (param != null) {
if (param instanceof JSONObject || param instanceof JSONArray) {
String json = null;
if (param instanceof JSONObject) {
json = ((JSONObject) param).toJSONString();
} else {
json = ((JSONArray) param).toJSONString();
}
return RequestBody.create(MediaType.parse("application/json"), json);
} else if (param instanceof String) {
return RequestBody.create(MediaType.parse("text/plain"), (String) param);
} else if (param instanceof File) {
File file = (File) param;
return RequestBody.create(parseMediaTypeByFileName(file), file);
}
}
return null;
}
private boolean isEmpty(Map map) {
return map == null || map.isEmpty();
}
private void addSupportMedia(MultipartBody.Builder builder, String name, Object object) {
if (object instanceof JSONObject || object instanceof JSONArray) {
String str = JSON.toJSONString(object);
builder.addFormDataPart(name, str);
} else if (object instanceof File) {
File file = (File) object;
RequestBody fileBody = RequestBody.create(parseMediaTypeByFileName(file), file);
builder.addFormDataPart(name, file.getName(), fileBody);
}
}
private MediaType parseMediaTypeByFileName(File file) {
String fileName = file.getName().toLowerCase();
if (fileName.endsWith(".png")) {
return MediaType.parse("image/png");
} else if (fileName.endsWith(".jpg")) {
return MediaType.parse("image/jpeg");
} else if (fileName.endsWith(".bmp")) {
return MediaType.parse("application/x-bmp");
} else if (fileName.endsWith(".gif")) {
return MediaType.parse("image/gif");
} else if (fileName.endsWith(".mp3")) {
return MediaType.parse("audio/mp3");
} else if (fileName.endsWith(".mp4")) {
return MediaType.parse("video/mpeg4");
}
return MediaType.parse("application/octet-stream");
}
private boolean isSupportMedia(Object object) {
if (object != null) {
if (object instanceof JSONObject || object instanceof JSONArray || object instanceof File) {
return true;
}
}
return false;
}
private boolean isSimpleFormParam(Map<String, Object> params) {
if (!isEmpty(params)) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
Object data = entry.getValue();
if (isSupportMedia(data)) {
return false;
}
}
}
return true;
}
public static class OkHttpResponse implements IResponse {
private Response mResponse;
private String mResonseText;
private Exception mException;
private long mContentLength = -1;
public OkHttpResponse(Response response) {
mResponse = response;
}
public Exception getException() {
return mException;
}
public void setException(Exception msg) {
mException = msg;
}
public int status() {
if (mResponse == null) {
if (mException != null) {
return -2;
}
} else {
return mResponse.code();
}
return -1;
}
public String message() {
if (mResponse == null) {
if (mException != null) {
return mException.getMessage() == null ? mException.getClass().getName()
: mException.getMessage();
}
} else {
return mResponse.message();
}
return null;
}
public boolean isSuccessful() {
return mResponse == null ? false : mResponse.isSuccessful();
}
public long costTime() {
return mResponse == null ? -1
: mResponse.receivedResponseAtMillis() - mResponse.sentRequestAtMillis();
}
public long contentLength() {
if (mResonseText == null) {
return (mResponse == null || mResponse.body() == null) ? -1
: mResponse.body().contentLength();
} else {
return mContentLength;
}
}
public InputStream inputStream() {
if (mResponse != null && mResponse.body() != null) {
return mResponse.body().byteStream();
}
return null;
}
public String parseAsString() {
if (mResonseText == null) {
if (mResponse != null && mResponse.body() != null) {
try {
mResonseText = mResponse.body().string();
if (mResonseText != null && mContentLength == -1) {
mContentLength = mResonseText.getBytes().length;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
return mResonseText;
}
public String header(String name) {
if (mResponse != null) {
return mResponse.header(name);
}
return null;
}
public Response getRawResponse() {
return mResponse;
}
}
}
public interface SendService {
public String atDingTalk(String msg, String atMobiles[], String url, boolean isAtAll);
public String linkDingTalk(String text, String title, String picUrl, String link, String url);
public String markdownDingTalk(String text, String title, String[] atMobiles, boolean isAtAll,
String url);
String actionCardDingTalk(String text, String title, String singleTitle, String singleURL,
String url, String hideAvatar, String btnOrientation);
String allActionCardDingTalk(String text, String title, String btns, String url,
String hideAvatar, String btnOrientation);
String sendMobileMsg(String json, String mid, String[] mobile, String msg);
String sendSimpleMail(String to, String subject, String content) throws Exception;
}
@Service
public class SendServiceImpl implements SendService {
@Autowired
private JavaMailSender mailSender;
@Value("${mail.fromMail.addr}")
private String from;
@Override
public String atDingTalk(String message, String atMobiles[], String url, boolean isAtAll) {
OkHttpHelper httpHelper = new OkHttpHelper();
List<String> msgList = new ArrayList<String>();
JSONObject msg = new JSONObject();
Map<String, Object> text = new HashMap<String, Object>();
msg.put("msgtype", "text");
text.put("content", message);
text.put("isAtAll", isAtAll);
msg.put("text", text);
if (atMobiles == null) {
msgList.add("");
} else {
for (String s : atMobiles)
msgList.add(s);
}
text.put("atMobiles", msgList);
Object jsonObject = JSON.parse(msg.toString());
IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);
System.out.println("===" + r.parseAsString());
return r.parseAsString();
}
@Override
public String linkDingTalk(String text, String title, String picUrl, String messageUrl,
String url) {
OkHttpHelper httpHelper = new OkHttpHelper();
JSONObject msg = new JSONObject();
JSONObject link = new JSONObject();
msg.put("msgtype", "link");
link.put("title", title);
link.put("picUrl", picUrl);
link.put("messageUrl", messageUrl);
link.put("text", text);
msg.put("link", link);
Object jsonObject = JSON.parse(msg.toString());
IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);
System.out.println("===" + r.parseAsString());
return r.parseAsString();
}
@Override
public String markdownDingTalk(String text, String title, String[] atMobiles, boolean isAtAll,
String url) {
OkHttpHelper httpHelper = new OkHttpHelper();
List<String> msgList = new ArrayList<String>();
JSONObject msg = new JSONObject();
JSONObject markdown = new JSONObject();
msg.put("msgtype", "markdown");
markdown.put("text", text);
markdown.put("title", title);
if (atMobiles == null) {
markdown.put("atMobiles", "");
} else {
for (String s : atMobiles)
msgList.add(s);
markdown.put("atMobiles", msgList.toString());
}
markdown.put("isAtAll", isAtAll);
msg.put("markdown", markdown);
Object jsonObject = JSON.parse(msg.toString());
IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);
System.out.println("===" + r.parseAsString());
return r.parseAsString();
}
@Override
public String actionCardDingTalk(String text, String title, String singleTitle, String singleURL,
String url, String hideAvatar, String btnOrientation) {
OkHttpHelper httpHelper = new OkHttpHelper();
JSONObject msg = new JSONObject();
JSONObject actionCard = new JSONObject();
msg.put("msgtype", "actionCard");
actionCard.put("text", text);
actionCard.put("title", title);
actionCard.put("singleTitle", singleTitle);
actionCard.put("singleURL", singleURL);
actionCard.put("hideAvatar", hideAvatar);
actionCard.put("btnOrientation", btnOrientation);
msg.put("actionCard", actionCard);
Object jsonObject = JSON.parse(msg.toString());
IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);
System.out.println("===" + r.parseAsString());
return r.parseAsString();
}
@Override
public String allActionCardDingTalk(String text, String title, String btns, String url,
String hideAvatar, String btnOrientation) {
OkHttpHelper httpHelper = new OkHttpHelper();
JSONObject msg = new JSONObject();
JSONObject actionCard = new JSONObject();
msg.put("msgtype", "actionCard");
actionCard.put("text", text);
actionCard.put("title", title);
actionCard.put("btns", btns);
actionCard.put("httpHelper", httpHelper);
actionCard.put("btnOrientation", btnOrientation);
msg.put("actionCard", actionCard);
Object jsonObject = JSON.parse(msg.toString());
IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);
System.out.println("===" + r.parseAsString());
return r.parseAsString();
}
@Override
public String sendMobileMsg(String json, String mid, String[] mobile, String msg) {
OkHttpHelper httpHelper = new OkHttpHelper();
List<String> mobileList = new ArrayList<String>();
boolean flag = true;
for (String s : mobile)
mobileList.add(s);
for (String i : mobileList) {
try {
httpHelper.executeRequest("http://www.noahedu.com/sendMsgXiaoxuetong/api/sendmsg?json="
+ json + "&mid=" + mid + "&mobile=" + i + "&msg=" + msg);
} catch (Exception e) {
flag = false;
break;
}
}
if (flag) {
return "发送成功";
} else {
return "发送失败";
}
}
@Override
public String sendSimpleMail(String to, String subject, String content) throws Exception {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (Exception e) {
e.printStackTrace();
return "发送失败";
}
return "发送成功";
}
}
spring.mail.host=smtp.xxx.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8
spring.mail.properties.mail.smtp.starttls.enable=flase
spring.mail.properties.mail.smtp.starttls.required=flase