HttpClient(訪問網路) get方式,post方式。返回值有String,InputStream,byte[]
阿新 • • 發佈:2019-02-10
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; } }