httpUtils 工具类

1,425 阅读2分钟

public final class HttpUtils {

private HttpUtils() {}

public static String get(String url) {
	return delegate.get(url);
}

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

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

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

public static String postSSL(String url, String data, String certPath, String certPass) {
	return delegate.postSSL(url, data, certPath, certPass);
}

public static MediaFile download(String url) {
	return delegate.download(url);
}
public static InputStream download(String url, String params){
	return delegate.download(url, params);
}

public static String upload(String url, File file, String params) {
	return delegate.upload(url, file, params);
}
public static String upload(String url,  byte[] arr, String params,String fileName) {
	return delegate.upload(url, arr, params,fileName);
}
/**
 * http请求工具 委托
 * 优先使用OkHttp
 * 最后使用JFinal HttpKit
 */
private interface HttpDelegate {
	String get(String url);
	String get(String url, Map<String, String> queryParas);
	String get(String url, Map<String, String> queryParas, Map<String, String> headerParas);

	String post(String url, String data);
	String postSSL(String url, String data, String certPath, String certPass);

	MediaFile download(String url);
	InputStream download(String url, String params);

	String upload(String url, File file, String params);

	String upload(String url, byte[] arr, String params,String fileName);
}

// http请求工具代理对象
private static final HttpDelegate delegate;

static {
	HttpDelegate delegateToUse = new OkHttpDelegate();
	delegate = delegateToUse;
}

/**
 * OkHttp代理
 */
private static class OkHttpDelegate implements HttpDelegate {
	private final com.squareup.okhttp.OkHttpClient httpClient;
	private final com.squareup.okhttp.OkHttpClient httpsClient;

	Lock lock = new ReentrantLock();

	public OkHttpDelegate() {
		httpClient = new com.squareup.okhttp.OkHttpClient();
		// 分别设置Http的连接,写入,读取的超时时间为30秒
		httpClient.setConnectTimeout(10, TimeUnit.SECONDS);
		httpClient.setWriteTimeout(10, TimeUnit.SECONDS);
		httpClient.setReadTimeout(30, TimeUnit.SECONDS);

		httpsClient = httpClient.clone();
	}

	private static final com.squareup.okhttp.MediaType CONTENT_TYPE_FORM =
			com.squareup.okhttp.MediaType.parse("application/x-www-form-urlencoded");
	private static final com.squareup.okhttp.MediaType CONTENT_TYPE_JSON =
			com.squareup.okhttp.MediaType.parse("application/json; charset=utf-8");

	private String exec(Request request) {
		try {
			com.squareup.okhttp.Response response = httpClient.newCall(request).execute();

			if (!response.isSuccessful()) {
				throw new RuntimeException("Unexpected code " + response);
			}

			return response.body().string();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public String get(String url) {
		Request request = new Request.Builder().url(url).get().build();
		return exec(request);
	}

	@Override
	public String get(String url, Map<String, String> queryParas) {
		com.squareup.okhttp.HttpUrl.Builder urlBuilder = com.squareup.okhttp.HttpUrl.parse(url).newBuilder();
		for (Entry<String, String> entry : queryParas.entrySet()) {
			urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
		}
		com.squareup.okhttp.HttpUrl httpUrl = urlBuilder.build();
		Request request = new Request.Builder().url(httpUrl).get().build();
		return exec(request);
	}

	@Override
	public String get(String url, Map<String, String> queryParas, Map<String, String> headerParas) {
		com.squareup.okhttp.HttpUrl.Builder urlBuilder = com.squareup.okhttp.HttpUrl.parse(url).newBuilder();
		for (Entry<String, String> entry : queryParas.entrySet()) {
			urlBuilder.addQueryParameter(entry.getKey(), entry.getValue());
		}
		com.squareup.okhttp.HttpUrl httpUrl = urlBuilder.build();
		Request.Builder requestBuilder = new Request.Builder().url(httpUrl).get();
		for(Entry<String, String> entry : headerParas.entrySet()){
		    requestBuilder.addHeader(entry.getKey(), entry.getValue());
        }
		Request request = requestBuilder.build();
		return exec(request);
	}

	@Override
	public String post(String url, String params) {
		com.squareup.okhttp.RequestBody body = com.squareup.okhttp.RequestBody.create(CONTENT_TYPE_JSON, params);
		Request request = new Request.Builder()
			.url(url)
			.post(body)
			.build();
		return exec(request);
	}

	@Override
	public String postSSL(String url, String data, String certPath, String certPass) {
		com.squareup.okhttp.RequestBody body = com.squareup.okhttp.RequestBody.create(CONTENT_TYPE_FORM, data);
		Request request = new Request.Builder()
			.url(url)
			.post(body)
			.build();

		InputStream inputStream = null;
		try {
			// 移动到最开始,certPath io异常unlock会报错
			lock.lock();

			KeyStore clientStore = KeyStore.getInstance("PKCS12");
			inputStream = new FileInputStream(certPath);
			clientStore.load(inputStream, certPass.toCharArray());

			KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			kmf.init(clientStore, certPass.toCharArray());
			KeyManager[] kms = kmf.getKeyManagers();
			SSLContext sslContext = SSLContext.getInstance("TLSv1");

			sslContext.init(kms, null, new SecureRandom());

			httpsClient.setSslSocketFactory(sslContext.getSocketFactory());

			com.squareup.okhttp.Response response = httpsClient.newCall(request).execute();

			if (!response.isSuccessful()){
				throw new RuntimeException("Unexpected code " + response);
			}

			return response.body().string();
		} catch (Exception e) {
			throw new RuntimeException(e);
		} finally {
			IOUtils.closeQuietly(inputStream);
			lock.unlock();
		}
	}

	@Override
	public MediaFile download(String url) {
		Request request = new Request.Builder().url(url).get().build();
		try {
			com.squareup.okhttp.Response response = httpsClient.newCall(request).execute();

			if (!response.isSuccessful()){
				throw new RuntimeException("Unexpected code " + response);
			}

			com.squareup.okhttp.ResponseBody body = response.body();
			com.squareup.okhttp.MediaType mediaType = body.contentType();
			MediaFile mediaFile = new MediaFile();
			if (mediaType.type().equals("text")) {
					mediaFile.setError(body.string());
			} else {
				BufferedInputStream bis = new BufferedInputStream(body.byteStream());

				/*String ds = response.header("Content-disposition");
				String fullName = ds.substring(ds.indexOf("filename=\"") + 10, ds.length() - 1);
				String relName = fullName.substring(0, fullName.lastIndexOf("."));
				String suffix = fullName.substring(relName.length()+1);*/

				mediaFile.setFullName("");
				mediaFile.setFileName("");
				mediaFile.setSuffix("");
				mediaFile.setContentLength(body.contentLength() + "");
				mediaFile.setContentType(body.contentType().toString());
				mediaFile.setFileStream(bis);
			}
			return mediaFile;
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

	@Override
	public InputStream download(String url, String params) {
		Request request;
		if (StringKit.isNotBlank(params)) {
			com.squareup.okhttp.RequestBody body = com.squareup.okhttp.RequestBody.create(CONTENT_TYPE_FORM, params);
			request = new Request.Builder().url(url).post(body).build();
		} else {
			request = new Request.Builder().url(url).get().build();
		}
		try {
			com.squareup.okhttp.Response response = httpsClient.newCall(request).execute();

			if (!response.isSuccessful()){
				throw new RuntimeException("Unexpected code " + response);
			}

			return response.body().byteStream();
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

	}

	@Override
	public String upload(String url, File file, String params) {
		com.squareup.okhttp.RequestBody fileBody = com.squareup.okhttp.RequestBody
				.create(com.squareup.okhttp.MediaType.parse("application/octet-stream"), file);

		com.squareup.okhttp.MultipartBuilder builder = new com.squareup.okhttp.MultipartBuilder()
				.type(com.squareup.okhttp.MultipartBuilder.FORM)
				.addFormDataPart("file", file.getName(), fileBody);

		if (StringKit.isNotBlank(params)) {
			builder.addFormDataPart("description", params);
		}

		com.squareup.okhttp.RequestBody requestBody = builder.build();
		Request request = new Request.Builder()
				.url(url)
				.post(requestBody)
				.build();

		return exec(request);
	}

	@Override
	public String upload(String url, byte[] arr, String params,String fileName) {
		com.squareup.okhttp.RequestBody fileBody = com.squareup.okhttp.RequestBody
				.create(com.squareup.okhttp.MediaType.parse("application/octet-stream"), arr);

		com.squareup.okhttp.MultipartBuilder builder = new com.squareup.okhttp.MultipartBuilder()
				.type(com.squareup.okhttp.MultipartBuilder.FORM)
				.addFormDataPart("file",fileName, fileBody);

		if (StringKit.isNotBlank(params)) {
			builder.addFormDataPart("description", params);
		}

		com.squareup.okhttp.RequestBody requestBody = builder.build();
		Request request = new Request.Builder()
				.url(url)
				.post(requestBody)
				.build();

		return exec(request);
	}

}

}