1、将okhttp请求替换为别的library类库,比如谷歌原生的HttpUrlConnection等。如果在框架设计的时候没有考虑到框架如何去拓展,那么需要修改很多地方。但是我们所设计的框架,在一开始就考虑到了网络拓展这方面的因素,只需要继承HttpRequest和HttpResponse就可以了,因为会对HttpRequest和HttpResponse做同样的使用
2、封装原始的HttpResponse,只需要继承抽象类AbstractHttpResponse就可以了
public class OriginHttpResponse extends AbstractHttpResponse {
private HttpURLConnection mConnection;
public OriginHttpResponse(HttpURLConnection connection) {
this.mConnection = connection;
}
@Override
public HttpStatus getStatus() {
try {
return HttpStatus.getValue(mConnection.getResponseCode());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public String getStatusMsg() {
try {
return mConnection.getResponseMessage();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public long getContentLength() {
return mConnection.getContentLength();
}
@Override
protected InputStream getBodyInternal() throws IOException {
return mConnection.getInputStream();
}
@Override
protected void closeInternal() {
mConnection.disconnect();
}
@Override
public HttpHeader getHeaders() {
HttpHeader header = new HttpHeader();
for (Map.Entry<String, List<String>> entry : mConnection.getHeaderFields().entrySet()) {
header.set(entry.getKey(), entry.getValue().get(0));
}
return header;
}
}
3、对HttpRequest进行封装,也只需要继承抽象类AbstractHttpRequest就可以了
public class OriginHttpRequest extends BufferHttpRequest {
private HttpURLConnection mConnection;
private String mUrl;
private HttpMethod mMethod;
public OriginHttpRequest(HttpURLConnection connection, HttpMethod method, String url) {
this.mConnection = connection;
this.mUrl = url;
this.mMethod = method;
}
@Override
protected HttpResponse executeInternal(HttpHeader header, byte[] data) throws IOException {
for (Map.Entry<String, String> entry : header.entrySet()) {
mConnection.addRequestProperty(entry.getKey(), entry.getValue());
}
mConnection.setDoOutput(true);
mConnection.setDoInput(true);
mConnection.setRequestMethod(mMethod.name());
mConnection.connect();
if (data != null && data.length > 0) {
OutputStream out = mConnection.getOutputStream();
out.write(data,0,data.length);
out.close();
}
OriginHttpResponse response = new OriginHttpResponse(mConnection);
return response;
}
@Override
public HttpMethod getMethod() {
return mMethod;
}
@Override
public URI getUri() {
return URI.create(mUrl);
}
}
4、创建工厂类
public class OriginHttpRequestFactory implements HttpRequestFactory {
private HttpURLConnection mConnection;
public OriginHttpRequestFactory() {
}
public void setReadTimeOut(int readTimeOut) {
mConnection.setReadTimeout(readTimeOut);
}
public void setConnectionTimeOut(int connectionTimeOut) {
mConnection.setConnectTimeout(connectionTimeOut);
}
@Override
public HttpRequest createHttpRequest(URI uri, HttpMethod method) throws IOException {
mConnection = (HttpURLConnection) uri.toURL().openConnection();
return new OriginHttpRequest(mConnection, method, uri.toString());
}
}
5、上层调用,在不支持OKHTTP_REQUEST的时候就调用OriginHttpRequestFactory创建请求
public class HttpRequestProvider {
private static boolean OKHTTP_REQUEST = Utills.isExist("okhttp3.OkHttpClient", HttpRequestProvider.class.getClassLoader());
private HttpRequestFactory mHttpRequestFactory;
public HttpRequestProvider() {
if (OKHTTP_REQUEST) {
mHttpRequestFactory = new OkHttpRequestFactory();
} else {
mHttpRequestFactory = new OriginHttpRequestFactory();
}
}
public HttpRequest getHttpRequest(URI uri, HttpMethod httpMethod) throws IOException {
return mHttpRequestFactory.createHttpRequest(uri, httpMethod);
}
public HttpRequestFactory getHttpRequestFactory() {
return mHttpRequestFactory;
}
public void setHttpRequestFactory(HttpRequestFactory httpRequestFactory) {
mHttpRequestFactory = httpRequestFactory;
}
}