http请求调用的参数同时包含流文件和普通参数的处理方法

时间:2025-03-20 09:53:14

http请求调用的参数同时包含流文件和普通参数的处理方法

在项目中,如果要进行第三方对接,或者使用第三方的接口时,我们可能就需要使用http来调用了,可是有时候传参时,同时有流文件和普通参数时,我们如果直接把他们全当成一样的无差别的来传递时,对方可能会接收不到正确的参数,此时,可以用以下更原生的方法:

public String submitPost(String url, Map<String, String> params, MultipartFile multipartFile, String fileParamName) throws WarningMessageException {
       CloseableHttpClient httpclient = HttpClientBuilder.create().build();
       try {
                 HttpPost httppost = new HttpPost(url);
                 File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
                 //将multipartFile转file
                 FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
                 MultipartEntityBuilder builder = MultipartEntityBuilder.create();
                 builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
                 ContentType contentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), StandardCharsets.UTF_8);
                 builder.addBinaryBody(fileParamName, file);
                 if (MapUtils.isNotEmpty(params)) {
                     Set<String> keys = params.keySet();
                     for (String key : keys) {
                          builder.addTextBody(key, params.get(key), contentType);
                     }
                 }
                 httppost.setEntity(builder.build());
                 HttpResponse response = httpclient.execute(httppost);
                 int statusCode = response.getStatusLine().getStatusCode();
                 if (statusCode == HttpStatus.SC_OK) {
                 System.out.println("服务器正常响应.....");
                 HttpEntity resEntity = response.getEntity();
                 return EntityUtils.toString(resEntity);
                 } else {
                     logger.error("请求失败,响应码:" + statusCode);
                 }
          } catch (Exception e) {
                throw new HintMessageException(e);
          }
      return null;
}

其中fileParamName是流的参数名称的key, params是普通参数的键值对。
若为MultipartFile类型,则将其转成File类型的copyInputStreamToFile()方法如下:

public static void copyInputStreamToFile(InputStream source, File destination) throws IOException {
        try {
            FileOutputStream output = openOutputStream(destination);
            try {
                IOUtils.copy(source, output);
                output.close();
            } finally {
                IOUtils.closeQuietly(output);
            }
        } finally {
            IOUtils.closeQuietly(source);
        }

    }