package com.yong.volleyok.okhttp; | |
import com.android.volley.AuthFailureError; | |
import com.android.volley.Request; | |
import com.android.volley.toolbox.HttpStack; | |
import org.apache.http.HttpEntity; | |
import org.apache.http.HttpResponse; | |
import org.apache.http.ProtocolVersion; | |
import org.apache.http.StatusLine; | |
import org.apache.http.entity.BasicHttpEntity; | |
import org.apache.http.message.BasicHeader; | |
import org.apache.http.message.BasicHttpResponse; | |
import org.apache.http.message.BasicStatusLine; | |
import java.io.IOException; | |
import java.util.Map; | |
import java.util.concurrent.TimeUnit; | |
import okhttp3.Headers; | |
import okhttp3.MediaType; | |
import okhttp3.OkHttpClient; | |
import okhttp3.Protocol; | |
import okhttp3.RequestBody; | |
import okhttp3.Response; | |
import okhttp3.ResponseBody; | |
/** | |
* <b>Project:</b> com.yong.volleyok <br> | |
* <b>Create Date:</b> 2016/4/22 <br> | |
* <b>Author:</b> qingyong <br> | |
* <b>Description:</b> 使用OkHttp作为Volley的请求的实现 <br> | |
*/ | |
public class OkHttp3Stack implements HttpStack { | |
private final OkHttpClient mClient; | |
public OkHttp3Stack(OkHttpClient client) { | |
this.mClient = client; | |
} | |
private static HttpEntity entityFromOkHttpResponse(Response response) throws IOException { | |
BasicHttpEntity entity = new BasicHttpEntity(); | |
ResponseBody body = response.body(); | |
entity.setContent(body.byteStream()); | |
entity.setContentLength(body.contentLength()); | |
entity.setContentEncoding(response.header("Content-Encoding")); | |
if (body.contentType() != null) { | |
entity.setContentType(body.contentType().type()); | |
} | |
return entity; | |
} | |
@SuppressWarnings("deprecation") | |
private static void setConnectionParametersForRequest | |
(okhttp3.Request.Builder builder, Request<?> request) | |
throws IOException, AuthFailureError { | |
switch (request.getMethod()) { | |
case Request.Method.DEPRECATED_GET_OR_POST: | |
byte[] postBody = request.getPostBody(); | |
if (postBody != null) { | |
builder.post(RequestBody.create | |
(MediaType.parse(request.getPostBodyContentType()), postBody)); | |
} | |
break; | |
case Request.Method.GET: | |
builder.get(); | |
break; | |
case Request.Method.DELETE: | |
builder.delete(); | |
break; | |
case Request.Method.POST: | |
builder.post(createRequestBody(request)); | |
break; | |
case Request.Method.PUT: | |
builder.put(createRequestBody(request)); | |
break; | |
case Request.Method.HEAD: | |
builder.head(); | |
break; | |
case Request.Method.OPTIONS: | |
builder.method("OPTIONS", null); | |
break; | |
case Request.Method.TRACE: | |
builder.method("TRACE", null); | |
break; | |
case Request.Method.PATCH: | |
builder.patch(createRequestBody(request)); | |
break; | |
default: | |
throw new IllegalStateException("Unknown method type."); | |
} | |
} | |
private static RequestBody createRequestBody(Request request) throws AuthFailureError { | |
final byte[] body = request.getBody(); | |
if (body == null) return null; | |
return RequestBody.create(MediaType.parse(request.getBodyContentType()), body); | |
} | |
private static ProtocolVersion parseProtocol(final Protocol protocol) { | |
switch (protocol) { | |
case HTTP_1_0: | |
return new ProtocolVersion("HTTP", 1, 0); | |
case HTTP_1_1: | |
return new ProtocolVersion("HTTP", 1, 1); | |
case SPDY_3: | |
return new ProtocolVersion("SPDY", 3, 1); | |
case HTTP_2: | |
return new ProtocolVersion("HTTP", 2, 0); | |
} | |
throw new IllegalAccessError("Unkwown protocol"); | |
} | |
@Override | |
public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders) | |
throws IOException, AuthFailureError { | |
int timeoutMs = request.getTimeoutMs(); | |
OkHttpClient client = mClient.newBuilder() | |
.readTimeout(timeoutMs, TimeUnit.MILLISECONDS) | |
.connectTimeout(timeoutMs, TimeUnit.MILLISECONDS) | |
.writeTimeout(timeoutMs, TimeUnit.MILLISECONDS) | |
.build(); | |
// 请求构造器 | |
okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder(); | |
Map<String, String> headers = request.getHeaders(); | |
for (final String name : headers.keySet()) { | |
okHttpRequestBuilder.addHeader(name, headers.get(name)); | |
} | |
for (final String name : additionalHeaders.keySet()) { | |
okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name)); | |
} | |
setConnectionParametersForRequest(okHttpRequestBuilder, request); | |
// 请求 | |
okhttp3.Request okhttp3Request = okHttpRequestBuilder. | |
url(request.getUrl()). | |
build(); | |
// 响应 | |
Response okHttpResponse = client.newCall(okhttp3Request).execute(); | |
StatusLine responseStatus = new BasicStatusLine | |
( | |
parseProtocol(okHttpResponse.protocol()), | |
okHttpResponse.code(), | |
okHttpResponse.message() | |
); | |
BasicHttpResponse response = new BasicHttpResponse(responseStatus); | |
response.setEntity(entityFromOkHttpResponse(okHttpResponse)); | |
Headers responseHeaders = okHttpResponse.headers(); | |
for (int i = 0, len = responseHeaders.size(); i < len; i++) { | |
final String name = responseHeaders.name(i), value = responseHeaders.value(i); | |
if (name != null) { | |
response.addHeader(new BasicHeader(name, value)); | |
} | |
} | |
return response; | |
} | |
} |
时间: 2024-10-01 20:28:04