原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0626/555.html
媒介:
最近一直想着进修一下对照好的开源网页框架okhttp,想着进修以前照旧先总结一下Android原生提供的网页要求。以前一直在应用HttpClient,不过android 6.0(api 23) SDK,不再提供org.apache.http.*(只保存几个类).以是我们本日要紧总结HttpURLConnection的应用。
HttpURLConnection先容:
HttpURLConnection是一种多用途、轻量极的HTTP客户端,应用它来进行HTTP操纵可以适合于大无数的运用程序。对于以前为甚么一直应用HttpClient而不应用HttpURLConnection也是有缘故的。具体阐发如下
HttpClient是apache的开源框架,封装了走访http的要求头,参数,内容体,相应等等,应用起来对照利便,而HttpURLConnection是java的尺度类,甚么都没封装,用起来太原始,不利便,好比重走访的自定义,以及少许高级功效等。
从稳定性方面来说的话,HttpClient很稳定,功效强,BUG少,轻易掌握细节,而以前的HttpURLConnection一直存在着版本兼容的题目,不过在后续的版本中曾经相继修复掉了。
从上头可以看出以前一直应用HttClient是因为HttpURLConnection不稳定招致,辣么当今谷歌固然修复了HttpURLConnection以前存在的少许题目以后,相比HttpClient有甚么上风呢?为甚么要撤废HttpClient呢?
HttpUrlConnection是Android SDK的尺度实现,而HttpClient是apache的开源实现;
HttpUrlConnection干脆支持GZIP压缩;HttpClient也支持,但要本人写代码处分;
HttpUrlConnection干脆支持体系级持续池,即翻开的持续不会干脆关闭,在一段光阴内所有程序可共用;HttpClient固然也能做到,但真相不如官方干脆体系底层支持好;
HttpUrlConnection干脆在体系层面做了缓存策略处分,加速重复要求的速率。
HttpURLConnection应用:
Get要求实现:
复制代码
private void requestGet(HashMap<String, String> paramsMap) { try {
String baseUrl = "https://xxx.com/getUsers?";
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());
Log.e(TAG, "Get体例要求胜利,result--->" + result);
} else {
Log.e(TAG, "Get体例要求腐朽");
} // 关闭持续 urlConn.disconnect();
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
复制代码
POST要求实现:
复制代码
private void requestPost(HashMap<String, String> paramsMap) { try {
String baseUrl = "https://xxx.com/getUsers"; //合成参数
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"); //配置本次持续是否自动处分重定向
urlConn.setInstanceFollowRedirects(true); // 配置要求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());
Log.e(TAG, "Post体例要求胜利,result--->" + result);
} else {
Log.e(TAG, "Post体例要求腐朽");
} // 关闭持续 urlConn.disconnect();
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
复制代码
处分网页流:将输入流转换成字符串
复制代码
/**
* 将输入流转换成字符串
*
* @param is 从网页获取的输入流
* @return
*/
public String streamToString(InputStream is) { try {
ByteArrayOutputStream 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;
}
}
复制代码
以上即是HttpConnection的get、post的简单实现,若何实现文件的下载和上传呢?
文件下载:
复制代码
private void downloadFile(String fileUrl){ 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);
FileOutputStream fos = new FileOutputStream(descFile);; byte[] buffer = new byte[1024]; int len;
InputStream 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());
}
}
复制代码
文件上传:
复制代码
private void upLoadFile(String filePath, HashMap<String, String> paramsMap) { 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();
DataOutputStream 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); //发送文件数据
FileInputStream fileInput = new FileInputStream(file); int bytesRead; byte[] buffer = new byte[1024];
DataInputStream 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());
Log.e(TAG, "上传胜利,result--->" + result);
} else {
Log.e(TAG, "上传腐朽");
}
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
复制代码
权限:
<uses-permission android:name="android.permission.INTERNET"/>
干我们这行,啥时候怠惰,就意味着上进的休止,上进的休止就意味着被镌汰,只能往前冲,直到凤凰涅槃的一天!
上篇:上一篇:两个Fragment跳转示例
下篇:下一篇:Android WebView加载https出现空缺页