Java后端模拟前端请求
package com.example.hystrix.controller; import org.springframework.core.io.FileSystemResource; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.io.File; public class Demo{ public void uploadTest() { String url = "http://localhost:8080/upload"; //上传的地址 String filePath = "D:/test/test.mp4"; RestTemplate rest = new RestTemplate(); FileSystemResource resource = new FileSystemResource(new File(filePath)); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("file", resource); //MultipartFile的名称 String restResult = rest.postForObject(url, param, String.class); System.out.println(restResult); } }
另一种方式,代码片段:
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); FileSystemResource resource = new FileSystemResource(new File(filePath)); param.add("file", resource); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(param, headers); RestTemplate rest = new RestTemplate(); String restResult = rest.postForObject(url, requestEntity, String.class);
---------------------------------------------
发现一个问题,/download这个POST接口,@QueryParam这个注解虽然是post请求但是不会以body里的内容传参,而是用parameter传参,也就是get请求的传参方式
使用RestTemplate.postForObject无法调用,报错:Only resource methods using @FormParam will work as expected
@POST @Path("/download") @Produces(MediaType.APPLICATION_OCTET_STREAM) public Response download(@QueryParam("attachmentId") String attachmentId, @Context HttpServletResponse response) { }
所以我改用httpclient,调用POST成功
/** * @param url * 下载路径 * @param downloadDir * 下载存放目录 */ public static void downloadFile(String url, String downloadDir) { File file = new File(downloadDir); if (!file.exists()) { // 如果文件不存在则下载 CloseableHttpClient httpclient = HttpClients.createDefault(); try { HttpPost httpPost = new HttpPost(url); httpPost.addHeader("Content-Type", MediaType.APPLICATION_FORM_URLENCODED); CloseableHttpResponse response = httpclient.execute(httpPost); try { if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { HttpEntity entity = response.getEntity(); if (entity != null) { InputStream in = entity.getContent(); OutputStream out = new FileOutputStream(file); int size = 0; int lent = 0; byte[] buf = new byte[1024]; while ((size = in.read(buf)) != -1) { lent += size; out.write(buf, 0, size); } in.close(); out.close(); } EntityUtils.consume(entity); } else { logger.error("文件下载失败" + url); } } finally { response.close(); } } catch (Exception e) { e.printStackTrace(); } finally { try { httpclient.close(); } catch (IOException e) { e.printStackTrace(); } } } }