java发送post请求上传文件和json数据

因为第三方的上传服务post参数使用了两个@requestpart参数。
但是feign不可以使用两个@requestpart参数。会报错:java.lang.IllegalStateException: Method has too many Body parameters
所以使用http发送post请求上传文件和json数据。

package com.evisible.blockchain.common.utils;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.*;
@Slf4j
public class HttpRequestUtil {private final static String BOUNDARY = UUID.randomUUID().toString().toLowerCase().replaceAll("-", "");// 边界标识private final static String PREFIX = "--";// 必须存在private final static String LINE_END = "\r\n";/***  发送post请求*  @Description:*  @param requestUrl 请求url*  @param requestText 请求参数*  @param requestFile 请求上传的文件*  @param headers 其他自定义请求头*  @return*  @throws Exception*/public static String sendPost(String requestUrl,Map<String, String> requestText, Map<String, MultipartFile> requestFile, Map<String, Object> headers) throws Exception{HttpURLConnection conn = null;InputStream input = null;OutputStream os = null;BufferedReader br = null;StringBuffer buffer = null;try {URL url = new URL(requestUrl);if("https".equalsIgnoreCase(url.getProtocol())){try {SslUtils.ignoreSsl();} catch (Exception e) {e.printStackTrace();}}conn = (HttpURLConnection) url.openConnection();conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setConnectTimeout(1000 * 10);conn.setReadTimeout(1000 * 10);conn.setRequestMethod("POST");conn.setRequestProperty("Accept", "*/*");conn.setRequestProperty("Connection", "keep-alive");conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);//设置其他自定义 headersif (headers != null && !headers.isEmpty()) {for (Map.Entry<String, Object> header : headers.entrySet()) {if( header.getValue()!=null){conn.setRequestProperty(header.getKey(), header.getValue().toString());}}}conn.connect();// 往服务器端写内容 也就是发起http请求需要带的参数os = new DataOutputStream(conn.getOutputStream());// 请求参数部分writeParams(requestText, os);// 请求上传文件部分writeFile(requestFile, os);// 请求结束标志String endTarget = PREFIX + BOUNDARY + PREFIX + LINE_END;os.write(endTarget.getBytes());os.flush();if(conn.getResponseCode()==200){input = conn.getInputStream();}else{input = conn.getErrorStream();}br = new BufferedReader(new InputStreamReader( input, "UTF-8"));buffer = new StringBuffer();String line = null;while ((line = br.readLine()) != null) {buffer.append(line);}//......System.out.println("返回报文:" + buffer.toString());} catch (Exception e) {log.error(e.getMessage(), e);throw new Exception(e);} finally {try {if (conn != null) {conn.disconnect();conn = null;}if (os != null) {os.close();os = null;}if (br != null) {br.close();br = null;}} catch (IOException ex) {log.error(ex.getMessage(), ex);throw new Exception(ex);}}return buffer.toString();}/*** 对post参数进行编码处理并写入数据流中* @throws Exception** @throws IOException** */private static void writeParams(Map<String, String> requestText,OutputStream os) throws Exception {try{if (requestText == null || requestText.isEmpty()) {} else {StringBuilder requestParams = new StringBuilder();Set<Map.Entry<String, String>> set = requestText.entrySet();Iterator<Map.Entry<String, String>> it = set.iterator();while (it.hasNext()) {Map.Entry<String, String> entry = it.next();requestParams.append(PREFIX).append(BOUNDARY).append(LINE_END);requestParams.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"").append(LINE_END);requestParams.append("Content-Type: text/plain; charset=utf-8").append(LINE_END);requestParams.append("Content-Transfer-Encoding: 8bit").append(LINE_END);requestParams.append(LINE_END);// 参数头设置完以后需要两个换行,然后才是参数内容requestParams.append(entry.getValue());requestParams.append(LINE_END);}os.write(requestParams.toString().getBytes());os.flush();}}catch(Exception e){log.error("writeParams failed", e);throw new Exception(e);}}/*** 对post上传的文件进行编码处理并写入数据流中** @throws IOException** */private static void writeFile(Map<String, MultipartFile> requestFile,OutputStream os) throws Exception {InputStream is = null;try{String msg = "请求上传文件部分:\n";if (requestFile == null || requestFile.isEmpty()) {msg += "空";} else {StringBuilder requestParams = new StringBuilder();Set<Map.Entry<String, MultipartFile>> set = requestFile.entrySet();Iterator<Map.Entry<String, MultipartFile>> it = set.iterator();while (it.hasNext()) {Map.Entry<String, MultipartFile> entry = it.next();if(entry.getValue() == null){//剔除value为空的键值对continue;}requestParams.append(PREFIX).append(BOUNDARY).append(LINE_END);requestParams.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"; filename=\"").append(entry.getValue().getName()).append("\"").append(LINE_END);requestParams.append("Content-Type:").append(entry.getValue().getContentType()).append(LINE_END);requestParams.append("Content-Transfer-Encoding: 8bit").append(LINE_END);requestParams.append(LINE_END);// 参数头设置完以后需要两个换行,然后才是参数内容os.write(requestParams.toString().getBytes());os.write(entry.getValue().getBytes());os.write(LINE_END.getBytes());os.flush();msg += requestParams.toString();}}//System.out.println(msg);}catch(Exception e){log.error("writeFile failed", e);throw new Exception(e);}finally{try{if(is!=null){is.close();}}catch(Exception e){log.error("writeFile FileInputStream close failed", e);throw new Exception(e);}}}/*** ContentType(这部分可忽略,MultipartFile有对应的方法获取)** @Description:* @param file* @return* @throws IOException*/public static String getContentType(MultipartFile file) throws Exception{String streamContentType = "application/octet-stream";String imageContentType = "";ImageInputStream image = null;try {image = ImageIO.createImageInputStream(file);if (image == null) {return streamContentType;}Iterator<ImageReader> it = ImageIO.getImageReaders(image);if (it.hasNext()) {imageContentType = "image/" + it.next().getFormatName();return imageContentType;}} catch (IOException e) {log.error("method getContentType failed", e);throw new Exception(e);} finally {try{if (image != null) {image.close();}}catch(IOException e){log.error("ImageInputStream close failed", e);;throw new Exception(e);}}return streamContentType;}}

下面是测试类

//上传并进行签章public static void main(String[] args) throws Exception {//请求 urlString url = "https://139.9.57.182/api/cfca-anxin-sign/api/uploadAndSignCustomPDFContract3203";// keyValues 保存普通参数Map<String, String> keyValues = new HashMap<>();String uploadContract = "{\"isSign\":2,\"contractTypeCode\":\"MM\",\"contractName\":\"测试合同\",\"signKeyword\":{\"keyword\":\"通过见证人\",\"offsetCoordX\":\"0\",\"offsetCoordY\":\"20\",\"imageWidth\":\"150\",\"imageHeight\":\"150\"},\"signLocations\":[{\"signOnPage\":\"1\",\"signLocationLBX\":\"240\",\"signLocationLBY\":\"430\",\"signLocationRUX\":\"340\",\"signLocationRUY\":\"530\"}],\"signInfos\":[{\"userId\":\"35FE921E7CF0F890E050007F01004E8E\",\"authorizationTime\":\"20160214171200\",\"location\":\"210.74.41.0\",\"projectCode\":\"003\",\"isProxySign\":1,\"signLocations\":[{\"signOnPage\":\"1\",\"signLocationLBX\":\"85\",\"signLocationLBY\":\"550\",\"signLocationRUX\":\"140\",\"signLocationRUY\":\"575\"}]}]}";keyValues.put("uploadContract", uploadContract);// filePathMap 保存文件类型的参数名和文件路径Map<String, MultipartFile> filePathMap = new HashMap<>();File file = new File("d://山月记.pdf");FileInputStream fileInputStream = new FileInputStream(file);MultipartFile multipartFile = new MockMultipartFile(file.getName(),file.getName(), ContentType.APPLICATION_OCTET_STREAM.toString(),fileInputStream);filePathMap.put("file", multipartFile);Map<String, Object> header = new HashMap<>();header.put("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyOjhhYWE4MTkzNmY3ZjI0YWMwMTZmODJmNWJkMjQwMDFhIiwiT05BIjoi6L-Z5piv56ys5LiA5Liq5L-u5pS5IiwiT1IiOiJQTEFURk9STSIsIkxQIjoibGRxeWIiLCJVQVMiOiJCVlcsRklSU1RfQVVESVQsVVBDLFNMQSxVTEEsVUEsVUQsUExBVEZPUk0sQUdSVF9RVUVSWSxVUFIsVUwsQkFOTkVSX01HVCxBU1NFVF9NR1QsRUEsU0VDT05EX0FVRElULGF1dGgtbG9naW4sVVUsQUEsRklOQUxfQVVESVQsQUQsVVNFUl9JTkZPX01HVCxJVEVNX01HVCxBTCxCQ00sSEVBRFFVQVRFUl9BVURJVCxPUkdfSU5GT19NR1QsUkEsUkQsUEFZX01HVCxBVSxQUk9KRUNUX0ZPUkNFX01HVCxSTCxSTSxTTVNfTUdULE9STEEsT1JBLE9SRCxSVSxPUkcsUkxBLE9STCxTQSxVU0VSX01HVCxTRCxPUlUsQkFOS19DQVJEX01HVCxTTCxHTF9NQU5BR0VSLEJJTkRfT1BFUkFUSU9OX1BIT05FLEJVU0lORVNTX01HVCxTVSxBR1JUX01HVCxST0xFX01HVCxVU0MsRElDVF9NR1QsVU9SUlUsVU9SRCxVT1JBLFNPQ19NR1QsQUxBLEJQTU5fTUdULFBNLEFHUlRfU0lHTixsZHF5Yi1sb2dpbiIsImlzcyI6ImV2LWF1dGgiLCJ2cmYiOiJ0cnVlIiwiT0lEIjoiYmE5YjMzZDctN2ExNy00MWI4LTkwYWUtZGE1YmNmODhhMGM2IiwiVUlEIjoiOGFhYTgxOTM2ZjdmMjRhYzAxNmY4MmY1YmQyNDAwMWEiLCJBVCI6Im90IiwidHR5IjoiaWR0IiwiVU4iOiIxNTYyNDk4NDYwMiIsImV4cCI6MTU5MzQ4MTk5OSwiVVQiOiJFTlRFUlBSSVNFIn0.0XLzW7FM6j5zIogzt2-p0pcH_BpFPwrICgPg0h0qnLw");String  response = HttpRequestUtil.sendPost(url, keyValues, filePathMap,header);System.out.println("response:"+response);}

java发送post请求上传文件和json数据相关推荐

  1. java 转发上传文件_Java 发送http请求上传文件功能实例

    废话不多说了,直接给大家贴代码了,具体代码如下所示: package wxapi.WxHelper; import java.io.BufferedReader; import java.io.Dat ...

  2. java怎么上传文件到web服务器_Java客户端通过Http发送POST请求上传文件到web服务器...

    http://www.cnblogs.com/WilliamJiang/archive/2012/04/29/2475883.html 1.朋友的一个需求,让我给他实现,需求是这样的,需要用ASP.n ...

  3. java http post上传文件_Java通过HTTP POST请求上传文件

    我想创建一个Java应用程序来执行以下在Windows上的CURL中工作.Java通过HTTP POST请求上传文件 curl -x XXX.XXX.XXX.XXX:8080 -X POST --da ...

  4. 解决python发送multipart/form-data请求上传文件的问题

    解决python发送multipart/form-data请求上传文件的问题 参考文章: (1)解决python发送multipart/form-data请求上传文件的问题 (2)https://ww ...

  5. SpringMVC实现PUT请求上传文件

    在JQuery中,我们可以进行REST ful中delete和put的请求,但是在java EE标准中,默认只有在POST请求的时候,servlet 才会通过getparameter()方法取得请求体 ...

  6. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件

    场景 Retrofit2 Retrofit 是对 OkHttp 的封装,是主流的网络框架. 适用于Android 和 Java 的类型安全的HTTP客户端,由Square提供的. Retrofit是一 ...

  7. MFC使用http post请求上传文件

    文章目录 前言 代码 前言 笔者在Windows编程开发时候,有个上传文件的需求,服务端给的接口是http接口,和网页上面 表单上传文件一样(form-data方式).当然我们拿到这需求,一想 用Wi ...

  8. Http post请求上传文件

    最近遇到一个需求,需要调用HttpClient实现上传文件的功能,Content-Type为form-data形式 研究一番,代码如下: /*** multipart/form-data 上传文件方式 ...

  9. php post 文件,PHP响应post请求上传文件的方法_php技巧

    本文实例讲述了PHP响应post请求上传文件的方法.分享给大家供大家参考,具体如下: function send_file($url, $post = '', $file = '') { $eol = ...

最新文章

  1. jdbc桥连接过程解析
  2. 夜间模式的开启与关闭,父模板的制作
  3. 玩点不一样的,如何使用MATLAB实现批量修改文件后缀名,文件名,批量复制文件
  4. PHP算法根据周数获取开始结束日期
  5. 学习Knowledge Graph Embedding Based Question Answering代码笔记
  6. Loguru:Python 日志终极解决方案
  7. 想做Bezier动画,可惜弄出来这个差远了。
  8. 使用OWA无法撰写邮件内容的解决法
  9. The Art of Memory Forensics-Windows取证(Virut样本取证)
  10. 考勤系统java_基于java开发的考勤管理系统
  11. 承载童年的游戏机,已停产!但我在 GitHub 找到了它们
  12. 【python】断言的用法
  13. eMTC是什么技术?
  14. 聚簇索引,非聚簇索引
  15. ybt1109 开关灯
  16. ROS可以不扫描地图,自己制作地图
  17. HTML figcaption 标签
  18. 三升序列20210314-20210413
  19. 从零搭建游戏服务器,拢共分几步?
  20. 理财系列 3 股票体检指标之市净率

热门文章

  1. firebase登录验证_使用Firebase进行电话号码身份验证
  2. H. 田忌赛马---故事新编
  3. 邓白氏编码申请地址,DUNS
  4. 判断一点是否在三角形的外接圆内
  5. springboot controller 中新建一个控制器类 提示该类从未被使用
  6. 家庭版Win10打不开组策略编辑器怎么办
  7. eas库存状态调整单不能反审核_金蝶EAS供应链管理标准操作规程(存货核算).doc
  8. XXX售后服务解决方案
  9. Mysql 杂文记事
  10. Java数据结构之中缀表达式转后缀表达式