Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:

  1. public static String post(String actionUrl, Map<String, String> headParams,
  2. Map<String, String> params,
  3. Map<String, File> files) throws IOException {
  4. String BOUNDARY = java.util.UUID.randomUUID().toString();
  5. String PREFIX = "--", LINEND = "\r\n";
  6. String MULTIPART_FROM_DATA = "multipart/form-data";
  7. String CHARSET = "UTF-8";
  8. URL uri = new URL(actionUrl);
  9. HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
  10. conn.setReadTimeout(30 * 1000); // 缓存的最长时间
  11. conn.setDoInput(true);// 允许输入
  12. conn.setDoOutput(true);// 允许输出
  13. conn.setUseCaches(false); // 不允许使用缓存
  14. conn.setRequestMethod("POST");
  15. conn.setRequestProperty("connection", "keep-alive");
  16. conn.setRequestProperty("Charsert", "UTF-8");
  17. conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
  18. + ";boundary=" + BOUNDARY);
  19. if(headParams!=null){
  20. for(String key : headParams.keySet()){
  21. conn.setRequestProperty(key, headParams.get(key));
  22. }
  23. }
  24. StringBuilder sb = new StringBuilder();
  25. if (params!=null) {
  26. // 首先组拼文本类型的参数
  27. for (Map.Entry<String, String> entry : params.entrySet()) {
  28. sb.append(PREFIX);
  29. sb.append(BOUNDARY);
  30. sb.append(LINEND);
  31. sb.append("Content-Disposition: form-data; name=\""
  32. + entry.getKey() + "\"" + LINEND);
  33. sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
  34. sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
  35. sb.append(LINEND);
  36. sb.append(entry.getValue());
  37. sb.append(LINEND);
  38. }
  39. }
  40. DataOutputStream outStream = new DataOutputStream(
  41. conn.getOutputStream());
  42. if (!TextUtils.isEmpty(sb.toString())) {
  43. outStream.write(sb.toString().getBytes());
  44. }
  45. // 发送文件数据
  46. if (files != null)
  47. for (Map.Entry<String, File> file : files.entrySet()) {
  48. StringBuilder sb1 = new StringBuilder();
  49. sb1.append(PREFIX);
  50. sb1.append(BOUNDARY);
  51. sb1.append(LINEND);
  52. sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
  53. + file.getKey() + "\"" + LINEND);
  54. sb1.append("Content-Type: application/octet-stream; charset="
  55. + CHARSET + LINEND);
  56. sb1.append(LINEND);
  57. outStream.write(sb1.toString().getBytes());
  58. InputStream is = new FileInputStream(file.getValue());
  59. byte[] buffer = new byte[1024];
  60. int len = 0;
  61. while ((len = is.read(buffer)) != -1) {
  62. outStream.write(buffer, 0, len);
  63. Log.i("HttpUtil", "写入中...");
  64. }
  65. is.close();
  66. outStream.write(LINEND.getBytes());
  67. }
  68. // 请求结束标志
  69. byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
  70. outStream.write(end_data);
  71. outStream.flush();
  72. Log.i("HttpUtil", "conn.getContentLength():"+conn.getContentLength());
  73. // 得到响应码
  74. int res = conn.getResponseCode();
  75. InputStream in = conn.getInputStream();
  76. if (res == 200) {
  77. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
  78. StringBuffer buffer = new StringBuffer();
  79. String line = "";
  80. while ((line = bufferedReader.readLine()) != null){
  81. buffer.append(line);
  82. }
  83. //          int ch;
  84. //          StringBuilder sb2 = new StringBuilder();
  85. //          while ((ch = in.read()) != -1) {
  86. //              sb2.append((char) ch);
  87. //          }
  88. return buffer.toString();
  89. }
  90. outStream.close();
  91. conn.disconnect();
  92. return in.toString();
  93. }

Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:的更多相关文章

  1. 基于element ui 实现七牛云自定义key上传文件,并监听更新上传进度

    借助上传Upload 上传组件的 http-request 覆盖默认的上传行为,可以自定义上传的实现 <el-upload multiple ref="sliderUpload&quo ...

  2. OkHttp上传文件,服务器端请求解析找不到文件信息的问题

    长话短说,不深入解释了,官方给的上传案例代码: private static final String IMGUR_CLIENT_ID = "..."; private stati ...

  3. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)

    先上代码: public void uploadToUrl(String fileId, String fileSetId, String formUrl) throws Throwable { St ...

  4. php使用curl 实现GET和POST请求(抓取网页,上传文件),支持跨项目和跨服务器

    一:curl 函数和参数详解 函数库:1:curl_init 初始化一个curl会话2:curl_close 关闭一个curl会话3:curl_setopt 为一个curl设置会话参数4:curl_e ...

  5. java http工具类和HttpUrlConnection上传文件分析

    利用java中的HttpUrlConnection上传文件,我们其实只要知道Http协议上传文件的标准格式.那么就可以用任何一门语言来模拟浏览器上传文件.下面有几篇文章从http协议入手介绍了java ...

  6. JAVA模拟HTTP post请求上传文件

    在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较 ...

  7. swagger上传文件并支持jwt认证

    背景 由于swagger不仅提供了自动实现接口文档的说明而且支持页面调试,告别postman等工具,无需开发人员手动写api文档,缩减开发成本得到大家广泛认可 但是由于swagger没有提供上传文件的 ...

  8. android 使用AsyncHttpClient框架上传文件以及使用HttpURLConnection下载文件

    AsyncHttpClient开源框架android-async-http还是非常方便的. AsyncHttpClient该类通经常使用在android应用程序中创建异步GET, POST, PUT和 ...

  9. django系列6--Ajax05 请求头ContentType, 使用Ajax上传文件

    一.请求头ContentType ContentType指的是请求体的编码类型,常见的类型共有三种: 1.application/x-www-form-urlencoded 这应该是最常见的 POST ...

随机推荐

  1. Effective STL 学习笔记14: Use reserve to avoid unnecessary reallocations.

    vector 和 string 容器在动态插入一个新的对象时,如果容器内空间不够,该容器会: 重新分配空间 通常的做法是分配当前 Capacity 大小两倍的空间. 将旧空间中的所有元素拷贝进新的空间 ...

  2. getch与getchar区别

    getch(): 所在头文件:conio.h 函数用途:从控制台读取一个字符,但不显示在屏幕上 getchar(): 所在头文件:stdio.h getch与getchar基本功能相同,差别是getc ...

  3. Hive(六)内置函数与高级操作

    一内置函数 1 数学函数 Return Type Name (Signature) Description DOUBLE round(DOUBLE a) Returns the rounded BIG ...

  4. 东莞裕同&易普优APS项目启动啦!

    2018年6月21日,东莞裕同&易普优APS项目启动会在东莞裕同东城厂区正式召开.裕同东莞副总经理李总.PMC张经理.集团信息中心曾总.罗经理.易普优实施总监陈总.曹经理等参加了此次会议.这是 ...

  5. mysql 新增时,唯一索引冲突时更新

    INSERT INTO table_name(f1 ,f2 ,f3) VALUES(? ,?) on duplicate key update f2 = ? ,f3 = ?

  6. linux下根目录扩容

    划分出一个磁盘,并将其格式化   [root@gg ~]# mkfs.ext3 /dev/sdb2    创建一个物理卷 [root@gg ~]# pvcreate /dev/sdb2    [roo ...

  7. xmanager

    [root@upright91 run]# ./runBenchmark.sh updbtpcc.properties sqlTableCreates Exception in thread &quo ...

  8. Git错误提示之:fatal: Not a git repository (or any of the parent directories): .git

    产生原因:一般是没有初始化git本地版本管理仓库,所以无法执行git命令 解决方法:操作之前执行以下命令行: git init 然后执行一下git status查看状态信息,good,问题解决.

  9. jQuery的data() 和 h5 的 dataset()

    作用:获取自定义属性 命名规则:驼峰命名法  data-user==>user data-user-name==>userName 区别:jQuery:操作内存   h5: 操作DOM j ...

  10. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...