HttpURLConnection實現網路請求
阿新 • • 發佈:2019-02-05
自從Android5.x時代google將Apache拋棄之後,HttpURLConnection變成了Android系統預設的請求方式.兩者的區別在於:
1、標準Java介面(java.net) —-HttpURLConnection,可以實現簡單的基於URL請求、響應功能;
2、Apache介面(org.appache.http)—-HttpClient,使用起來更方面更強大。一般來說,用這種介面。不過本文還是把第一種介面過一下。
任何一種介面,無外乎四個基本功能:訪問網頁、下載圖片或檔案、上傳檔案,訪問介面獲取資料,根據URL請求的類別: 分為二類,GET與POST請求。
二者的區別在於:
a:) get請求可以獲取靜態頁面,也可以把引數放在URL字串後面,傳遞給servlet,
據此,寫了一個小小的工具類
/**
* Created by xuenan on 2016/9/22 0022.
*/
import android.util.Log;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
/**
* 建立的HttpURLConection的工具類
*/
public class HttpUtil2 {
//把Cookie定義為靜態變數,第一次獲取之後儲存起來,以後每一次請求都設定給請求頭即可
public static String COOKIE = "";
//GET請求實現
public static String RequetstGet(String baseUrl, HashMap<String, String> paramsMap) {
try {
StringBuilder tempParams = new StringBuilder();
int pos = 0;
for (String key : paramsMap.keySet()) {
if (pos > 0) {
tempParams.append("&");
}
tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));
pos++;
}
String requestUrl = baseUrl + tempParams.toString();
// 新建一個URL物件
URL url = new URL(requestUrl);
// 開啟一個HttpURLConnection連線
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設定連線主機超時時間
urlConn.setConnectTimeout(5 * 1000);
//設定從主機讀取資料超時
urlConn.setReadTimeout(5 * 1000);
// 設定是否使用快取 預設是true
urlConn.setUseCaches(true);
// 設定為Post請求
urlConn.setRequestMethod("GET");
//urlConn設定請求頭資訊
//設定請求中的媒體型別資訊。
urlConn.setRequestProperty("Content-Type", "application/json");
//設定客戶端與服務連線型別
urlConn.addRequestProperty("Connection", "Keep-Alive");
// 開始連線
urlConn.connect();
// 判斷請求是否成功
if (urlConn.getResponseCode() == 200) {
// 獲取返回的資料 可以選擇流 位元組 字串三種
String result = streamToString(urlConn.getInputStream());
return result;
} else {
Log.e("TAG", "Get方式請求失敗");
}
// 關閉連線
urlConn.disconnect();
} catch (Exception e) {
Log.e("TAG", e.toString());
}
return null;
}
//POST請求實現
private String requestPost(String baseUrl, HashMap<String, String> paramsMap) {
try {
//合成引數
StringBuilder tempParams = new StringBuilder();
int pos = 0;
for (String key : paramsMap.keySet()) {
if (pos > 0) {
tempParams.append("&");
}
tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));
pos++;
}
String params = tempParams.toString();
// 請求的引數轉換為byte陣列
byte[] postData = params.getBytes();
// 新建一個URL物件
URL url = new URL(baseUrl);
// 開啟一個HttpURLConnection連線
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設定連線超時時間
urlConn.setConnectTimeout(5 * 1000);
//設定從主機讀取資料超時
urlConn.setReadTimeout(5 * 1000);
// Post請求必須設定允許輸出 預設false
urlConn.setDoOutput(true);
//設定請求允許輸入 預設是true
urlConn.setDoInput(true);
// Post請求不能使用快取
urlConn.setUseCaches(false);
// 設定為Post請求
urlConn.setRequestMethod("POST");
//將獲取的Cookie存入請求頭中發給伺服器,如果伺服器需要Cookie請求頭的話
//urlConn.setRequestProperty("Cookie", COOKIE);
//設定本次連線是否自動處理重定向
urlConn.setInstanceFollowRedirects(true);
//獲取返回的cookie的map集合
//Map<String,List<String>> cookieMap = urlConn.getHeaderFields();
//獲取後臺返回的特定的cookie 這個cookie也可以由後臺作為返回值返給前臺,然後前臺儲存呼叫
//獲取Cookie:從返回的訊息頭裡的Set-Cookie的相應的值
//COOKIE = urlConn.getHeaderField("Set-Cookie");
// 配置請求Content-Type
urlConn.setRequestProperty("Content-Type", "application/json");
// 開始連線
urlConn.connect();
// 傳送請求引數
DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());
dos.write(postData);
dos.flush();
dos.close();
// 判斷請求是否成功
if (urlConn.getResponseCode() == 200) {
// 獲取返回的資料
String result = streamToString(urlConn.getInputStream());
return result;
} else {
Log.e("TAG", "Post方式請求失敗");
}
// 關閉連線
urlConn.disconnect();
} catch (Exception e) {
Log.e("TAG", e.toString());
}
return null;
}
//處理網路流:將輸入流轉換成字串
/**
* 將輸入流轉換成字串
*
* @param is 從網路獲取的輸入流
* @return
*/
public static String streamToString(InputStream is) {
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
baos.close();
is.close();
byte[] byteArray = baos.toByteArray();
return new String(byteArray);
} catch (Exception e) {
Log.e("TAG", e.toString());
return null;
} finally {
try {
if (is != null) {
is.close();
}
if (baos != null) {
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//檔案下載
public static void downloadFile(String fileUrl) {
FileOutputStream fos = null;
InputStream inputStream = null;
try {
// 新建一個URL物件
URL url = new URL(fileUrl);
// 開啟一個HttpURLConnection連線
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
// 設定連線主機超時時間
urlConn.setConnectTimeout(5 * 1000);
//設定從主機讀取資料超時
urlConn.setReadTimeout(5 * 1000);
// 設定是否使用快取 預設是true
urlConn.setUseCaches(true);
// 設定為Post請求
urlConn.setRequestMethod("GET");
//urlConn設定請求頭資訊
//設定請求中的媒體型別資訊。
urlConn.setRequestProperty("Content-Type", "application/json");
//設定客戶端與服務連線型別
urlConn.addRequestProperty("Connection", "Keep-Alive");
// 開始連線
urlConn.connect();
// 判斷請求是否成功
if (urlConn.getResponseCode() == 200) {
String filePath = "";
File descFile = new File(filePath);
fos = new FileOutputStream(descFile);
byte[] buffer = new byte[1024];
int len;
inputStream = urlConn.getInputStream();
while ((len = inputStream.read(buffer)) != -1) {
// 寫到本地
fos.write(buffer, 0, len);
}
} else {
Log.e("TAG", "檔案下載失敗");
}
// 關閉連線
urlConn.disconnect();
} catch (Exception e) {
Log.e("TAG", e.toString());
} finally {
try {
if (fos != null) {
fos.close();
}
if (inputStream != null) {
inputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
//檔案上傳
public static void upLoadFile(String filePath, HashMap<String, String> paramsMap) {
DataInputStream in = null;
FileInputStream fileInput = null;
DataOutputStream requestStream = null;
try {
String baseUrl = "https://xxx.com/uploadFile";
File file = new File(filePath);
//新建url物件
URL url = new URL(baseUrl);
//通過HttpURLConnection物件,向網路地址傳送請求
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
//設定該連線允許讀取
urlConn.setDoOutput(true);
//設定該連線允許寫入
urlConn.setDoInput(true);
//設定不能適用快取
urlConn.setUseCaches(false);
//設定連線超時時間
urlConn.setConnectTimeout(5 * 1000); //設定連線超時時間
//設定讀取超時時間
urlConn.setReadTimeout(5 * 1000); //讀取超時
//設定連線方法post
urlConn.setRequestMethod("POST");
//設定維持長連線
urlConn.setRequestProperty("connection", "Keep-Alive");
//設定檔案字符集
urlConn.setRequestProperty("Accept-Charset", "UTF-8");
//設定檔案型別
urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + "*****");
String name = file.getName();
requestStream = new DataOutputStream(urlConn.getOutputStream());
requestStream.writeBytes("--" + "*****" + "\r\n");
//傳送檔案引數資訊
StringBuilder tempParams = new StringBuilder();
tempParams.append("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + name + "\"; ");
int pos = 0;
int size = paramsMap.size();
for (String key : paramsMap.keySet()) {
tempParams.append(String.format("%s=\"%s\"", key, paramsMap.get(key), "utf-8"));
if (pos < size - 1) {
tempParams.append("; ");
}
pos++;
}
tempParams.append("\r\n");
tempParams.append("Content-Type: application/octet-stream\r\n");
tempParams.append("\r\n");
String params = tempParams.toString();
requestStream.writeBytes(params);
//傳送檔案資料
fileInput = new FileInputStream(file);
int bytesRead;
byte[] buffer = new byte[1024];
in = new DataInputStream(new FileInputStream(file));
while ((bytesRead = in.read(buffer)) != -1) {
requestStream.write(buffer, 0, bytesRead);
}
requestStream.writeBytes("\r\n");
requestStream.flush();
requestStream.writeBytes("--" + "*****" + "--" + "\r\n");
requestStream.flush();
fileInput.close();
int statusCode = urlConn.getResponseCode();
if (statusCode == 200) {
// 獲取返回的資料
String result = streamToString(urlConn.getInputStream());
} else {
Log.e("TAG", "上傳失敗");
}
} catch (IOException e) {
Log.e("TAG", e.toString());
} finally {
try {
if (in != null) {
in.close();
}
if (fileInput != null) {
fileInput.close();
}
if (requestStream != null) {
requestStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
再附一個json解析工具類
package com.xuenan.aaa;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* </br>
* Created in 2016-11-26
*
* @author zhuangxuenan
*/
public class JsonUtil {
/**
* 用fastjson 將json字串解析為一個 JavaBean
*
* @param jsonString
* @param cls
* @return
*/
public static <T> T parseJson(String jsonString, Class<T> cls) {
T t = null;
try {
t = JSON.parseObject(jsonString, cls);
} catch (Throwable e) {
e.printStackTrace();
}
return t;
}
/**
* 用fastjson 將json字串 解析成為一個 List<JavaBean> 及 List<String>
*
* @param jsonString
* @param cls
* @return
*/
public static <T> List<T> parseJsonList(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
try {
List<T> tempList = JSON.parseArray(jsonString, cls);
if (tempList != null)
list.addAll(tempList);
} catch (Exception e) {
}
return list;
}
/**
* 用fastjson 將jsonString 解析成 List<Map<String,Object>>
*
* @param jsonString
* @return
*/
public static List<Map<String, Object>> parseJsonListMap(String jsonString) {
List<Map<String, Object>> list = new ArrayList<>();
try {
// 兩種寫法
// list = JSON.parseObject(jsonString, new
// TypeReference<List<Map<String, Object>>>(){}.getType());
List<Map<String, Object>> tempList = JSON.parseObject(jsonString, new TypeReference<List<Map<String, Object>>>() {
});
if (tempList != null)
list.addAll(tempList);
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 解析為Map
*/
public static Map<String, Object> parseJsonMap(String jsonString) {
Map<String, Object> map = new HashMap<>();
try {
// 兩種寫法
// list = JSON.parseObject(jsonString, new
// TypeReference<List<Map<String, Object>>>(){}.getType());
Map<String, Object> tempMap = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {
});
if (tempMap != null)
map.putAll(tempMap);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
}