package com.whyc.util; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.whyc.dto.Response; import com.whyc.dto.Response4Http; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.*; import java.lang.reflect.Type; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; public class HttpUtil { /* * 获取HttpServletRequest */ public static HttpServletRequest getRequest(){ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = requestAttributes.getRequest(); return request; } /* * 获取HttpServletResponse */ public static HttpServletResponse getResponse(){ ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletResponse response = requestAttributes.getResponse(); return response; } /* * 获取HttpSession */ public static HttpSession getSession(){ return getRequest().getSession(); } /** * * @return 返回application */ public static ServletContext getApplication(){ return getSession().getServletContext(); } /** * get方式的http请求 * * @param httpUrl 请求地址 * @return 返回结果 */ public static Response doGet(String httpUrl, String queryParams) { HttpURLConnection connection = null; InputStream inputStream = null; BufferedReader bufferedReader = null; String result = null;// 返回结果字符串 Response response = new Response<>(); try { // 创建远程url连接对象 URL url = new URL(new StringBuffer(httpUrl).append("?").append(queryParams).toString()); // 通过远程url连接对象打开一个连接,强转成httpURLConnection类 connection = (HttpURLConnection) url.openConnection(); // 设置连接方式:get connection.setRequestMethod("GET"); // 设置连接主机服务器的超时时间:15000毫秒 connection.setConnectTimeout(5000); // 设置读取远程返回的数据时间:60000毫秒 connection.setReadTimeout(6000); // 发送请求 connection.connect(); // 通过connection连接,获取输入流 if (connection.getResponseCode() == 200) { inputStream = connection.getInputStream(); // 封装输入流,并指定字符集 bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); // 存放数据 StringBuilder sbf = new StringBuilder(); String temp; while ((temp = bufferedReader.readLine()) != null) { sbf.append(temp); sbf.append(System.getProperty("line.separator")); } result = sbf.toString(); response.set(1,result); } } catch (IOException e) { response.set(0); String message = e.getMessage(); response.setMsg(message); } finally { // 关闭资源 if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != inputStream) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect();// 关闭远程连接 } } return response; } public static Response doPost(String httpUrl, String requestBody) { HttpURLConnection connection = null; InputStream inputStream = null; OutputStream outputStream =null; BufferedReader bufferedReader = null; String result = null;// 返回结果字符串 Response response = new Response<>(); try { // 创建远程url连接对象 URL url = new URL(new StringBuffer(httpUrl).toString()); // 通过远程url连接对象打开一个连接,强转成httpURLConnection类 connection = (HttpURLConnection) url.openConnection(); // 设置连接方式:post connection.setRequestMethod("POST"); // 设置连接主机服务器的超时时间:15000毫秒 connection.setConnectTimeout(5000); // 设置读取远程返回的数据时间:60000毫秒 connection.setReadTimeout(6000); //设置contentType固定为application/json connection.setRequestProperty("contentType","application/json; utf-8"); //请求体 connection.setDoOutput(true); outputStream = connection.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(outputStream,"UTF-8"); osw.write(requestBody); osw.flush(); // 发送请求 connection.connect(); // 通过connection连接,获取输入流 if (connection.getResponseCode() == 200) { inputStream = connection.getInputStream(); // 封装输入流,并指定字符集 bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); // 存放数据 StringBuilder sbf = new StringBuilder(); String temp; while ((temp = bufferedReader.readLine()) != null) { sbf.append(temp); sbf.append(System.getProperty("line.separator")); } result = sbf.toString(); response.set(1); response.setData(result); } } catch (IOException e) { String message = e.getMessage(); response.set(0); response.setMsg(message); } finally { // 关闭资源 if (null != bufferedReader) { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != inputStream) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (connection != null) { connection.disconnect();// 关闭远程连接 } if (null != outputStream) { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } return response; } /** * 将map型转为请求参数型 * * @param data * @return */ public static String urlEncode(Map data) { StringBuilder sb = new StringBuilder(); for (Map.Entry i : data.entrySet()) { try { sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue() + "", "UTF-8")).append("&"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } String result = sb.toString(); result = result.substring(0, result.lastIndexOf("&")); return result; } /** * 用于Video 的Http接口请求 * 执行GET请求,传入Map参数和Url,获取响应 * 这个对原始的doGet方法进行了调用,对结果进行后续逻辑再处理,属于定制化的接口了. */ public static Response4Http doGet(String httpUrl, Map params) { Response4Http responseResult = new Response4Http<>(); String queryParams = urlEncode(params); Response response = HttpUtil.doGet(httpUrl, queryParams); Integer httpResponseCode = response.getCode(); String responseJson = (String) response.getData(); if(httpResponseCode == 1) { //请求成功 Response4Http responseHttp = JsonUtil.getGson().fromJson(responseJson, Response4Http.class); if(responseHttp.getCode() == 0 ) { //接口返回状态码为成功 //返回信息有 data属性 if(responseHttp.getData()!=null) { return responseResult.setII(1,true,responseHttp.getData(),null); } //返回信息有 status属性 else if(responseHttp.getStatus() !=null){ return responseResult.setStatus(1,true,responseHttp.getStatus()); } //返回信息有 result属性 else if(responseHttp.getResult() !=null){ responseResult.setResult(responseHttp.getResult()); return responseResult.set(1,true); } else{ return responseResult.set(1,true,"请求成功且返回数据正常,无数据信息"); } }else{ //接口返回状态码为失败 // 返回信息有 msg属性 return responseResult.set(1,false,responseHttp.getMsg()); } }else{ //请求失败 return responseResult.set(0,response.getData(),response.getMsg()); } } }