• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android探索之HttpURLConnection网页要求

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