本博文为子墨原创,转载请注明出处!
http://blog.csdn.net/zimo2013/article/details/9469543

关于HttpClient用法

1.HttpURLConnection实现步骤

(1).得到HttpURLConnection对象,通过调用URL.openConnection()方法得到该对象
(2).设置请求头属性,比如数据类型,数据长度等等
(3).可选的操作  setDoOutput(true),默认为false无法向外写入数据!setDoInput(true),一般不用设置默认为true
(4).浏览器向服务器发送的数据,比如post提交form表单或者像服务器发送一个文件
(5).浏览器读取服务器发来的相应,包括servlet写进response的头数据(content-type及content-length等等),body数据
(6).调用HttpURLConnection的disconnect()方法, 即设置 http.keepAlive = false;释放资源

2.GZIP压缩

对于文本数据,特别是json数据或者html网页数据,最好使用gzip进行压缩,理论上文本数据可以压缩为原来的1/3,效果很明显,压缩之后应该使用gzip流进行解压缩!
[java] view plaincopy
  1. conn.setRequestProperty("Accept-Encoding", "gzip"); //设置头参数
  2. InputStream is = new BufferedInputStream(conn.getInputStream());
  3. String encoding = conn.getContentEncoding();
  4. if(encoding!=null && encoding.contains("gzip")){//首先判断服务器返回的数据是否支持gzip压缩,
  5. is = new GZIPInputStream(is);   //如果支持则应该使用GZIPInputStream解压,否则会出现乱码无效数据
  6. }

3.简单应用

(1).get请求

[java] view plaincopy
  1. public static void get() {
  2. HttpURLConnection conn = null;
  3. try {
  4. URL url = new URL("http://127.0.0.1:8080/Day18/servlet/UploadTest");
  5. //1.得到HttpURLConnection实例化对象
  6. conn = (HttpURLConnection) url.openConnection();
  7. //2.设置请求信息(请求方式... ...)
  8. //设置请求方式和响应时间
  9. conn.setRequestMethod("GET");
  10. //conn.setRequestProperty("encoding","UTF-8"); //可以指定编码
  11. conn.setConnectTimeout(5000);
  12. //不使用缓存
  13. conn.setUseCaches(false);
  14. //3.读取相应
  15. if (conn.getResponseCode() == 200) {
  16. //先将服务器得到的流对象 包装 存入缓冲区,忽略了正在缓冲时间
  17. InputStream in = new BufferedInputStream(conn.getInputStream());
  18. // 得到servlet写入的头信息,response.setHeader("year", "2013");
  19. String year = conn.getHeaderField("year");
  20. System.out.println("year="+year);
  21. byte[] bytes = readFromInput(in);   //封装的一个方法,通过指定的输入流得到其字节数据
  22. System.out.println(new String(bytes, "utf-8"));
  23. System.out.println("[浏览器]成功!");
  24. } else {
  25. System.out.println("请求失败!");
  26. }
  27. } catch (Exception e) {
  28. e.printStackTrace();
  29. } finally {
  30. //4.释放资源
  31. if (conn != null) {
  32. //关闭连接 即设置 http.keepAlive = false;
  33. conn.disconnect();
  34. }
  35. }
  36. }

(2).post表单提交

[java] view plaincopy
  1. /**
  2. * post请求方式,完成form表单的提交
  3. */
  4. public static void post() {
  5. HttpURLConnection conn = null;
  6. try {
  7. URL url = new URL("http://127.0.0.1:8080/Day18/servlet/Logining");
  8. String para = new String("username=admin&password=admin");
  9. //1.得到HttpURLConnection实例化对象
  10. conn = (HttpURLConnection) url.openConnection();
  11. //2.设置请求方式
  12. conn.setRequestMethod("POST");
  13. //3.设置post提交内容的类型和长度
  14. /*
  15. * 只有设置contentType为application/x-www-form-urlencoded,
  16. * servlet就可以直接使用request.getParameter("username");直接得到所需要信息
  17. */
  18. conn.setRequestProperty("contentType","application/x-www-form-urlencoded");
  19. conn.setRequestProperty("Content-Length", String.valueOf(para.getBytes().length));
  20. //默认为false
  21. conn.setDoOutput(true);
  22. //4.向服务器写入数据
  23. conn.getOutputStream().write(para.getBytes());
  24. //5.得到服务器相应
  25. if (conn.getResponseCode() == 200) {
  26. System.out.println("服务器已经收到表单数据!");
  27. } else {
  28. System.out.println("请求失败!");
  29. }
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. } finally {
  33. //6.释放资源
  34. if (conn != null) {
  35. //关闭连接 即设置 http.keepAlive = false;
  36. conn.disconnect();
  37. }
  38. }
  39. }

(3).post文件上传

[java] view plaincopy
  1. /**
  2. * post方式,完成文件的上传
  3. */
  4. private static void uploadFile() {
  5. HttpURLConnection conn = null;
  6. OutputStream out = null;
  7. InputStream in = null;
  8. FileInputStream fin = null;
  9. String filePath = "c:\\android帮助文档.rar";
  10. try {
  11. fin = new FileInputStream(filePath);
  12. //1.得到HttpURLConnection实例化对象
  13. conn = (HttpURLConnection) new URL("http://127.0.0.1:8080/Day18/servlet/UploadTest").openConnection();
  14. //2.设置请求方式
  15. conn.setRequestMethod("POST");
  16. conn.setDoOutput(true);
  17. //不使用缓存
  18. conn.setUseCaches(false);
  19. //conn.setRequestProperty("Range", "bytes="+start+"-"+end);多线程请求部分数据
  20. //3.设置请求头属性
  21. //上传文件的类型 rard Mime-type为application/x-rar-compressed
  22. conn.setRequestProperty("content-type", "application/x-rar-compressed");
  23. /*
  24. * (1).在已知文件大小,需要上传大文件时,应该设置下面的属性,即文件长度
  25. *  当文件较小时,可以设置头信息即conn.setRequestProperty("content-length", "文件字节长度大小");
  26. * (2).在文件大小不可知时,使用setChunkedStreamingMode();
  27. */
  28. conn.setFixedLengthStreamingMode(fin.available());
  29. String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
  30. //可以将文件名称信息已头文件方式发送,在servlet中可以使用request.getHeader("filename")读取
  31. conn.setRequestProperty("filename", fileName);
  32. //4.向服务器中发送数据
  33. out = new BufferedOutputStream(conn.getOutputStream());
  34. long totalSize = fin.available();
  35. long currentSize = 0;
  36. int len = -1;
  37. byte[] bytes = new byte[1024*5];
  38. while ((len = fin.read(bytes)) != -1) {
  39. out.write(bytes);
  40. currentSize += len;
  41. System.out.println("已经长传:"+(int)(currentSize*100/(float)totalSize)+"%");
  42. }
  43. System.out.println("上传成功!");
  44. } catch (IOException e) {
  45. e.printStackTrace();
  46. } finally{
  47. //5.释放相应的资源
  48. if(conn != null){
  49. conn.disconnect();
  50. }
  51. }
  52. }

NOTE:Android使用时,应该添加网络权限

[html] view plaincopy
  1. <!-- 使用网络前,需要在项目清单文件中,加入如下权限代码 -->
  2. <uses-permission android:name="android.permission.INTERNET"/>

HttpURLConnection_Get和Post请求文件上传相关推荐

  1. apipost怎么模拟post请求文件上传

    在做接口测试的时候一般会有文件上传的post请求的接口需要进行测试,apipost可以简单的对文件上传功能进行接口测试. 首先新建一个接口 输入一个测试网址 在body里面输入需要实现文件上传的参数名 ...

  2. AFN(向网络发送请求---文件上传)

    基本使用 GET请求 1.创建会话管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];NSDictionary *pa ...

  3. SpringMVC的请求-文件上传-多文件上传的代码实现

    多文件上传,只需要将页面修改为多个文件上传项,将方法参数MultipartFile类型修改为MultipartFile[]即可 <form action="${pageContext. ...

  4. SpringMVC的请求-文件上传-单文件上传的代码实现2

    完成文件上传 @RequestMapping(value="/quick22") @ResponseBody public void save22(String username, ...

  5. SpringMVC的请求-文件上传-客户端表单实现

    文件上传客户端表单需要满足: 表单项type="file" 表单的提交方式是post 表单的enctype属性是多部分表单形式,及enctype="multipart/f ...

  6. post请求文件上传(个人记录)

    集合上传文件/图片路径 @RequestMapping(value = "/uploadImage",method = RequestMethod.POST,headers = & ...

  7. SpringMVC的请求-文件上传-单文件上传的代码实现1

    添加依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fi ...

  8. SpringMVC的请求-文件上传-文件上传的原理

  9. maven工程 java 实现文件上传 SSM ajax异步请求上传

    java ssm框架实现文件上传 实现:单文件上传.多文件上传(单选和多选),并且用 ajax 异步刷新,在当前界面显示上传的文件 首先springmvc的配置文件要配置上传文件解析器: 1 < ...

最新文章

  1. Windows10上使用VS2017编译OpenCV3.4.2+OpenCV_Contrib3.4.2+Python3.6.2操作步骤
  2. 干货|了解机器学习常用数据预处理
  3. [BZOJ2821]作诗(Poetize)
  4. 计算机设计大赛海洋世界,全国大学生海洋文化设计大赛第二届获奖作品(三)...
  5. 线性表(一)——顺序表
  6. 织梦多个栏目arclist调用副栏目不显示的解决办法
  7. H5 Canvas刮刮乐
  8. 数组元素倒置-Java
  9. vector删除第i个元素_LeetCode每日一题 Q215数组中的第K个最大元素
  10. 如何通过Restful API的方式读取SAP Commerce Cloud的Product图片
  11. 利用for循环调用插入方法批量插入 一条失败_算法与数据结构(1):基础部分——以插入排序为例...
  12. 试编写算法,设任意n个整数存放于数组A[1...n]中,将所有正数排在所有负数前面(要求:算法时间复杂度为O(n))
  13. Python——三级菜单
  14. VMware 软件被曝其史上最严重的信息泄露漏洞之一,影响大量虚拟机和主机
  15. 可用的免费公开的DNS
  16. 实验五 存储管理实验
  17. SAS入门 新手必看
  18. 趣味python编程之经典俄罗斯方块
  19. C4D玻璃材质调节方法
  20. Client-Initiated场景下的L2TP实验配置

热门文章

  1. 列式存储ClickHouse(一)概述
  2. how many fibs java_How many Fibs?(java)
  3. OpenShift 4 - DevSecOps (2) - 修复 RHACS 发现的安全隐患
  4. OpenShift 4 之Service Mesh教程(6)- 根据Header路由请求
  5. 微软开始取消 Windows 10 对 32 位系统的支持
  6. 麒麟 UKUI 3.0 发布预告视频,能否接替 Win 7 成为大家的新选择?
  7. orm mysql nodejs_【译】Nodejs最好的ORM
  8. .net函数查询_用python实现多文档查询
  9. python selenium刷新页面_关于python-selenium的页面元素刷新的问题,详细见内容
  10. net java互相调用_Java与.NET的WebServices相互调用