基于okhttp的Volley

 

import com.android.volley.toolbox.HttpStack;
import com.android.volley.AuthFailureError;
import com.squareup.okhttp.Headers;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Protocol;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import com.squareup.okhttp.ResponseBody;
 
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;
 
public class OkHttpStack implements HttpStack {
	private final OkHttpClient mClient;

	public OkHttpStack(OkHttpClient client) {
		this.mClient = client;
	}

	@Override
	public HttpResponse performRequest(com.android.volley.Request<?> request, Map<String, String> additionalHeaders)
			throws IOException, AuthFailureError {
		OkHttpClient client = mClient.clone();
		int timeoutMs = request.getTimeoutMs();
		client.setConnectTimeout(timeoutMs, TimeUnit.MILLISECONDS);
		client.setReadTimeout(timeoutMs, TimeUnit.MILLISECONDS);
		client.setWriteTimeout(timeoutMs, TimeUnit.MILLISECONDS);

		com.squareup.okhttp.Request.Builder okHttpRequestBuilder = new com.squareup.okhttp.Request.Builder();
		okHttpRequestBuilder.url(request.getUrl());

		Map<String, String> headers = request.getHeaders();

		for (final String name : headers.keySet()) {
			if (name!=null&& headers.get(name)!=null) {
				okHttpRequestBuilder.addHeader(name, headers.get(name));
			}
			
		}

		for (final String name : additionalHeaders.keySet()) {
			if (name!=null&& headers.get(name)!=null) 
				okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));
		}

		setConnectionParametersForRequest(okHttpRequestBuilder, request);

		com.squareup.okhttp.Request okHttpRequest = okHttpRequestBuilder.build();
		Response okHttpResponse = client.newCall(okHttpRequest).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;
	}

	private static HttpEntity entityFromOkHttpResponse(Response r) throws IOException {
		BasicHttpEntity entity = new BasicHttpEntity();
		ResponseBody body = r.body();

		entity.setContent(body.byteStream());
		entity.setContentLength(body.contentLength());
		entity.setContentEncoding(r.header("Content-Encoding"));

		if (body.contentType() != null) {
			entity.setContentType(body.contentType().type());
		}
		return entity;
	}


	private static void setConnectionParametersForRequest(com.squareup.okhttp.Request.Builder builder,
			com.android.volley.Request<?> request) throws IOException, AuthFailureError {
		switch (request.getMethod()) {
		case com.android.volley.Request.Method.DEPRECATED_GET_OR_POST:
			// Ensure backwards compatibility.
			// Volley assumes a request with a null body is a GET.
			byte[] postBody = request.getPostBody();

			if (postBody != null) {
				builder.post(RequestBody.create(MediaType.parse(request.getPostBodyContentType()), postBody));
			}
			break;

		case com.android.volley.Request.Method.GET:
			builder.get();
			break;

		case com.android.volley.Request.Method.DELETE:
			builder.delete();
			break;

		case com.android.volley.Request.Method.POST:
			builder.post(createRequestBody(request));
			break;

		case com.android.volley.Request.Method.PUT:
			builder.put(createRequestBody(request));
			break;

		// case com.android.volley.Request.Method.HEAD:
		// builder.head();
		// break;
		//
		// case com.android.volley.Request.Method.OPTIONS:
		// builder.method("OPTIONS", null);
		// break;
		//
		// case com.android.volley.Request.Method.TRACE:
		// builder.method("TRACE", null);
		// break;
		//
		// case com.android.volley.Request.Method.PATCH:
		// builder.patch(createRequestBody(request));
		// break;

		default:
			throw new IllegalStateException("Unknown method type.");
		}
	}

	private static ProtocolVersion parseProtocol(final Protocol p) {
		switch (p) {
		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");
	}

	private static RequestBody createRequestBody(com.android.volley.Request<?> r) throws AuthFailureError {
		final byte[] body = r.getBody();
		if (body == null)
			return null;

		return RequestBody.create(MediaType.parse(r.getBodyContentType()), body);
	}
}


使用 

Volley.newRequestQueue(App.ctx, new OkHttpStack(new OkHttpClient()));



你可能感兴趣的:(android)