扩展JFinal的HttpKit

对HttpKit做了些扩展,增加了PUT、DELETE方法,可传入自定义SSLSocketFactory,代码如下:

public class HttpKit {

	private HttpKit() {
	}

	/**
	 * https 域名校验
	 */
	private class TrustAnyHostnameVerifier implements HostnameVerifier {
		public boolean verify(String hostname, SSLSession session) {
			return true;
		}
	}

	/**
	 * https 证书管理
	 */
	private class TrustAnyTrustManager implements X509TrustManager {
		public X509Certificate[] getAcceptedIssuers() {
			return null;
		}
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}
		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}
	}

	private static final String GET = "GET";
	private static final String POST = "POST";
	private static final String PUT = "PUT";
	private static final String DELETE = "DELETE";
	private static final String CHARSET = "UTF-8";

	private static final TrustAnyHostnameVerifier trustAnyHostnameVerifier = new HttpKit().new TrustAnyHostnameVerifier();

	private static SSLSocketFactory initSSLSocketFactory() {
		try {
			TrustManager[] tm = {new HttpKit().new TrustAnyTrustManager()};
			SSLContext sslContext = SSLContext.getInstance("TLS", "SunJSSE");
			sslContext.init(null, tm, new java.security.SecureRandom());
			return sslContext.getSocketFactory();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}

	private static HttpURLConnection getHttpConnection(String url, SSLSocketFactory sslSocketFactory, String method, Map<String, String> headers) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException {
		URL _url = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) _url.openConnection();
		if (conn instanceof HttpsURLConnection) {
			if (sslSocketFactory != null) {
				((HttpsURLConnection) conn).setSSLSocketFactory(sslSocketFactory);
			} else {
				((HttpsURLConnection) conn).setSSLSocketFactory(initSSLSocketFactory());
			}
			((HttpsURLConnection) conn).setHostnameVerifier(trustAnyHostnameVerifier);
		}

		conn.setRequestMethod(method);
		conn.setDoOutput(true);
		conn.setDoInput(true);

		conn.setConnectTimeout(19000);
		conn.setReadTimeout(19000);

		conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
		conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");

		if (headers != null && !headers.isEmpty())
			for (Entry<String, String> entry : headers.entrySet())
				conn.setRequestProperty(entry.getKey(), entry.getValue());

		return conn;
	}

	private static String read(String url, SSLSocketFactory sslSocketFactory, String method, Map<String, String> queryParas, Map<String, String> headers) {
		HttpURLConnection conn = null;
		try {
			conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), sslSocketFactory, method, headers);
			conn.connect();
			return readResponseString(conn);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
		}
	}

	/**
	 * Send GET request
	 */
	public static String get(String url, SSLSocketFactory sslSocketFactory, Map<String, String> queryParas, Map<String, String> headers) {
		return read(url, sslSocketFactory, GET, queryParas, headers);
	}

	public static String get(String url, Map<String, String> queryParas, Map<String, String> headers) {
		return get(url, null, queryParas, headers);
	}

	public static String get(String url, Map<String, String> queryParas) {
		return get(url, queryParas, null);
	}

	public static String get(String url) {
		return get(url, null);
	}

	public static byte[] getBytes(String url, SSLSocketFactory sslSocketFactory, Map<String, String> queryParas, Map<String, String> headers) {
		HttpURLConnection conn = null;
		try {
			conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), sslSocketFactory, GET, headers);
			conn.connect();
			return readResponseByte(conn);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
		}
	}

	public static byte[] getBytes(String url, Map<String, String> queryParas) {
		return getBytes(url, null, queryParas, null);
	}

	public static byte[] getBytes(String url) {
		return getBytes(url, null);
	}

	/**
	 * Send DELETE request
	 */
	public static String delete(String url, SSLSocketFactory sslSocketFactory, Map<String, String> queryParas, Map<String, String> headers) {
		return read(url, sslSocketFactory, DELETE, queryParas, headers);
	}

	public static String delete(String url, Map<String, String> queryParas) {
		return delete(url, null, queryParas, null);
	}

	public static String delete(String url) {
		return delete(url, null, null, null);
	}

	private static String write(String url, SSLSocketFactory sslSocketFactory, String method, Map<String, String> queryParas, String data, Map<String, String> headers) {
		HttpURLConnection conn = null;
		try {
			conn = getHttpConnection(buildUrlWithQueryString(url, queryParas), sslSocketFactory, method, headers);
			conn.connect();

			OutputStream out = conn.getOutputStream();
			out.write(data.getBytes(CHARSET));
			out.flush();
			out.close();

			return readResponseString(conn);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (conn != null) {
				conn.disconnect();
			}
		}
	}

	/**
	 * Send POST request
	 */
	public static String post(String url, SSLSocketFactory sslSocketFactory, Map<String, String> queryParas, String data, Map<String, String> headers) {
		return write(url, sslSocketFactory, POST, queryParas, data, headers);
	}

	public static String post(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
		return post(url, null, queryParas, data, headers);
	}

	public static String post(String url, Map<String, String> queryParas, String data) {
		return post(url, queryParas, data, null);
	}

	public static String post(String url, String data, Map<String, String> headers) {
		return post(url, null, data, headers);
	}

	public static String post(String url, String data) {
		return post(url, null, data, null);
	}

	/**
	 * Send PUT request
	 */
	public static String put(String url, SSLSocketFactory sslSocketFactory, Map<String, String> queryParas, String data, Map<String, String> headers) {
		return write(url, sslSocketFactory, PUT, queryParas, data, headers);
	}

	public static String put(String url, Map<String, String> queryParas, String data, Map<String, String> headers) {
		return put(url, null, queryParas, data, headers);
	}

	public static String put(String url, Map<String, String> queryParas, String data) {
		return put(url, queryParas, data, null);
	}

	public static String put(String url, String data, Map<String, String> headers) {
		return put(url, null, data, headers);
	}

	public static String put(String url, String data) {
		return put(url, null, data, null);
	}

	private static String readResponseString(HttpURLConnection conn) {
		StringBuilder sb = new StringBuilder();
		InputStream inputStream = null;
		try {
			inputStream = conn.getInputStream();
			BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, CHARSET));
			String line = null;
			while ((line = reader.readLine()) != null) {
				sb.append(line).append("\n");
			}
			return sb.toString();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private static byte[] readResponseByte(HttpURLConnection conn) {
		InputStream inputStream = null;
		ByteArrayOutputStream outStream = null;
		try {
			inputStream = conn.getInputStream();
			outStream = new ByteArrayOutputStream();
			byte[] buffer = new byte[1024];
			int len = 0;
			while ((len = inputStream.read(buffer)) != -1) {
				outStream.write(buffer, 0, len);
				outStream.flush();
			}
			return outStream.toByteArray();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			if (inputStream != null) {
				try {
					inputStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (outStream != null) {
				try {
					outStream.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	/**
	 * Build queryString of the url
	 */
	private static String buildUrlWithQueryString(String url, Map<String, String> queryParas) {
		if (queryParas == null || queryParas.isEmpty())
			return url;

		StringBuilder sb = new StringBuilder(url);
		boolean isFirst;
		if (url.indexOf("?") == -1) {
			isFirst = true;
			sb.append("?");
		} else {
			isFirst = false;
		}

		for (Entry<String, String> entry : queryParas.entrySet()) {
			if (isFirst)
				isFirst = false;
			else
				sb.append("&");

			String key = entry.getKey();
			String value = entry.getValue();
			if (StrKit.notBlank(value))
				try {
					value = URLEncoder.encode(value, CHARSET);
				} catch (UnsupportedEncodingException e) {
					throw new RuntimeException(e);
				}
			sb.append(key).append("=").append(value);
		}
		return sb.toString();
	}

	public static String readIncommingRequestData(HttpServletRequest request) {
		BufferedReader br = null;
		try {
			StringBuilder result = new StringBuilder();
			br = request.getReader();
			for (String line = null; (line = br.readLine()) != null;) {
				result.append(line).append("\n");
			}

			return result.toString();
		} catch (IOException e) {
			throw new RuntimeException(e);
		} finally {
			if (br != null)
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
		}
	}

}
时间: 2024-09-20 06:25:55

扩展JFinal的HttpKit的相关文章

Docker 自建仓库自行开发管理

Docker 自建仓库面临一个管理镜像的问题,这里写个简单的程序,当作抛砖引玉 pom.xml需要引入的架包,由于jfinal里面有个封装好的http处理函数,方便简单,所以需要个jfinal包,json包用于解析返回的json结果 <dependency>     <groupId>com.jfinal</groupId>     <artifactId>jfinal</artifactId>     <version>2.2<

新书《Jfinal极速开发实战》正式发布

JfinalUIB学习交流QQ群 :309647612 书籍整个创作周期从2015年8月1日开始到2015年9月10日,时间仓促,难免有瑕疵,希望大家能够指出存在的问题,我会不断的更新纠正,谢谢大家! 前四章免费阅读,内容会持续定期更新,紧随Jfinal的发展,希望大家看看做出评价,谢谢!   百度阅读地址 :http://yuedu.baidu.com/ebook/3fc54b55d5bbfd0a7956739f 目录 Jfinal极速开发实战... 为什么要写这本书... 3 读者对象...

实现了Zbus的JFinal插件,JFinal里用Zbus更方便了。

zbus https://git.oschina.net/rushmore/zbus 轻量级服务总线/消息队列 1)多种消息模式--支持生产者/消费者,发布订阅,RPC 2)丰富的API--C/C++/C#/JAVA/Python/Node.JS跨平台.多语言支持 3)开放协议标准--原生兼容HTTP协议(长连接),头部动态扩展 4)支持TrackServer与ZbusServer高可用横向动态扩容机制 jfinal https://git.oschina.net/jfinal/jfinal J

JFinal + B-JUI(1)-前端选型过程

一直在寻求做点什么,算是自我的一个锻炼吧. 一天看了JFinal的介绍及相关案例后,眼前一亮,提了几个问题波总也非常及时的给出解答. 说实在的也是受够了SSH各种码XML,一坨坨的配置,也可能是自己学艺不精,未得其精髓. 熟悉了一段JFinal后,决定用这个号称本星球极速JAVA开发框架做点东西,本来想等波总说的JFinal CMS,但迟迟没下文. 说下一些选型过程吧,也是各种尝试,各种坑. 1.前端 1)bootstrap模板 当下火热的前端可能是它了,各种模板满天飞,大多也都是些扁平化的,蛮

jfinal

JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所有优势的同时再拥有 ruby.python.php 等动态语言的开发效率!为您节约更多时间,去陪恋人.家人和朋友!(鼓掌!~~) JFinal 有如下主要特点:   MVC 架构,设计精巧,使用简单   遵循 COC 原则,零配置,无 xml   独创 Db + Record 模式,灵活便利  

Jfinal框架是什么框架?适用于什么项目呢?

jfinal 基于spring MVC研发的框架,操作简单.节省代码,适用于所有web项目.适合中小型项目开发.10分钟写出一个页面的增删改查.目前所在公司就用jfinal开发.app,服务端也可以.是Java 语言的极速 web 开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所有优势的同时再拥有ruby.python等动态语言的开发效率. 系统架构 JFinal 采用微内核全方位扩展架构,全方位是指其扩展方式在空间上的表现形

jfinal框架教程-学习笔记

JFinal  是基于 Java  语言的极速  WEB  + ORM  开发框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java 语言所有优势的同时再拥有 ruby.python.php 等动态语言的开发效率!为您节约更多时间,去陪恋人.家人和朋友!(鼓掌!~~) JFinal 有如下主要特点: ?  MVC 架构,设计精巧,使用简单 ?  遵循 COC 原则,零配置,无 xml ?  独创 Db + Record 模式,灵活便利 ? 

jfinal框架增加微信jsapi支持

部分手机在图片上传的时候,调取不到sd卡相册或其他图片,为了解决这个兼容性问题,同一个页面使用了两种图片上传方案. html5 :图片编码成base64 ,发送到后台,解码存储.这种方法用于解决非微信浏览器的上传问题. jsapi:用于解决微信浏览器的上传问题. 思路: 首先判断是否是微信浏览器(微信js接口提供方法),然后调用上面不同的方法. 这里记下jfinal整合jsapi的关键代码和流程 . 前端页面需要一段javascript ,官方文档有详细说明,以下我的config        

JFinal 入门

1. 创建MyAppConfig.java 首先创建MyJFinal的配置类MyAppConfig.java: 在方法中添加如下代码: @Override public void configConstant(Constants me) { me.setDevMode(true); me.setEncoding("utf-8"); me.setViewType(ViewType.JSP); } @Override public void configHandler(Handlers m