创建基于HttpUrlConnection的具体获取网络数据流HttpUrlConnectionUtil
public class HttpUrlConnectionUtil { public static ByteArrayOutputStream execute(Request request) throws HttpException { switch (request.requestMethod) { case GET: return get(request); case POST: return post(request);
} return null;
} private static ByteArrayOutputStream get(Request request) throws HttpException { try {
HttpURLConnection connection = (HttpURLConnection) new URL(request.url).openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(15 * 1000);
addHeaders(connection, request); if (HttpStatus.HTTP_OK == connection.getResponseCode()) {
InputStream is = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int len = 0; while (-1 != (len = is.read(buffer))) {
baos.write(buffer, 0, len);
}
baos.flush();
baos.close();
is.close(); return baos;
}
} catch (MalformedURLException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} catch (ProtocolException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} catch (SocketTimeoutException e) { throw new HttpException(HttpException.Status.TIMEOUT_EXCEPTION);
} catch (IOException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} private static ByteArrayOutputStream post(Request request) throws HttpException { try {
HttpURLConnection connection = (HttpURLConnection) new URL(request.url).openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(15 * 1000);
connection.setDoOutput(true);
connection.setDoInput(true);
addHeaders(connection, request);
StringBuilder out = new StringBuilder(); for (String key : request.body.keySet()) { if (out.length() != 0) {
out.append("&");
}
out.append(key).append("=").append(request.body.get(key));
}
OutputStream outputStream = connection.getOutputStream();
outputStream.write(out.toString().getBytes()); if (HttpStatus.HTTP_OK == connection.getResponseCode()) {
InputStream is = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[2048]; int len = 0; while (-1 != (len = is.read(buffer))) {
baos.write(buffer, 0, len);
}
baos.flush();
baos.close();
is.close(); return baos;
}
} catch (MalformedURLException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} catch (ProtocolException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} catch (SocketTimeoutException e) { throw new HttpException(HttpException.Status.TIMEOUT_EXCEPTION);
} catch (IOException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} throw new HttpException(HttpException.Status.XXX_EXCEPTION);
} private static void addHeaders(HttpURLConnection connection, Request request) { for (Map.Entry<String, String> header : request.headers.entrySet()) {
connection.addRequestProperty(header.getKey(), header.getValue());
}
}
}包装具体每一个请求的Request类
public class Request {
/**
* 请求地址
*/
public String url; /**
* 请求form表单
*/
public Map<String, String> body; /**
* 请求头
*/
public Map<String, String> headers = new HashMap<>(); /**
* 请求方法
*/
public RequestMethod requestMethod; /**
* 请求回调
*/
public AbsCallback callBack; /**
* 请求重试次数
*/
public int maxRequestCount = 3; public enum RequestMethod {GET, POST} public Request(String url, RequestMethod requestMethod) { this.url = url; this.requestMethod = requestMethod;
} public Request setUrl(String url) { this.url = url; return this;
} public Request setBody(Map<String, String> body) { this.body = body; return this;
} public void setCallBack(AbsCallback callBack) { this.callBack = callBack;
}
}基于Handler、ThreadPoolExecutor线程池的异步请求处理类
public class RequestTask { private static final int MAIN_THREAD = 0x0001; private static InnerHandler handler = new InnerHandler(); private final ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5,
Integer.MAX_VALUE, 60 * 1000,
TimeUnit.MILLISECONDS, new LinkedBlockingDeque<Runnable>(128)); private Request request; public RequestTask(Request request) { this.request = request;
} public void execute() {
poolExecutor.execute(new Runnable() { @Override
public void run() {
Result result = request(0);
Message message = handler.obtainMessage();
message.obj = result;
message.what = MAIN_THREAD;
handler.sendMessage(message);
}
});
} private Result request(int retry) { try { final ByteArrayOutputStream response = HttpUrlConnectionUtil.execute(request); return new Result(RequestTask.this, request.callBack.handleData(response));
} catch (HttpException e) { if (e.type == HttpException.Status.TIMEOUT_EXCEPTION) { if (retry < request.maxRequestCount) {
retry++;
request(retry);
}
} return new Result(RequestTask.this, e);
}
} private static class InnerHandler extends Handler { private InnerHandler() { super(Looper.getMainLooper());
} @Override
public void handleMessage(Message msg) {
Result result = (Result) msg.obj; switch (msg.what) { case MAIN_THREAD: if (result.response instanceof Exception) {
result.requestTask.request.callBack.failure((Exception) result.response); return;
}
result.requestTask.request.callBack.sucess(result.response);
}
}
} private static class Result<T> { private RequestTask requestTask; private T response; private Result(RequestTask requestTask, T response) { this.requestTask = requestTask; this.response = response;
}
}
}可拓展的响应处理callback,自己可根据需要拓展
public interface AbsCallback<T> { void sucess(T response); void failure(Exception e); T handleData(ByteArrayOutputStream response) throws HttpException;
}public abstract class JsonCallback<T> implements AbsCallback<T> { private static Gson gson = new Gson(); @Override
@SuppressWarnings("unchecked") public T handleData(ByteArrayOutputStream response) throws HttpException { try {
Class<T> clz= (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; return gson.fromJson(response.toString("UTF-8"),clz);
} catch (UnsupportedEncodingException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
}
}
}public abstract class StringCallback implements AbsCallback<String> { @Override
public String handleData(ByteArrayOutputStream response) throws HttpException { try { return response.toString("UTF-8");
} catch (UnsupportedEncodingException e) { throw new HttpException(HttpException.Status.XXX_EXCEPTION);
}
}
}
作者:进击de小黑
链接:https://www.jianshu.com/p/96955b7cefd3
随时随地看视频