package com.shizhefei.mvc.http.okhttp;
import com.shizhefei.mvc.ResponseSender;
import com.shizhefei.mvc.http.AbsHttpMethod;
import java.util.Map;
import java.util.Map.Entry;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public abstract class HttpMethod<METHOD extends HttpMethod> extends AbsHttpMethod<METHOD, Callback> {
private static OkHttpClient defaultClient = new OkHttpClient();
private Call call;
public HttpMethod() {
}
public HttpMethod(String url) {
this(defaultClient, url);
}
public HttpMethod(OkHttpClient httpClient, String url) {
super(url);
this.client = httpClient;
}
public static void setDefaultOkHttpClient(OkHttpClient okHttpClient) {
defaultClient = okHttpClient;
}
public static OkHttpClient getDefaultOkHttpClient() {
return defaultClient;
}
public HttpMethod setOkHttpClient(OkHttpClient client) {
this.client = client;
return this;
}
private OkHttpClient client;
protected abstract Request.Builder buildRequset(String url, Map<String, Object> params);
/**
* 执行异步请求,执行的结果会自动调用sender的sender.sendData,执行失败或者出现异常会调用sender.sendError
*
* @param sender mvchelper的datasource的ResponseSender
* @param responseParser 数据解析器
* @param <DATA>
*/
public final <DATA> void executeAsync(ResponseSender<DATA> sender, final ResponseParser<DATA> responseParser) {
executeAsync(new CallBackParser<DATA>(sender, responseParser));
}
/**
* 执行异步请求,callback回调请求结果
*
* @param callback 请求的回调
*/
@Override
public final void executeAsync(Callback callback) {
Request request = buildRequest();
call = client.newCall(request);
call.enqueue(callback);
}
/**
* 执行同步请求,解析Response
*
* @param responseParser 数据解析器
* @param <DATA>
* @return 返回请求后解析得到的数据
* @throws Exception
*/
public final <DATA> DATA executeSync(ResponseParser<DATA> responseParser) throws Exception {
return responseParser.parse(executeSync());
}
/**
* 执行同步请求
*
* @return 返回请求回来的 Response
* @throws Exception
*/
public final Response executeSync() throws Exception {
Request request = buildRequest();
call = client.newCall(request);
return call.execute();
}
private Request buildRequest() {
Request.Builder requestBuilder = buildRequset(getUrl(), getParams());
Map<String, String> headers = getHeaders();
for (Entry<String, String> entry : headers.entrySet()) {
requestBuilder.header(entry.getKey(), entry.getValue());
}
return requestBuilder.build();
}
@Override
public void cancle() {
if (call != null) {
call.cancel();
}
}
@Override
public boolean isRunning() {
return call != null && !call.isExecuted();
}
}