原创内容,转载请注明原文网址: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出现空缺页

