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);
}
}
}