热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

httpclient和htpUrlConnection用例

使用了很久框架,突然不知道,原生访问网络请求方式,回过头去看,还好,对现在流行使用okhttp也有了更深体会。

使用了很久框架,突然不知道,原生访问网络请求方式,回过头去看,还好,对现在流行使用okhttp也有了更深体会。

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 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);// 设置是否使用缓存 默认是trueurlConn.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请求必须设置允许输出 默认falseurlConn.setDoOutput(true);//设置请求允许输入 默认是trueurlConn.setDoInput(true);// Post请求不能使用缓存urlConn.setUseCaches(false);// 设置为Post请求urlConn.setRequestMethod("POST");//设置本次连接是否自动处理重定向urlConn.setInstanceFollowRedirects(true);// 配置请求Content-TypeurlConn.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);// 设置是否使用缓存 默认是trueurlConn.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); //读取超时//设置连接方法posturlConn.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 " + result);} else {Log.e(TAG, "上传失败");}} catch (IOException e) {Log.e(TAG, e.toString());}}


转:https://www.cnblogs.com/UUUz/p/9990915.html



推荐阅读
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
幼儿之家燕郊_880
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有