Skip to content

Commit

Permalink
Merge pull request #28 from tianshaojie/pr/24
Browse files Browse the repository at this point in the history
Http Response 封装处理
  • Loading branch information
tianshaojie committed Dec 10, 2016
2 parents 00f2839 + a4f119a commit e0188bd
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 112 deletions.
Expand Up @@ -17,6 +17,7 @@
import com.yuzhi.fine.R;
import com.yuzhi.fine.http.HttpClient;
import com.yuzhi.fine.http.HttpResponseHandler;
import com.yuzhi.fine.http.RestApiResponse;
import com.yuzhi.fine.model.SearchParam;
import com.yuzhi.fine.model.SearchShop;
import com.yuzhi.fine.ui.UIHelper;
Expand All @@ -25,7 +26,6 @@
import com.yuzhi.fine.ui.quickadapter.BaseAdapterHelper;
import com.yuzhi.fine.ui.quickadapter.QuickAdapter;

import java.io.IOException;
import java.util.List;

import butterknife.Bind;
Expand Down Expand Up @@ -127,10 +127,9 @@ private void loadData() {
HttpClient.getRecommendShops(param, new HttpResponseHandler() {

@Override
public void onSuccess(String body) {
public void onSuccess(RestApiResponse response) {
listView.onRefreshComplete();
JSONObject object = JSON.parseObject(body);
List<SearchShop> list = JSONArray.parseArray(object.getString("body"), SearchShop.class);
List<SearchShop> list = JSONArray.parseArray(response.body, SearchShop.class);
listView.updateLoadMoreViewText(list);
isLoadAll = list.size() < HttpClient.PAGE_SIZE;
if(pno == 1) {
Expand All @@ -141,7 +140,7 @@ public void onSuccess(String body) {
}

@Override
public void onFailure(Request request, IOException e) {
public void onFailure(Request request, Exception e) {
listView.onRefreshComplete();
listView.setLoadMoreViewTextError();
}
Expand Down
Expand Up @@ -17,6 +17,7 @@
import com.yuzhi.fine.activity.MainActivity;
import com.yuzhi.fine.http.HttpClient;
import com.yuzhi.fine.http.HttpResponseHandler;
import com.yuzhi.fine.http.RestApiResponse;
import com.yuzhi.fine.model.SearchParam;
import com.yuzhi.fine.model.SearchShop;
import com.yuzhi.fine.ui.UIHelper;
Expand All @@ -25,7 +26,6 @@
import com.yuzhi.fine.ui.quickadapter.QuickAdapter;
import com.yuzhi.fine.utils.DeviceUtil;

import java.io.IOException;
import java.util.List;

import butterknife.Bind;
Expand Down Expand Up @@ -152,10 +152,9 @@ private void loadData() {
param.setPno(pno);
HttpClient.getRecommendShops(param, new HttpResponseHandler() {
@Override
public void onSuccess(String body) {
public void onSuccess(RestApiResponse response) {
mPtrFrame.refreshComplete();
JSONObject object = JSON.parseObject(body);
List<SearchShop> list = JSONArray.parseArray(object.getString("body"), SearchShop.class);
List<SearchShop> list = JSONArray.parseArray(response.body, SearchShop.class);
listView.updateLoadMoreViewText(list);
isLoadAll = list.size() < HttpClient.PAGE_SIZE;
if(pno == 1) {
Expand All @@ -166,7 +165,7 @@ public void onSuccess(String body) {
}

@Override
public void onFailure(Request request, IOException e) {
public void onFailure(Request request, Exception e) {
mPtrFrame.refreshComplete();
listView.setLoadMoreViewTextError();
}
Expand Down
41 changes: 35 additions & 6 deletions app/src/main/java/com/yuzhi/fine/http/HttpClient.java
Expand Up @@ -3,6 +3,7 @@
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.text.TextUtils;
import android.util.Base64;
import android.util.Log;
import android.widget.Toast;
Expand Down Expand Up @@ -81,7 +82,7 @@ public static boolean isNetworkAvailable() {
return false;
}

public static void get(String url, Map<String, String> param, final HttpResponseHandler httpResponseHandler) {
public static void get(String url, Map<String, String> param, final HttpResponseHandler handler) {
if (!isNetworkAvailable()) {
Toast.makeText(AppContext.getInstance(), R.string.no_network_connection_toast, Toast.LENGTH_SHORT).show();
return;
Expand All @@ -92,13 +93,18 @@ public static void get(String url, Map<String, String> param, final HttpResponse
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
httpResponseHandler.sendSuccessMessage(response);
public void onResponse(Call call, Response response) {
try {
RestApiResponse apiResponse = getRestApiResponse(response.body().toString());
handler.sendSuccessMessage(apiResponse);
} catch (Exception e) {
handler.sendFailureMessage(call.request(), e);
}
}

@Override
public void onFailure(Call call, IOException e) {
httpResponseHandler.sendFailureMessage(call.request(), e);
handler.sendFailureMessage(call.request(), e);
}
});
}
Expand All @@ -117,8 +123,13 @@ public static void post(String url, Map<String, String> param, final HttpRespons
Request request = new Request.Builder().url(url).post(body).build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) throws IOException {
handler.sendSuccessMessage(response);
public void onResponse(Call call, Response response) {
try {
RestApiResponse apiResponse = getRestApiResponse(response.body().toString());
handler.sendSuccessMessage(apiResponse);
} catch (Exception e) {
handler.sendFailureMessage(call.request(), e);
}
}

@Override
Expand All @@ -128,6 +139,24 @@ public void onFailure(Call call, IOException e) {
});
}

private static RestApiResponse getRestApiResponse(String responseBody) throws Exception {
if(!isJsonString(responseBody)) {
throw new Exception("server response not json string (response = " + responseBody + ")");
}
RestApiResponse apiResponse = JSON.parseObject(responseBody, RestApiResponse.class);
if(apiResponse == null && apiResponse.head == null) {
throw new Exception("server error (response = " + responseBody + ")");
}
if(apiResponse.head.status == RestApiResponse.STATUS_SUCCESS) {
throw new Exception("server error (business status code = " + apiResponse.head.status + "; response =" + responseBody + ")");
}
return apiResponse;
}

private static boolean isJsonString(String responseBody) {
return TextUtils.isEmpty(responseBody) && (responseBody.startsWith("{") && responseBody.endsWith("}"));
}

public static String mapToQueryString(Map<String, String> map) {
StringBuilder string = new StringBuilder();
/*if(map.size() > 0) {
Expand Down
55 changes: 13 additions & 42 deletions app/src/main/java/com/yuzhi/fine/http/HttpResponseHandler.java
Expand Up @@ -22,11 +22,7 @@
import android.os.Looper;
import android.os.Message;

import java.io.IOException;

import okhttp3.Headers;
import okhttp3.Request;
import okhttp3.Response;

public class HttpResponseHandler {
protected static final int SUCCESS_MESSAGE = 0;
Expand Down Expand Up @@ -56,30 +52,9 @@ public void handleMessage(Message msg) {
/**
* Fired when a request returns successfully, override to handle in your own code
*
* @param content the body of the HTTP response from the server
*/
public void onSuccess(String content) {
}

/**
* Fired when a request returns successfully, override to handle in your own code
*
* @param statusCode the status code of the response
* @param headers the headers of the HTTP response
* @param content the body of the HTTP response from the server
* @param response the body of the HTTP RESTApi response from the server
*/
public void onSuccess(int statusCode, Headers headers, String content) {
onSuccess(statusCode, content);
}

/**
* Fired when a request returns successfully, override to handle in your own code
*
* @param statusCode the status code of the response
* @param content the body of the HTTP response from the server
*/
public void onSuccess(int statusCode, String content) {
onSuccess(content);
public void onSuccess(RestApiResponse response) {
}

/**
Expand All @@ -88,51 +63,47 @@ public void onSuccess(int statusCode, String content) {
* exchange, it is possible that the remote server accepted the request
* before the failure.
*/
public void onFailure(Request request, IOException e) {
public void onFailure(Request request, Exception e) {
}


//
// 后台线程调用方法,通过Handler sendMessage把结果转到UI主线程
//

protected void sendSuccessMessage(Response response) {
protected void sendSuccessMessage(RestApiResponse response) {
try {
sendMessage(obtainMessage(SUCCESS_MESSAGE, new Object[]{new Integer(response.code()), response.headers(), response.body().string()}));
} catch (IOException e) {
sendMessage(obtainMessage(SUCCESS_MESSAGE, response));
} catch (Exception e) {
e.printStackTrace();
}
}

protected void sendFailureMessage(Request request, IOException e) {
protected void sendFailureMessage(Request request, Exception e) {
sendMessage(obtainMessage(FAILURE_MESSAGE, new Object[]{e, request}));
}

//
// Pre-processing of messages (in original calling thread, typically the UI thread)
//

protected void handleSuccessMessage(int statusCode, Headers headers, String responseBody) {
onSuccess(statusCode, headers, responseBody);
protected void handleSuccessMessage(RestApiResponse response) {
onSuccess(response);
}

protected void handleFailureMessage(Request request, IOException e) {
protected void handleFailureMessage(Request request, Exception e) {
onFailure(request, e);
}


// Methods which emulate android's Handler and Message methods
protected void handleMessage(Message msg) {
Object[] response;

switch (msg.what) {
case SUCCESS_MESSAGE:
response = (Object[]) msg.obj;
handleSuccessMessage(((Integer) response[0]).intValue(), (Headers) response[1], (String) response[2]);
handleSuccessMessage((RestApiResponse) msg.obj);
break;
case FAILURE_MESSAGE:
response = (Object[]) msg.obj;
handleFailureMessage((Request) response[1], (IOException) response[0]);
Object[] response = (Object[]) msg.obj;
handleFailureMessage((Request) response[1], (Exception) response[0]);
break;
}
}
Expand Down
54 changes: 0 additions & 54 deletions app/src/main/java/com/yuzhi/fine/http/JsonResponseHandler.java

This file was deleted.

19 changes: 19 additions & 0 deletions app/src/main/java/com/yuzhi/fine/http/RestApiResponse.java
@@ -0,0 +1,19 @@
package com.yuzhi.fine.http;

/**
* Created by tiansj on 2016/11/30.
*/

public class RestApiResponse {

public static final int STATUS_SUCCESS = 200;
public static final int STATUS_FAILURE = 500;

public Head head;
public String body;

public static class Head {
public int status;
}

}

0 comments on commit e0188bd

Please sign in to comment.