1. 程式人生 > >HttpClient(訪問網路) get方式,post方式。返回值有String,InputStream,byte[]

HttpClient(訪問網路) get方式,post方式。返回值有String,InputStream,byte[]


import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
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.util.EntityUtils;


public class HttpClientHelper {
	/**
	 * 作用:實現網路訪問檔案,將獲取到資料儲存在檔案流中
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @return inputstream
	 */
	public static InputStream loadFileFromURL(String url) {
		// 建立HttpClient物件:通過例項化DefaultHttpClient獲得;
		HttpClient httpClient = new DefaultHttpClient();
		// 建立HttpGet或HttpPost物件:通過例項化 HttpGet或HttpPost
		// 獲得,而構造方法的引數是urlstring(即需要訪問的網路url地址)。也可以通過呼叫setParams()方法來新增請求引數;
		HttpGet methodGet = new HttpGet(url);
		try {
			// 呼叫HttpClient物件的execute()方法,引數是剛才建立的 HttpGet或HttpPost物件
			// ,返回值是HttpResponse物件;
			HttpResponse response = httpClient.execute(methodGet);
			// 通過response物件中的getStatusLine()方法和getStatusCode()方法獲取伺服器響應狀態。
			if (response.getStatusLine().getStatusCode() == 200) {
				// response物件的getEntity()方法,返回HttpEntity物件。該物件中包含了伺服器頁面body體之內的內容。
				HttpEntity entity = response.getEntity();
				// entity物件的getContent()方法將從伺服器中獲取到所有內容放到inputstream物件中。
				return entity.getContent();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:實現網路訪問檔案,返回字串
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @return String
	 */
	public static String loadTextFromURL(String url) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet methodGet = new HttpGet(url);
		try {
			HttpResponse response = httpClient.execute(methodGet);
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();
				// 藉助EntityUtils的toString()方法對 HttpEntity物件進行處理,返回字串。
				return EntityUtils.toString(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:實現網路訪問檔案,將獲取到的資料存在位元組陣列中
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @return byte[]
	 */
	public static byte[] loadByteFromURL(String url) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet methodGet = new HttpGet(url);
		try {
			HttpResponse response = httpClient.execute(methodGet);
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();
				// 藉助EntityUtils的toByteArray()方法對
				// HttpEntity物件進行處理,將entity物件中的內容處理成自己陣列。
				return EntityUtils.toByteArray(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:實現網路訪問檔案,先給伺服器通過“GET”方式提交資料,再返回相應的資料
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @param params
	 *            :訪問url時,需要傳遞給伺服器的引數。格式為:username=wangxiangjun&password=abcde&
	 *            qq=32432432
	 *            為了防止傳中文引數時出現編碼問題。採用URLEncoder.encode()對含中文的字串進行編碼處理。
	 *            伺服器端會自動對進行過編碼的字串進行decode()解碼。
	 * @return byte[]
	 */
	public static byte[] doGetSubmit(String url, String params) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpGet methodGet = new HttpGet(url + "?" + params);
		try {
			HttpResponse response = httpClient.execute(methodGet);
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();
				// 藉助EntityUtils的toByteArray()方法對
				// HttpEntity物件進行處理,將entity物件中的內容處理成自己陣列。
				return EntityUtils.toByteArray(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:實現網路訪問檔案,先給伺服器通過“POST”方式提交資料,再返回相應的資料
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @param
	 * 
	 * @return byte[]
	 */
	public static byte[] doPostSubmit(String url, List<NameValuePair> params) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost methodPost = new HttpPost(url);
		try {
			methodPost.setEntity(new UrlEncodedFormEntity(params));
			HttpResponse response = httpClient.execute(methodPost);
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();
				// 藉助EntityUtils的toByteArray()方法對
				// HttpEntity物件進行處理,將entity物件中的內容處理成自己陣列。
				return EntityUtils.toByteArray(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:實現網路訪問檔案,先給伺服器通過“POST”方式提交資料,再返回相應的資料
	 * 
	 * @param url
	 *            :訪問網路的url地址
	 * @param
	 * @return byte[]
	 */
	public static byte[] doPostSubmit(String url, Map<String, Object> params) {
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost methodPost = new HttpPost(url);
		// 將map中的資料一一放進List<NameValuePair>物件中。
		// 之所以要做這一步驟,是因為HttpPost物件的setEntity()方法只接收List<NameValuePair>物件作為引數。
		List<NameValuePair> list = new ArrayList<NameValuePair>();
		for (Map.Entry<String, Object> entry : params.entrySet()) {
			list.add(new BasicNameValuePair(entry.getKey(), entry.getValue()
					.toString()));
		}
		try {
			// 將表單中的資料先放進list物件中,然後再被放到UrlEncodedFormEntity物件中,
			// 最後再通過HttpPost物件的setEntity()方法將這些表單資料傳遞到伺服器中的request物件中。
			methodPost.setEntity(new UrlEncodedFormEntity(list, "utf-8"));
			HttpResponse response = httpClient.execute(methodPost);
			if (response.getStatusLine().getStatusCode() == 200) {
				HttpEntity entity = response.getEntity();
				// 藉助EntityUtils的toByteArray()方法對
				// HttpEntity物件進行處理,將entity物件中的內容處理成自己陣列。
				return EntityUtils.toByteArray(entity);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 作用:將輸入流轉成位元組陣列
	 * 
	 * * @return byte[]
	 */
	public static byte[] inputStreamToByte(InputStream is) {
		ByteArrayOutputStream baos = null;
		byte[] buffer = new byte[8 * 1024];
		int c = 0;
		try {
			while ((c = is.read(buffer)) != -1) {
				baos.write(buffer, 0, c);
				baos.flush();
			}
			return baos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (baos != null) {
				try {
					baos.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return null;
	}
}