package com.bigdo.util;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.SocketException;
import java.net.UnknownHostException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.entity.FileEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import com.bigdo.common.RConfig;
import com.bigdo.common.RState;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class WSHelper {
public static final int GET = 1;
public static final int POST = 2;
Handler handler;
String RequestUrl, ContentType = "application/json", desc;
HttpEntity RequestParams;
int RequestCode, RequestCode2, RequestCode3, RequestCode4, RequestType;
Context context;
boolean offUpdate = false;
/**
* 调用服务辅助类
*
* @param context
* 页面上下文,值可以是: this 或 getApplicationContext()
* @param desc
* 当前请求描述,用于请求失败时离线同步描述.
* @param offUpdate
* 是否请求失败时离线同步.
* @param handler
* 请求完成后通知对象
* @param url
* 请求网址
* @param contentType
* 请求内容类别. 默认值:application/json
* @param params
* 请求参数
* @param requestCode
* 请求代码,用于区分请求的标识
* @param requestCode2
* 请求代码,用于区分请求的标识
* @param requestCode3
* 请求代码,用于区分请求的标识
* @param requestCode4
* 请求代码,用于区分请求的标识
* @param requestType
* 请求类别,可以选值为:WSHelper.GET 或 WSHelper.POST *
*
*/
public WSHelper(Context context, String desc, boolean offUpdate,
Handler handler, String url, String contentType, HttpEntity params,
int requestCode, int requestCode2, int requestCode3,
int requestCode4, int requestType) {
this.context = context;
this.desc = desc;
this.offUpdate = offUpdate;
this.handler = handler;
this.RequestUrl = url;
if (ContentType == null) {
this.ContentType = null;
} else {
if (ContentType.equals("")) {
this.ContentType = "application/json";
} else {
this.ContentType = contentType;
}
}
this.RequestParams = params;
this.RequestCode = requestCode;
this.RequestCode2 = requestCode2;
this.RequestCode3 = requestCode3;
this.RequestCode4 = requestCode4;
this.RequestType = requestType;
}
/**
* 开始请求
*
* @return
*/
public WSResult start() {
if (handler != null) {
WSHelperThread wSThreadObj = new WSHelperThread();
wSThreadObj.start();
return null;
} else {
return request();
}
}
public static StringEntity getStringEntity(String Params) {
try {
return new StringEntity(Params, HTTP.UTF_8);
} catch (UnsupportedEncodingException e) {
}
return null;
}
public static FileEntity getFileEntity(String filePath) {
File file = new File(filePath);
FileEntity fEntity = new FileEntity(file, "binary/octet-stream");
return fEntity;
}
private WSResult request() {
WSResult result = new WSResult();
if (isNetConnecting(context)) {
switch (RequestType) {
case GET:
result = Get();
break;
case POST:
result = Post();
break;
default:
result.Result = "无效请求.[C]";
result.State = WSResult.Error;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
break;
}
} else {
result.Result = "无法连接到服务器,请您先检查网络.[C]";
result.State = WSResult.NetError;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
}
return result;
}
private WSResult Post() {
WSResult result = new WSResult();
int code = 0;
String Error = "";
HttpClient client = new DefaultHttpClient();
HttpPost request = new HttpPost(RequestUrl);
request.setHeader("Accept", "application/json");
if (ContentType != null) {
request.setHeader("Content-Type", ContentType);
}
request.addHeader("charset", HTTP.UTF_8);
if (RequestParams != null) {
request.setEntity(RequestParams);
}
HttpResponse response = null;
int errorCode = 0;
try {
response = client.execute(request);
code = response.getStatusLine().getStatusCode();
if (code == 200) {
result.Result = EntityUtils.toString(response.getEntity(),
HTTP.UTF_8);
result.State = WSResult.OK;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
return result;
} else if (code == 404) {
Error = "抱歉!服务器不存在该服务.[C]";
errorCode = WSResult.SError404;
} else {
Error = "抱歉!调用服务期间发生了错误.[C]";
errorCode = WSResult.SError;
}
} catch (UnknownHostException e) {
Error = "无法连接到服务器,请您先检查网络.[C]";
errorCode = WSResult.UnknownHost;
} catch (HttpHostConnectException e) {
Error = "无法连接到服务器,请您先检查网络.[C]";
errorCode = WSResult.ServiceBreak;
} catch (SocketException e) {
Error = "服务中断,请您先检查网络.[C]";
errorCode = WSResult.ServiceBreak;
} catch (ConnectTimeoutException ex) {
Error = "连接超时.[C]";
errorCode = WSResult.NetTimeout;
} catch (Exception ex) {
Error = "抱歉!调用服务期间发生了错误.[C]";
errorCode = WSResult.Error;
}
result.Result = Error;
result.State = errorCode;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
return result;
}
private WSResult Get() {
WSResult result = new WSResult();
int code = 0;
String Error = "";
int errorCode = 0;
try {
HttpClient client = new DefaultHttpClient();
if (RequestParams != null) {
int s = RequestUrl.indexOf("?");
if (s > 0) {
RequestUrl += "&";
} else {
RequestUrl += "?";
}
RequestUrl += RequestParams.toString();
}
HttpGet request = new HttpGet(RequestUrl);
request.setHeader("Accept", "application/json");
if (ContentType != null) {
request.setHeader("Content-Type", ContentType);
}
request.addHeader("charset", HTTP.UTF_8);
HttpResponse response = client.execute(request);
code = response.getStatusLine().getStatusCode();
if (code == 200) {
result.Result = EntityUtils.toString(response.getEntity(),
HTTP.UTF_8);
result.State = WSResult.OK;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
return result;
} else if (code == 404) {
Error = "抱歉!服务器不存在该服务.[C]";
errorCode = WSResult.SError404;
} else {
Error = "抱歉!调用服务期间发生了错误.[C]";
errorCode = WSResult.SError;
}
} catch (UnknownHostException e) {
Error = "无法连接到服务器,请您先检查网络.[C]";
errorCode = WSResult.UnknownHost;
} catch (HttpHostConnectException e) {
Error = "无法连接到服务器,请您先检查网络.[C]";
errorCode = WSResult.UnknownHost;
} catch (SocketException e) {
Error = "服务中断,请您先检查网络.[C]";
errorCode = WSResult.ServiceBreak;
} catch (ConnectTimeoutException ex) {
Error = "连接超时.[C]";
errorCode = WSResult.NetTimeout;
} catch (Exception ex) {
Error = "抱歉!调用服务期间发生了错误.[C]";
errorCode = WSResult.Error;
}
result.Result = Error;
result.State = errorCode;
result.RequestCode = RequestCode;
result.RequestCode2 = RequestCode2;
result.RequestCode3 = RequestCode3;
result.RequestCode4 = RequestCode4;
if (handler != null) {
Bundle b = new Bundle();
b.putParcelable(WSResult.ResultKey, result);
Message msg = new Message();
msg.arg1 = RState.WSCall;
msg.setData(b);
handler.sendMessage(msg);
}
return result;
}
public static boolean isNetConnecting(Context context) {
if (context != null) {
return isWifiConnected(context);
}
return false;
}
public static boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null) {
if (!mWiFiNetworkInfo.isAvailable()) {
NetworkInfo mMobileNetworkInfo = mConnectivityManager
.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mWiFiNetworkInfo != null) {
return mMobileNetworkInfo.isAvailable()
&& mMobileNetworkInfo.isConnected();
}
} else {
return true;
}
}
}
return false;
}
private class WSHelperThread extends Thread {
@Override
public void run() {
super.run();
request();
}
}
}