package com.xinxin.everyxday.base.loopj.requestinstance;
import android.app.ProgressDialog;
import android.content.Context;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.handler.TextHttpResponseHandler;
import com.xinxin.everyxday.base.jsonparser.InterfaceResultParser;
import com.xinxin.everyxday.base.loopj.postdata.CommonRequestHeaderGenerate;
import com.xinxin.everyxday.base.loopj.postdata.RequestPostDataWrap;
import com.xinxin.everyxday.base.loopj.requestclient.RequestClient;
import com.xinxin.everyxday.base.netcode.ResultCodeUtil;
import com.xinxin.everyxday.bean.base.CommonResponseBody;
import com.xinxin.everyxday.bean.base.CommonResponseErrorBean;
import com.xinxin.everyxday.bean.base.CommonResponseHeader;
import com.xinxin.everyxday.util.StringUtil;
import org.apache.http.Header;
import java.lang.reflect.Type;
/**
*
* GET /guides?page=0&cid=1 HTTP/1.1
Host: api.taoxiaoxian.com
Accept: application/vnd.taoxiaoxian.v1+json
User-Agent : taoxiaoxian/1.0 (Android; Ice Cream Sandwich/4.0; java/1.8.0_05)
*
*/
public abstract class CommonRequestWrap<T> {
public interface CommonRequestWrapDelegate<T>{
/**
* 请求服务器开始
* @param progressDialog
*/
public void requestServerStart(ProgressDialog progressDialog);
/**
* 请求服务器返回成功数据
* @param responseBody
*/
public void requestServerSuccess(CommonResponseBody<T> responseBody);
/**
* 请求服务器返回失败数据
* @param cxt
* @param errorBean
*/
public void requestServerFailure(Context cxt, CommonResponseErrorBean errorBean);
/**
* 请求服务器返回网络连接异常
*/
public void requestServerNetWorkError();
/**
* 请求服务器响应异常(无具体异常信息)
* @param cxt
*/
public void requestServerResponseError(Context cxt);
/**
* 请求服务器结束
* @param progressDialog
*/
public void requestServerEnd(ProgressDialog progressDialog);
}
private Context cxt;
private String requestType;
private RequestParams requestParams;
private boolean isNeedSigned;
private CommonRequestWrapDelegate<T> commonRequestWrapDelegate;
private ProgressDialog progressDialog;
private Class<T> beanType;
protected Class<T> getBeanType() {
return beanType;
}
public CommonRequestWrap(Context cxt, String requestType,
RequestParams requestParams, boolean isNeedSigned,
CommonRequestWrapDelegate<T> commonRequestWrapDelegate,
Class<T> beanType) {
this.cxt = cxt;
this.requestType = requestType;
this.requestParams = requestParams;
this.isNeedSigned = isNeedSigned;
this.commonRequestWrapDelegate = commonRequestWrapDelegate;
this.beanType = beanType;
}
public CommonRequestWrap(Context cxt, String requestType,
RequestParams requestParams, boolean isNeedSigned, int stringId,
CommonRequestWrapDelegate<T> commonRequestWrapDelegate,
Class<T> beanType) {
this.cxt = cxt;
this.requestType = requestType;
this.requestParams = requestParams;
this.isNeedSigned = isNeedSigned;
this.commonRequestWrapDelegate = commonRequestWrapDelegate;
progressDialog = RequestProgressDialogWrap.createProgressDialog(cxt,
stringId);
this.beanType = beanType;
}
public CommonRequestWrap(CommonRequestWrapDelegate<T> commonRequestWrapDelegate){
this.commonRequestWrapDelegate = commonRequestWrapDelegate;
}
//note contentType 根据 body是否为空进行判断 如果为空 给一个null 不为空就给对应的请求类型
public void getRequest(){
Header[] headers = generateRequestHeader(RequestClient.REQUEST_TYPE_GET, null, getUrlWithParams());
RequestClient.get(cxt, requestType, headers, requestParams,
new ServerRresponseHandler());
}
public void postRequest(String jsonStr){
String urlWithParams = getUrlWithParams();
Header[] headers = generateRequestHeader(RequestClient.REQUEST_TYPE_POST, jsonStr, urlWithParams);
RequestClient.post(cxt, urlWithParams, headers,
RequestPostDataWrap.generateRequestEntity(jsonStr),
getContentType(jsonStr), new ServerRresponseHandler());
}
public void putRequest(String jsonStr){
String urlWithParams = getUrlWithParams();
Header[] headers = generateRequestHeader(RequestClient.REQUEST_TYPE_PUT, jsonStr, urlWithParams);
RequestClient.put(cxt, urlWithParams, headers,
RequestPostDataWrap.generateRequestEntity(jsonStr),
getContentType(jsonStr), new ServerRresponseHandler());
}
private String getUrlWithParams(){
return RequestPostDataWrap.generateUrlWithParams(requestType, requestParams);
}
private Header[] generateRequestHeader(String httpVerb, String jsonStr, String urlWithParams){
return CommonRequestHeaderGenerate.generateRequestHeader(httpVerb, jsonStr, isNeedSigned, urlWithParams);
}
private String getContentType(String jsonStr){
if(StringUtil.isEmpty(jsonStr)){
return null;
}
return RequestClient.CONTENT_TYPE;
}
private class ServerRresponseHandler extends TextHttpResponseHandler{
@Override
public void setRequestHeaders(Header[] requestHeaders) {
super.setRequestHeaders(requestHeaders);
}
@Override
public void onStart() {
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerStart(progressDialog);
}
}
@Override
public void onFailure(int statusCode, Header[] headers,
String responseString, Throwable throwable) {
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerNetWorkError();
}
}
@Override
public void onSuccess(int statusCode, Header[] headers,
String responseString) {
System.out.println("\r\n\r\n CommonRequestWrap : " + responseString);
CommonResponseBody<T> responseBody = getCommonResponseBodyFromJson(headers, responseString);
if(responseBody != null){
CommonResponseHeader responseHeader = responseBody.getResponseHeader();
if(responseHeader != null){
String result = responseHeader.getResultCode();
if(ResultCodeUtil.SUCESS.equals(result)){ //先判断返回结果
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerSuccess(responseBody);
}
}else{
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerFailure(cxt, responseBody.getResponseErrorBean());
}
}
return;
}
}
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerResponseError(cxt);
}
}
@Override
public void onFinish() {
if(!isDelegateNull()){
commonRequestWrapDelegate.requestServerEnd(progressDialog);
}
}
}
private boolean isDelegateNull(){
if(commonRequestWrapDelegate == null){
return true;
}
return false;
}
public CommonResponseBody<T> getCommonResponseBodyFromJson(Header[] headers, String str) {
CommonResponseHeader responseHeader = InterfaceResultParser.parserResponseHeader(headers);
try {
if(responseHeader != null && !StringUtil.isEmpty(responseHeader.getResultCode())){
if (!StringUtil.isEmpty(str)) {
Gson gson = InterfaceResultParser.generateDateFormatGson();
CommonResponseBody<T> responseBody = new CommonResponseBody<T>();
if(ResultCodeUtil.SUCESS.equals(responseHeader.getResultCode())){
setResponseObject(responseBody, str, gson);
}else{
Type type = new TypeToken<CommonResponseErrorBean>() {}.getType();
if(type != null){
responseBody.setResponseErrorBean((CommonResponseErrorBean)gson.fromJson(str, type));
}
}
responseBody.setResponseHeader(InterfaceResultParser.processResult(responseHeader));
return responseBody;
}
}
} catch (Exception e) {
}
CommonResponseBody<T> responseBody = new CommonResponseBody<T>();
responseBody.setResponseErrorBean(InterfaceResultParser.generateErrorBean());
return responseBody;
}
public abstract void setResponseObject(CommonResponseBody<T> responseBody, String str, Gson gson);
}