今天想实现 java 后端发送 formdata 上传文件,为了以后查找方便,特此记录下来
上一次使用 WebClient 实现远程调用 (一个非阻塞、响应式的HTTP客户端,它以响应式被压流的方式执行HTTP请求) 查看
现在使用的 RestTemplate
RestTemplate 是用于同步client端访问 Restful 服务的一个核心类
默认使用 JDK 提供的包去建立HTTP连接
为每种 HTTP 请求都实现了相关的请求封装方法,根据HTTP的六个方法制定
HTTP method | RestTemplate methods |
---|---|
DELETE | delete |
GET | getForObject |
getForEntity | |
HEAD | headForHeaders |
OPTIONS | optionsForAllow |
POST | postForLocation |
postForObject | |
PUT | put |
any | exchange |
execute |
eg:后端实现文件上传
(1)public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType)
参数:
url -> URI类型的请求路径
request -> 请求体对象
responseType -> 响应数据类型
返回值:
响应消息体的内容
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; @RestController public class DemoController { @RequestMapping("/upload") public String upload() { String url = "http://localhost:2001/api/upload"; //上传的地址 String filePath = "E:\test\test.dxf"; RestTemplate rest = new RestTemplate(); FileSystemResource resource = new FileSystemResource(new File(filePath)); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("files", resource); //MultipartFile的名称 String rs = rest.postForObject(url, param, String.class); System.out.println(rs); return rs; } }
说明:
exchange()方法跟上面的getForObject()、getForEntity()、postForObject()、postForEntity()等方法不同之处在于它可以指定请求的HTTP类型
MultiValueMap 是 Map 的一个子类,它的一个 key 可以存储多个 value
(2)public <T> ResponseEntity<T> exchange(URI url, HttpMethod method, @Nullable HttpEntity<?> requestEntity, Class<T> responseType)
参数:
url -> URI类型的请求路径
method-> 请求方式
requestEntity-> 请求体
responseType -> 响应数据类型
返回值:
Spring对HTTP请求响应的封装,包括了响应码、contentType、contentLength、响应消息体等
package com.example.hystrix.controller; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; 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; @RestController public class DemoController { @RequestMapping("/upload") public String upload() { String url = "http://localhost:2001/api/upload"; //上传的地址 String filePath = "E:\test\test.dxf"; RestTemplate rest = new RestTemplate(); FileSystemResource resource = new FileSystemResource(new File(filePath)); MultiValueMap<String, Object> param = new LinkedMultiValueMap<>(); param.add("files", resource); //MultipartFile的名称 HttpEntity<MultiValueMap<String, Object>> httpEntity = new HttpEntity<MultiValueMap<String, Object>>(param); ResponseEntity<String> responseEntity = rest.exchange(url, HttpMethod.POST, httpEntity, String.class); String rs = responseEntity.getBody(); System.out.println(rs); return rs; } }
说明:
exchange()方法跟上面的getForObject()、getForEntity()、postForObject()、postForEntity()等方法不同之处在于它可以指定请求的HTTP类型
eg,其他:
发送Get请求
(1)public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
参数:
url -> URI类型的请求路径
responseType -> 响应数据类型
uriVariables-> URL变量
返回值:
Spring对HTTP请求响应的封装,包括了响应码、contentType、contentLength、响应消息体等
package com.example.hystrix.controller; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @RestController public class DemoController { @RequestMapping("/test") public String test() { RestTemplate restTemplate = new RestTemplate(); String url = "http://localhost:2001/api/test?name={name}&text={text}"; Map<String, String> params = new HashMap<>(); params.put("name", "baby"); params.put("text", "aaa"); ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class, params); String response = responseEntity.getBody(); return response; } }
(2)public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
参数:
url -> URI类型的请求路径
responseType -> 响应数据类型
uriVariables-> URL变量
返回值:
响应消息体的内容
package com.example.hystrix.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.util.HashMap; import java.util.Map; @RestController public class DemoController { @RequestMapping("/test") public String test() { RestTemplate restTemplate = new RestTemplate(); String url = "http://localhost:2001/api/test?name={name}&text={text}"; Map<String, String> params = new HashMap<>(); params.put("name", "baby"); params.put("text", "aaa"); String response = restTemplate.getForObject(url, String.class, params); return response; } }
说明:
url里使用name={name}的形式,最后一个参数是一个map,map的key即为前边占位符的名字,map的value为参数值
只关注返回的消息体的内容,对其他信息都不关注,可以使用getForObject