Android 网络请求通用的get与post模式

Android 网络请求通用的get与post方式

在我们开发项目时,经常会涉及到网络交互这一块,很多时候都是多人同时开发一个项目。因此一个好的架构师,通常会在搭建框架时,会构建一个统一的IO工具类,进行网络交互,这样便于统一管理。如果每个人写一套自己的IO网络交互,则会显得杂乱。有点重复发明*的感觉。好了,题外话不多说,下面附上我经常使用的IO网络交互工具类代码,仅供参考交流。


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.CoreConnectionPNames;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;


public class IoUtil {
	// 网络连接超时时间
	private static final int DEF_CONN_TIMEOUT = 30 * 1000;
	// 网络sock通信超时时间
	private static final int DEF_SOCKET_TIMEOUT = 30 * 1000;

	/**
	 * post请求获取服务端数据
	 */
	public static String responseFromServiceByPost(String url,
			HashMap<String, String> map) {
		if (url == null || url.equals("") || map == null) {
			return null;
		}
		HttpPost httpPost = null;
		URI encodedUri = null;
		try {
			encodedUri = new URI(url);
			httpPost = new HttpPost(encodedUri);
		} catch (URISyntaxException e) {
			// 清理一些空格
			String encodedUrl = url.replace(' ', '+');
			httpPost = new HttpPost(encodedUrl);
			e.printStackTrace();
		}
		HttpClient httpClient = new DefaultHttpClient();
		httpClient.getParams().setParameter(
				CoreConnectionPNames.CONNECTION_TIMEOUT, DEF_CONN_TIMEOUT);
		httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
				DEF_SOCKET_TIMEOUT);
		try {
			List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>();
			for (Map.Entry<String, String> entry : map.entrySet()) {
				String key = entry.getKey().toString();
				String value = null;
				if (entry.getValue() == null) {
					value = "";
				} else {
					value = entry.getValue().toString();
				}
				BasicNameValuePair basicNameValuePair = new BasicNameValuePair(
						key, value);
				nameValuePair.add(basicNameValuePair);
			}
			httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair, "GBK")); // 此处也可以改为UTF-8
			HttpResponse httpResponse = httpClient.execute(httpPost);
			if (httpResponse != null) {
				int code = httpResponse.getStatusLine().getStatusCode();
				if (code == HttpStatus.SC_OK) {
					HttpEntity entity = httpResponse.getEntity();
					String result = EntityUtils.toString(entity).trim();
					return result;
				} else {
					httpPost.abort();
				}
			} else {
				httpPost.abort();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} catch (OutOfMemoryError e) {
			e.printStackTrace();
			return null;
		} finally {
			if (httpClient != null) {
				httpClient.getConnectionManager().shutdown();
				httpClient = null;
			}

		}
		return null;
	}

	/**
	 * get请求获取服务端数据
	 */
	public static String responseFromServiceByGet(String url,
			HashMap<String, String> map) {
		if (url == null || url.equals("")) {
			return null;
		}
		if (map != null) {
			StringBuilder sb = new StringBuilder(url);
			sb.append('?');
			for (Map.Entry<String, String> entry : map.entrySet()) {
				String key = entry.getKey().toString();
				String value = null;
				if (entry.getValue() == null) {
					value = "";
				} else {
					value = entry.getValue().toString();
				}
				sb.append(key);
				sb.append('=');
				try {
					value = URLEncoder.encode(value, HTTP.UTF_8);
					sb.append(value);
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
				sb.append('&');
			}
			sb.deleteCharAt(sb.length() - 1);// 删除最后一个"&"
			url = sb.toString();
		}
		HttpGet httpGet = null;
		URI encodedUri = null;
		InputStream is = null;
		try {
			encodedUri = new URI(url);
			httpGet = new HttpGet(encodedUri);
		} catch (URISyntaxException e) {
			// 清理一些空格
			String encodedUrl = url.replace(' ', '+');
			httpGet = new HttpGet(encodedUrl);
			e.printStackTrace();
		}
		HttpClient httpClient = new DefaultHttpClient();
		httpClient.getParams().setParameter(
				CoreConnectionPNames.CONNECTION_TIMEOUT, DEF_CONN_TIMEOUT);
		httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
				DEF_SOCKET_TIMEOUT);
		try {
			HttpResponse httpResponse = httpClient.execute(httpGet);
			if (httpResponse != null) {
				int httpCode = httpResponse.getStatusLine().getStatusCode();
				if (httpCode == HttpStatus.SC_OK) {
					HttpEntity entity = httpResponse.getEntity();
					is = entity.getContent();
					if (is != null) {
						return getStr1FromInputstream(is);
					}
				} else {
					httpGet.abort();
				}
			} else {
				httpGet.abort();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} catch (OutOfMemoryError e) {
			e.printStackTrace();
			return null;
		} finally {
			if (httpClient != null) {
				httpClient.getConnectionManager().shutdown();
				httpClient = null;
			}

		}
		return null;
	}

	/**
	 * 判断网络线路状态
	 */
	public static boolean checkNetworkIsGood(String url) {
		if (url == null || url.equals("")) {
			return false;
		}
		HttpGet httpGet = null;
		URI encodedUri = null;
		try {
			encodedUri = new URI(url);
			httpGet = new HttpGet(encodedUri);
		} catch (URISyntaxException e) {
			// 清理一些空格
			String encodedUrl = url.replace(' ', '+');
			httpGet = new HttpGet(encodedUrl);
			e.printStackTrace();
		}
		HttpClient httpClient = new DefaultHttpClient();
		httpClient.getParams().setParameter(
				CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);
		httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
				5000);
		try {
			HttpResponse httpResponse = httpClient.execute(httpGet);
			if (httpResponse != null) {
				int uRC = httpResponse.getStatusLine().getStatusCode();
				if (uRC == HttpStatus.SC_OK) {
					return true;
				} else {
					httpGet.abort();
				}
			} else {
				httpGet.abort();
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			if (httpClient != null) {
				httpClient.getConnectionManager().shutdown();
				httpClient = null;
			}
		}
		return false;
	}

	// 把inputstream转换为字符串(方法一)
	private static String getStr1FromInputstream(InputStream input) {
		String result = null;
		int i = -1;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {
			while ((i = input.read()) != -1) {
				baos.write(i);
			}
			result = baos.toString();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return result;
	}

}