网络请求工具类

package com.yaoxin.newapp;


import java.io.File;


import org.json.JSONException;
import org.json.JSONObject;


import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;


import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.HttpHandler;
import com.lidroid.xutils.http.RequestParams;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.umeng.analytics.MobclickAgent;


public class Http extends HttpUtils{
// private RequestCallBack<File> mCallback;
// private String mTarget;

public static final String RESULT_SUCCESS = "1"; 
public static final String DOWNLOAD_SUFFIX = "_download"; 
public static final String URL_PREFIX_YAOXIN = "http://api.5iyaoxin.com/"; 
public static final String URL_PREFIX_HTTP = "http";
private static final String PARAM_MEMBER_PHONE = "member_phone";
private static final String PARAM_VERSION = "version"; 


private static final String MSG_NETWORK_ERROR = "网络错误";




//Utils.doApiDownloading
//请求药信API GET接口,并将正确的返回值缓存到本地文件
//参数:
//url - 接口地址(自动添加5iyaoxin前缀)
//target - 缓存文件名(自动添加缓存路径)
//callback - 回调
//说明:
//- 自动实例化,调用者只需使用Utils.doApiDownloading(...)即可调用
//- url中无需包含http://api.5iyiaoxin.com/部分
//- target中自动添加.json后缀(防止疏忽)
//- 自动添加member_phone与version参数到url,调用者url中无需包含
//- 已自动对返回值进行了错误判断,返回值不是JSON,或接口中返回“错误”,均自动进入onFailure处理,
//  调用者无需在onSuccess中对返回值再次进行解析判断,直接拿取数据处理即可
//- 若接口返回错误(包括即便是正确的JSON,但接口中返回“错误”的情况),均不会进行本地缓存,
//  即某一次的错误数据不会覆盖原有正确的缓存数据
//- onSuccess处理中,可直接使用reponseInfo.result获取结果字符串,无需再通过读取缓存文件获取结果
//- onFailure处理中,可直接使用msg参数获取错误字符串进行后续处理
public static HttpHandler<File> doApiDownloading(String url, 
    String target,
    Activity activity,
    RequestCallBack<String> callback){
Http http = new Http();
return http.apiDownload(url, target, activity, callback);
}


//Utils.doDownloading
//下载指定url的文件到缓存路径(自动添加http前缀)
//参数:
//url - 文件(!不!自动添加5iyaoxin前缀)
//target - 缓存文件名(自动添加缓存路径)
//callback - 回调
//说明:
//- 自动实例化,调用者只需使用Utils.doDownloading(...)即可调用
//- url中无需包含http://部分
public static HttpHandler<File> doDownloading(String url, 
 String target,
       Activity activity,
 RequestCallBack<File> callback){
Http http = new Http();
HttpHandler<File> handler = http.download(url, target, callback);
addHandlerToActivity(handler, activity);
return handler;
}


//Utils.doPost
//请求药信API POST接口
//参数:
//url - 接口地址(自动添加5iyaoxin前缀)
//requestParams - 接口参数(自动添加member_phone与version参数)
//callback - 回调
//说明:
//- 自动实例化,调用者只需使用Utils.doPost(...)即可调用
//- url中无需包含http://api.5iyiaoxin.com/部分
//- 自动添加member_phone与version参数到url,调用者url中无需包含
//- 已自动对返回值进行了错误判断,返回值不是JSON,或接口中返回“错误”,均自动进入onFailure处理,
//  调用者无需在onSuccess中对返回值再次进行解析判断,直接拿取数据处理即可
//- onFailure处理中,可直接使用msg参数获取错误字符串进行后续处理
public static HttpHandler<String> doPost(String url,
RequestParams params,
Activity activity,
RequestCallBack<String> callback){
return doRequest(HttpMethod.POST, url, params, true, true, activity, callback);
}


//Utils.doPost
//请求药信API POST接口
//参数:
//url - 接口地址(自动添加5iyaoxin前缀)
//addMemberPhone - 是否在请求参数中自动添加member_phone
//addVersion - 是否在请求参数中自动添加version
//requestParams - 接口参数(自动添加member_phone与version参数)
//callback - 回调
//说明:
//- 手动设置是否自动添加member_phone或version参数,其余与前一个doPost方法相同
//- 用于登录、注册等,调用时全局尚未保存member_phone的接口
public static HttpHandler<String> doPost(String url,
RequestParams params,
Boolean addMemberPhone,
Boolean addVersion,
Activity activity,
RequestCallBack<String> callback){
return doRequest(HttpMethod.POST, url, params, addMemberPhone, addVersion, activity, callback);
}


//Utils.doGet
//请求药信API GET接口
//参数:
//url - 接口地址(自动添加5iyaoxin前缀)
//requestParams - 接口参数(自动添加member_phone与version参数)
//callback - 回调
//说明:
//- 自动实例化,调用者只需使用Utils.doGet(...)即可调用
//- url中无需包含http://api.5iyiaoxin.com/部分
//- 自动添加member_phone与version参数到url,调用者url中无需包含
//- 已自动对返回值进行了错误判断,返回值不是JSON,或接口中返回“错误”,均自动进入onFailure处理,
//  调用者无需在onSuccess中对返回值再次进行解析判断,直接拿取数据处理即可
//- onFailure处理中,可直接使用msg参数获取错误字符串进行后续处理
public static HttpHandler<String> doGet(String url,
RequestParams params, 
Activity activity,
RequestCallBack<String> callback){
return doRequest(HttpMethod.GET, url, params, true, true, activity, callback);
}


//Utils.doGet
//请求药信API GET接口
//参数:
//url - 接口地址(自动添加5iyaoxin前缀)
//addMemberPhone - 是否在请求参数中自动添加member_phone
//addVersion - 是否在请求参数中自动添加version
//requestParams - 接口参数(自动添加member_phone与version参数)
//callback - 回调
//说明:
//- 手动设置是否自动添加member_phone或version参数,其余与前一个doGet方法相同
//- 用于登录、注册等,调用时全局尚未保存member_phone的接口
public static HttpHandler<String> doGet(String url,
RequestParams params,
Boolean addMemberPhone,
Boolean addVersion,
Activity activity,
RequestCallBack<String> callback){
return doRequest(HttpMethod.GET, url, params, addMemberPhone, addVersion, activity, callback);
}


private static HttpHandler<String> doRequest(HttpMethod method, 
String url, 
          RequestParams params, 
        Boolean addMemberPhone,
        Boolean addVersion,
        Activity activity,
        final RequestCallBack<String> callback){
if (!url.startsWith(URL_PREFIX_YAOXIN) && !url.startsWith(URL_PREFIX_HTTP)){
url = URL_PREFIX_YAOXIN + url;
}

if (params == null){
params = new RequestParams();
}

if (addMemberPhone) 
params.addBodyParameter(PARAM_MEMBER_PHONE, Utils.getUserId());


if (addVersion) 
params.addBodyParameter(PARAM_VERSION, Utils.applicationContext.getString(R.string.version_name));


Http http = new Http();
HttpHandler<String> handler = http.send(method, url, params, new RequestCallBack<String>(){
@Override
public void onStart() {
callback.onStart();
}


@Override
public void onLoading(long total, long current, boolean isUploading) {
callback.onLoading(total, current, isUploading);
}


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
String error = getErrorOfReponseString(responseInfo.result);
if (error.equals(RESULT_SUCCESS)){
callback.onSuccess(responseInfo);
} else{
callback.onFailure(new HttpException(), error);
}
}


@Override
public void onFailure(HttpException error, String msg) {
msg = MSG_NETWORK_ERROR ;
callback.onFailure(error, msg);
}
});
addHandlerToActivity(handler, activity);
return handler;
}


@SuppressLint("DefaultLocale")
public HttpHandler<File> apiDownload(String url, 
    String target,
    Activity activity,
    final RequestCallBack<String> callBack){
if (!url.startsWith(URL_PREFIX_YAOXIN) && !url.startsWith(URL_PREFIX_HTTP)){
url = URL_PREFIX_YAOXIN + url;
}
url = getUrlWithExtras(url);


if (!target.toLowerCase().endsWith(".json")){
target = target + ".json";
}
if (!target.startsWith(Utils.applicationContext.getFilesDir().getAbsolutePath())) {
target = Utils.getCacheFileName(target);
}
final String targetString = target;


HttpHandler<File> handler = super.download(url, 
 target + DOWNLOAD_SUFFIX,
   false,
     true,
     new RequestCallBack<File>() {
@Override
public void onStart() {
callBack.onStart();
}


@Override
public void onLoading(long total, long current, boolean isUploading) {
callBack.onLoading(total, current, isUploading);
}


@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
File f = responseInfo.result;
String content = Utils.getContentFromFile(f.getAbsolutePath());
String error = getErrorOfReponseString(content);
if (error.equals(RESULT_SUCCESS)){
Utils.saveContentToFile(content, targetString);
    responseInfo.result = new File(targetString);
ResponseInfo<String> responseInfo2 = new ResponseInfo<String>(null, content, responseInfo.resultFormCache);
    callBack.onSuccess(responseInfo2);
} else{
callBack.onFailure(new HttpException(), error);
}
}


@Override
public void onFailure(HttpException error, String msg) {
msg = MSG_NETWORK_ERROR;
callBack.onFailure(error, msg);
}
});
addHandlerToActivity(handler, activity);
return handler;
}


@Override
public HttpHandler<File> download(String url, 
     String target,
     final RequestCallBack<File> callback){
if (!url.startsWith(URL_PREFIX_HTTP)){
url = url + URL_PREFIX_HTTP;
}
return super.download(url, target, false,true, callback);
}


//自动为在GET url中添加member_phone与version参数
public static String getUrlWithExtras(String url){
url = getUrlWithParam(PARAM_MEMBER_PHONE, Utils.getUserId(), url);
url = getUrlWithParam(PARAM_VERSION, Utils.applicationContext.getString(R.string.version_name), url);
return url;
}

private static String getUrlWithParam(String paramName, String paramValue, String url){
if (url.contains(paramName + "=")){
return url;
} else{
if (url.contains("?")){
return String.format("%1$s&%2$s=%3$s", url, paramName, paramValue);
} else{
return String.format("%1$s?%2$s=%3$s", url, paramName, paramValue);
}
}
}

//返回值:
//是JSON且result=="1" 正确   result!="1" 错误:resultString
//是JSON且state=="1" 正确    state!="1" 错误:stateString
//是JSON且没有result或state 正确
//不是JSON且返回值为"1" 正确    返回值!="1" 错误:网络错误
private static String getErrorOfReponseString(String response){
if (Utils.isJSON(response)){
try {
JSONObject json = new JSONObject(response);
if (json.has("result")){
return json.getString("result");
} else if(json.has("state")){
return json.getString("state");
} else{
    return RESULT_SUCCESS;
}
} catch (JSONException e) {
return RESULT_SUCCESS;//JSONArray
}
} else if (response.equals(RESULT_SUCCESS)){
return RESULT_SUCCESS;
} else{
return "网络错误";
}
}

private static void addHandlerToActivity(HttpHandler<?>httpHandler, Activity activity){
if (activity instanceof NetworkActivity){
NetworkActivity networkActivity = (NetworkActivity)activity;
networkActivity.httpHandlers.add(httpHandler);
} else if(activity instanceof NetworkFragmentActivity){
NetworkFragmentActivity networkFragmentActivity = (NetworkFragmentActivity)activity;
networkFragmentActivity.httpHandlers.add(httpHandler);
} else if(activity instanceof NetworkActionBarActivity){
NetworkActionBarActivity networkActionBarActivity = (NetworkActionBarActivity)activity;
networkActionBarActivity.httpHandlers.add(httpHandler);
}
}


public static class LoginUtil{
private RequestCallBack<String> mCallBack;
private String mMemberPhone;
private String mPassword;
private Activity mActivity;


public HttpHandler<String> mPostHandler;
public HttpHandler<File> mApiHandler;

//doLogin
//进行登录过程
//参数:
//memberPhone - 登录手机号
//password - 登录密码
//activity - 调用界面Activity
//callback - 回调
//说明:
//- !必须!手动实例化
//- 已自动对返回值进行了错误判断,返回值不是JSON,或接口中返回“错误”,均自动进入onFailure处理,
//  调用者无需在onSuccess中对返回值再次进行解析判断,直接进行正确后的后续处理即可
//- onFailure处理中,可直接使用msg参数获取错误字符串进行后续处理
//- 日后如需改变登录流程(预加载信息、错误值判断等),只需在这里修改,无需在登录与注册页分别修改
//- 传入activity参数用于友盟统计,日后如不需要,可以去掉
//- 调用者Activity的finish()方法中,应执行loginHandler.cancel()方法,避免空指针错误
public void doLogin(String memberPhone, 
String password,
Activity activity,
RequestCallBack<String> callback){
mMemberPhone = memberPhone;
mPassword = password;
mCallBack = callback;
mActivity = activity;
RequestParams params = new RequestParams();
params.addBodyParameter("member_mail", memberPhone);
params.addBodyParameter("member_password", password);
mPostHandler = Http.doPost("wap/login.php?action=login", params, activity, 
new RequestCallBack<String>() {


@Override
public void onFailure(HttpException arg0, String arg1) {
String msg;
if(arg1.equals("2")){
MobclickAgent.onEvent(mActivity, "LoginInfo","0");
msg = "密码错误";
} else if(arg1.equals("3")){
MobclickAgent.onEvent(mActivity, "LoginInfo","0");
msg = "用户没有注册";
}
else {
msg = arg1;
}
mCallBack.onFailure(arg0, msg);
}


@Override
public void onSuccess(ResponseInfo<String> arg0) {
saveUserInfoToSharedPreferences();
startMemberInfoDownload();
}
});
}

//取消全部请求
//应在调用者Activity的finish()方法中调用
public void cancel(){
if (mPostHandler != null){
mPostHandler.cancel();
}
if (mApiHandler != null){
mApiHandler.cancel();
}
}

private void startMemberInfoDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=get_memberinfo", 
mMemberPhone + ".json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
// if (Utils.hasUserInstruction3Shown()){
// startDiseaseChannelDownload();
// } else{
// startActivityInfoDownload();
// }
startActivityInfoDownload();
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startActivityInfoDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=indexfirst", 
"activity.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
startNotificationDownload();
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startNotificationDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=indexsecond", 
"notification.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
startButtonIconDownload();
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startButtonIconDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=dingbu", 
"icon.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
startFirstPageArticlesDownload();
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startFirstPageArticlesDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=xueyao&last_content_id=0", 
"mainlistdownload1.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
mCallBack.onSuccess(responseInfo);
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startDiseaseChannelDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=actlistsecond&cat=134", 
"disease.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
startBrandChannelDownload();
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void startBrandChannelDownload() {
mApiHandler = Http.doApiDownloading("wap/w.php?action=actlistsecond&cat=187", 
"brand.json", 
mActivity, 
new RequestCallBack<String>() {


@Override
public void onSuccess(ResponseInfo<String> responseInfo) {
mCallBack.onSuccess(responseInfo);
}


@Override
public void onFailure(HttpException error, String msg) {
mCallBack.onFailure(error, msg);
}
});
}


private void saveUserInfoToSharedPreferences(){
MobclickAgent.onEvent(mActivity, "LoginInfo","1");
SharedPreferences userInfo = Utils.applicationContext.getSharedPreferences(LoginActivity.PREFS_PRIVATE,
Context.MODE_PRIVATE);
Editor prefsPrivateEditor = userInfo.edit();
prefsPrivateEditor.putString("userid", mMemberPhone);
prefsPrivateEditor.putString("member_id", "1");    //member_id  用于再次传值
prefsPrivateEditor.putString("userpwd", mPassword);
prefsPrivateEditor.putString("ischeck", "1");
prefsPrivateEditor.putString("first_enter_up", "1");
prefsPrivateEditor.commit();
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值