public void sendRequest(RequestMethod method, String target, Map<String, String> params, final HttpTaskListener listener) {
IKLog.e("===url: " + method + ", " + target);// TODO 测试用打印URL
IKLog.e("===url params: " + (params==null?"":params.toString()));
if (TextUtils.isEmpty(target))
return;
prepareTarget(target);
HttpClient client = createHttpClient(target);
mHttpListener = listener;
switch (method) {
case GET:
if (params != null) {
IKLog.e("Http GET Request unable to auto assemble any params, please check your url");
}
request = new HttpGet(target);
break;
case POST:
request = new HttpPost(target);
if (params != null && !params.isEmpty()) {
try {
List<BasicNameValuePair> pairList = new ArrayList<BasicNameValuePair>();
Iterator it = params.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
pairList.add(new BasicNameValuePair(entry.getKey().toString(), entry.getValue()==null?"":entry.getValue().toString()));
}
((HttpPost) request).setEntity(new UrlEncodedFormEntity(pairList, CHARSET));
} catch (final Exception e) {
e.printStackTrace();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
return;
}
}
break;
default:
throw new UnsupportedOperationException("method " + method.name());
}
// request.setHeader("Accept-Encoding", "deflate");
setHttpHeaders(request);
HttpResponse response;
try {
response = client.execute(request);
final int mStatusCode = response.getStatusLine().getStatusCode();
if (mStatusCode == HttpStatus.SC_OK) {
HttpEntity oEntity = response.getEntity();
final String reStr = EntityUtils.toString(oEntity);
IKLog.d("==HttpHandler.sendRequest: " + reStr); // TODO 测试
if (listener != null) {
if (reStr.contains("<!DOCTYPE html PUBLIC ")) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed("server error, http statuscode maybe 500");
}
});
return;
}
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpSuccess(reStr);
// IKLog.e(reStr);
}
});
}
} else {
IKLog.d("==HttpHandler.sendRequest: mStatusCode=" + mStatusCode); // TODO 测试
//除200以外的状态码统一归结到此处处理
if (listener != null) {
//500在此处特别处理
if (mStatusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("服务器又去开小差了, 请稍后重试");
}
});
}
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(mStatusCode + "");
IKLog.e(String.valueOf(mStatusCode));
}
});
}
}
} catch (final UnknownHostException e) {
e.printStackTrace();
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("域名解析失败, 请稍后再试");
}
});
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
} catch (final ClientProtocolException e) {
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
IKLog.e(e.getMessage());
}
});
}
} catch (final IOException e) {
if (e.getMessage().contains("timed out")) {
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("无法连接到服务器, 请检查您的网络设置");
}
});
}
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
IKLog.e(e.getMessage());
}
});
}
} catch (final Exception e) {
e.printStackTrace();
//出现这个异常则表示有未考虑到的情况
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
IKLog.e(e.getMessage());
}
});
}
} finally {
if (client != null) {
client.getConnectionManager().shutdown();
}
}
}
public void sendRequest(RequestMethod method, String target, JSONObject params, final HttpTaskListener listener) {
IKLog.e("===url: " + method + ", " + target);// TODO 测试用打印URL
IKLog.e("===url params: " + (params==null?"":params.toString()));
if (TextUtils.isEmpty(target))
return;
prepareTarget(target);
HttpClient client = createHttpClient(target);
mHttpListener = listener;
switch (method) {
case GET:
if (params != null) {
IKLog.e("Http GET Request unable to auto assemble any params, please check your url");
}
request = new HttpGet(target);
break;
case POST:
request = new HttpPost(target);
if (params != null) {
try {
StringEntity entity = new StringEntity(params.toString(), CHARSET);
entity.setContentType("application/json");
((HttpPost) request).setEntity(entity);
IKLog.d("HttpHandler.sendRequest. postJson = " + params.toString());
} catch (final Exception e) {
e.printStackTrace();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
return;
}
}
break;
default:
throw new UnsupportedOperationException("method " + method.name());
}
// if (mUseGzip) {
// request.setHeader("Accept-Encoding", "deflate");
// }
setHttpHeaders(request);
HttpResponse response;
try {
response = client.execute(request);
final int mStatusCode = response.getStatusLine().getStatusCode();
if (mStatusCode == HttpStatus.SC_OK) {
HttpEntity oEntity = response.getEntity();
final String reStr = EntityUtils.toString(oEntity, CHARSET);
IKLog.d("==HttpHandler.sendRequest: " + reStr); // TODO 测试
if (listener != null) {
if (reStr.contains("<!DOCTYPE html PUBLIC ")) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed("server error, http statuscode maybe 500");
}
});
return;
}
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpSuccess(reStr);
}
});
}
} else {
IKLog.d("==HttpHandler.sendRequest: mStatusCode=" + mStatusCode); // TODO 测试
//除200以外的状态码统一归结到此处处理
if (listener != null) {
//500在此处特别处理
if (mStatusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("服务器又去开小差了, 请稍后重试");
}
});
}
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(mStatusCode + "");
}
});
}
}
} catch (final UnknownHostException e) {
e.printStackTrace();
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("域名解析失败, 请稍后再试");
}
});
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
} catch (final ClientProtocolException e) {
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
} catch (final IOException e) {
if (e.getMessage().contains("timed out")) {
mainHandler.post(new Runnable() {
@Override
public void run() {
HttpTaskVIewHelper.getInstance().showMessage("无法连接到服务器, 请检查您的网络设置");
}
});
}
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
} catch (final Exception e) {
e.printStackTrace();
//出现这个异常则表示有未考虑到的情况
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onHttpFailed(e.getMessage());
}
});
}
} finally {
if (client != null) {
client.getConnectionManager().shutdown();
}
}
}
/**
* 文件上传
* @param target URL
* @param fParams Map
* @param listener HttpTaskListener
*/
public void uploadFile(String target, final Map<String, File> fParams, final List<NameValuePair> tParams, final UploadFileListener listener) {
IKLog.e("===url: " + target);// TODO 测试用打印URL
IKLog.e("===url fParams: " + (fParams==null?"":fParams.toString()));
IKLog.e("===url tParams: " + (tParams==null?"":tParams.toString()));
if (TextUtils.isEmpty(target)) {
if (listener != null) {
listener.onFailed("target url not be null!");
}
return;
}
HttpClient client = createHttpClient(target);
fRequest = new HttpPost(target);
setHttpHeaders(fRequest);
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
//浏览器兼容模式
multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//multipartEntityBuilder.setCharset(Charset.forName(CHARSET)); //可能会导致服务端接收不到参数
ContentType contentType = ContentType.create(HTTP.PLAIN_TEXT_TYPE, HTTP.UTF_8);//post中文表单数据,防止乱码。
if (tParams != null && tParams.size() > 0) {
for (NameValuePair p : tParams) {
multipartEntityBuilder.addPart(p.getName(), new StringBody(p.getValue(), contentType));
// multipartEntityBuilder.addTextBody(p.getName(), p.getValue()); //如需加上编码格式需加入apache的httpcore,jar
}
}
Set<Entry<String, File>> entries = fParams.entrySet();
for (Entry<String, File> entry : entries) {
multipartEntityBuilder.addPart(entry.getKey(), new FileBody(entry.getValue()));
}
HttpEntity postEntity = multipartEntityBuilder.build();
ProgressEntity pEntity = new ProgressEntity(postEntity, listener);
((HttpPost) fRequest).setEntity(pEntity);
HttpResponse response;
try {
response = client.execute(fRequest);
final int mStatusCode = response.getStatusLine().getStatusCode();
if (mStatusCode == HttpStatus.SC_OK) {
HttpEntity oEntity = response.getEntity();
final String reStr = EntityUtils.toString(oEntity, CHARSET);
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onSuccess(reStr);
}
});
}
} else {
//除200以外状态码统一在此处理
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onFailed("HTTP StatusCode is " + mStatusCode);
}
});
}
}
} catch (final ClientProtocolException e) {
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onFailed(e.getMessage());
}
});
}
} catch (final IOException e) {
e.printStackTrace();
request.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onFailed(e.getMessage());
}
});
}
} catch (final Exception e) {
//出现这个异常则表示有未考虑到的情况
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onFailed(e.getMessage());
}
});
}
} finally {
if (client != null) {
client.getConnectionManager().shutdown();
}
}
}
/**
* 文件下载
* @param target
* @param fPath
*/
public void downloadFile(String target, String fPath, final DownLoadListener listener) {
if (TextUtils.isEmpty(target) || TextUtils.isEmpty(fPath)) {
throw new NullPointerException("download url or local file path can not be null");
}
final HttpGet httpGet = new HttpGet(target);
HttpClient client = createHttpClient(target);
setHttpHeaders(httpGet);
//穿透缓存的http头
httpGet.setHeader("Accept", "*/*");
httpGet.setHeader("Cache-Control", "no-cache");
httpGet.setHeader("Pragma", "no-cache");
HttpResponse response = null;
try {
response = client.execute(httpGet);
} catch (final ClientProtocolException e) {
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
return;
} catch (final IOException e) {
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
return;
} catch (final Exception e) {
//出现这个异常则表示有未考虑到的情况
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
return;
}
HttpEntity entity = null;
InputStream is = null;
FileOutputStream fos = null;
long downloadedBytes = 0;
try {
StatusLine statusLine = response.getStatusLine();
if (statusLine != null) {
if (listener != null)
listener.onServerResponse(response);
int statusCode = statusLine.getStatusCode();
if (statusCode >= 200 && statusCode < 300) {
entity = response.getEntity();
is = entity.getContent();
long total = entity.getContentLength();
if (is != null) {
File file = new File(fPath);
if (!file.exists()) {
file.createNewFile();
}
fos = new FileOutputStream(file);
//缓冲
byte[] buffer = new byte[4096];
int read = 0;
while ((read = is.read(buffer)) > 0) {
fos.write(buffer, 0, read);
downloadedBytes += read;
if (listener != null) {
listener.onProgress(downloadedBytes, total);
}
}
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onSuccess();
}
});
}
}
}
}
} catch (final IllegalStateException e) {
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
} catch (final IOException e) {
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
} catch (final InterruptedException e) {
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
} catch (final Exception e) {
//未知的异常
e.printStackTrace();
httpGet.abort();
if (listener != null) {
mainHandler.post(new Runnable() {
@Override
public void run() {
listener.onError(e.getMessage());
}
});
}
} finally {
if (client != null) {
client.getConnectionManager().shutdown();
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (entity != null) {
try {
entity.consumeContent();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}