在android 6.0(api 23)sdk之后,HttpClient不再提供,所以android原生的网络请求为HttpURLConnection。

介绍

HttpClient与HttpURLConnection的比较

1、HttpClient是apache的开源框架,封装了访问http的请求头、参数、内容体、响应等待,使用起来比较方便,而HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等等。

2、从稳定性方面来说的话,HttpClient很稳定、功能强,Bug少,容易控制细节,而之前的HttpURLConnection一直存在着版本兼容问题,不过在后续的版本中已经相继修复掉了。

为什么要废除HttpClient呢?

1、HttpUrlConnection是Android SDK的标准实现,而HttpClient是apache的开源实现。

2、HttpUrlConnection直接支持GZIP压缩,HttpClient也支持,但要自己写代码处理。

3、HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用,HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。

4、HttpUrlConnection直接在系统方面做了缓存策略处理,加快重复请求的速度 。

GET请求实现

private void requestGet(HashMap 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 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());        }    }

处理网络流:将输入流转换成字符串

private void requestPost(HashMap 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());        }    }

文件下载

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 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());        }    }

权限

  

 

最后欢迎大家访问我的个人网站:1024s​​​​​​​

更多相关文章

  1. Android 监听ContentProvider中数据的变化
  2. Android 学习笔记7---数据存储与访问
  3. Android提交数据到服务的四种方法!!!
  4. 【android】Cursor记录集游标、ListView和SimpleCursorAdapter、
  5. 【Android开发学习07】存储简单数据的利器--Preferences
  6. android 数据库建立以及自定义ContentProvider
  7. android 客户端与服务端的通信 发送get和post请求并获取数据
  8. Android SQLite 数据库 增删改查操作
  9. android 存储数据与文件

随机推荐

  1. android 模块之桌面闹钟
  2. android 安全讲座第二层 使用AndBug调试A
  3. 详解如何将android工具链作为独立编译器
  4. Android(安卓)内置浏览器
  5. 在Android(安卓)Studio 中加入jar 和.so
  6. 【Android】学习笔记(4)――基本控件之Pr
  7. 捕获Android文本中链接点击事件
  8. android静音的实现
  9. Android(安卓)Studio中使用过程中遇到的
  10. 在iOS和Android中使用二维码ZXing库及常