1、HTTP请求封装工具类源码
支持 GET、POST 请求。
import android.util.Log; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpUtility { private static final int BUFFER_SIZE = 4096; private static final String TAG = "HttpUtility"; public static void get(final String requestUrl, final OnRequestCallBack callBack) { new Thread() { public void run() { getRequest(requestUrl, callBack); } }.start(); } public static void post(final String requestUrl, final String params, final OnRequestCallBack callBack) { new Thread() { public void run() { postRequest(requestUrl, params, callBack); } }.start(); } private static void getRequest(String requestUrl, OnRequestCallBack callBack) { boolean isSuccess = false; String message; InputStream inputStream = null; ByteArrayOutputStream baos = null; try { URL url = new URL(requestUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(50000); connection.setReadTimeout(50000); // User-Agent IE9的标识 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"); connection.setRequestProperty("Accept-Language", "zh-CN"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); /* * 当我们要获取我们请求的http地址访问的数据时就是使用connection.getInputStream().read()方式时我们就需要setDoInput(true), * 根据api文档我们可知doInput默认就是为true。我们可以不用手动设置了,如果不需要读取输入流的话那就setDoInput(false)。 * 当我们要采用非get请求给一个http网络地址传参 就是使用connection.getOutputStream().write() 方法时我们就需要setDoOutput(true), 默认是false */ // 设置是否从httpUrlConnection读入,默认情况下是true; connection.setDoInput(true); // 设置是否向httpUrlConnection输出,如果是post请求,参数要放在http正文内,因此需要设为true, 默认是false; //connection.setDoOutput(true);//Android 4.0 GET时候 用这句会变成POST 报错java.io.FileNotFoundException connection.setUseCaches(false); connection.connect();// int contentLength = connection.getContentLength(); if (connection.getResponseCode() == 200) { inputStream = connection.getInputStream();//会隐式调用connect() baos = new ByteArrayOutputStream(); int readLen; byte[] bytes = new byte[1024]; while ((readLen = inputStream.read(bytes)) != -1) { baos.write(bytes, 0, readLen); } String result = baos.toString(); message = "result:" + result; isSuccess = true; } else { message = "get request err code :" + connection.getResponseCode(); } Log.i(TAG,message); } catch (MalformedURLException e) { message = e.getMessage(); e.printStackTrace(); } catch (IOException e) { message = e.getMessage(); e.printStackTrace(); } finally { try { if (baos != null) { baos.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { message = e.getMessage(); e.printStackTrace(); } } if (isSuccess) { callBack.onSuccess(message); } else { callBack.onError(message); } } private static void postRequest(String requestUrl, String params, OnRequestCallBack callBack) { boolean isSuccess = false; String message; InputStream inputStream = null; ByteArrayOutputStream baos = null; try { URL url = new URL(requestUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 设定请求的方法为"POST" connection.setRequestMethod("POST"); connection.setConnectTimeout(50000); connection.setReadTimeout(50000); // User-Agent IE9的标识 connection.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"); connection.setRequestProperty("Accept-Language", "zh-CN"); connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); /* * 当我们要获取我们请求的http地址访问的数据时就是使用connection.getInputStream().read()方式时我们就需要setDoInput(true), * 根据api文档我们可知doInput默认就是为true。我们可以不用手动设置了,如果不需要读取输入流的话那就setDoInput(false)。 * 当我们要采用非get请求给一个http网络地址传参 就是使用connection.getOutputStream().write() 方法时我们就需要setDoOutput(true), 默认是false */ // 设置是否从httpUrlConnection读入,默认情况下是true; connection.setDoInput(true); // 设置是否向httpUrlConnection输出,如果是post请求,参数要放在http正文内,因此需要设为true, 默认是false; connection.setDoOutput(true); connection.setUseCaches(false); // set params three way OutputStreamWriter OutputStreamWriter out = new OutputStreamWriter( connection.getOutputStream(), "UTF-8"); // 发送请求params参数 out.write(params); out.flush(); connection.connect(); int contentLength = connection.getContentLength(); if (connection.getResponseCode() == 200) { // 会隐式调用connect() inputStream = connection.getInputStream(); baos = new ByteArrayOutputStream(); int readLen; byte[] bytes = new byte[1024]; while ((readLen = inputStream.read(bytes)) != -1) { baos.write(bytes, 0, readLen); } String backStr = baos.toString(); message = backStr; isSuccess = true; } else { message = "post request err code :" + connection.getResponseCode(); } Log.i(TAG,message); } catch (MalformedURLException e) { message = e.getMessage(); e.printStackTrace(); } catch (IOException e) { message = e.getMessage(); e.printStackTrace(); } finally { try { if (baos != null) { baos.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { message = e.getMessage(); e.printStackTrace(); } } if (isSuccess) { callBack.onSuccess(message); } else { callBack.onError(message); } } public interface OnRequestCallBack { void onSuccess(String json); void onError(String errorMsg); } }
2.使用案例
HttpUtility.get(SERVER_URL,new HttpUtility.OnRequestCallBack() { @Override public void onSuccess(String json) { Log.d(TAG,json); } @Override public void onError(String errorMsg) { Log.e(TAG,errorMsg); } });