002-06-RestTemplate-请求示例-form、json、multipart、okhttp3
一、概述
请求示例集合
服务端:https://github.com/bjlhx15/common-study.git 中的 http-client-webserver
服务端:RequestBody接收 即为Content-Type:appliaction/json接收
服务端:RequestParam 参数映射
1.1、form表单
请求头:Content-Type:application/x-www-form-urlencoded
请求方式:post
测试:

小结:
参数传递方式一、使用:MultiValueMap<String, String> valueMap = new LinkedMultiValueMap();
参数传递方式二、使用:url传递普通参数、对象接收
直接只使用对象,如没显示设置请求头,会将Content-Type设置为:application/json;
如果显示设置,headers.add("Content-Type","application/x-www-form-urlencoded");
Person person = new Person(); person.setName("test"); person.setAge(23); HttpHeaders headers=new HttpHeaders(); headers.add("Content-Type","application/x-www-form-urlencoded"); HttpEntity entity=new HttpEntity(person,headers);
会出现如下异常
No HttpMessageConverter for [com.github.bjlhx15.common.http.webserver.controller.Person] and content type [application/x-www-form-urlencoded]
1.2、form表单
请求头:Content-Type:application/json
请求方式:post
测试:

小结:
参数传递方式一、使用:对象类型参数,服务端需要RequestBody接收
参数传递方式二、使用:url传递普通参数、对象接收
直接只使用对象,如没显示设置请求头,会将Content-Type默认设置为:application/json;
1.3、multi-part form表单
请求头:Content-Type:multipart/form-data
请求方式:post
测试:

小结:
参数传递方式一、使用:MultiValueMap<String, String> valueMap = new LinkedMultiValueMap<>();可以传递普通参数和文件
参数传递方式二、使用:url传递普通参数、对象接收
@Test public void uploadFileParam() { RestTemplate restTemplate2 = new RestTemplate(new SimpleClientHttpRequestFactory()); //设置请求头 HttpHeaders headers1 = new HttpHeaders(); headers1.setContentType(MediaType.MULTIPART_FORM_DATA); MultiValueMap<String, Object> valueMap = new LinkedMultiValueMap<>(); FileSystemResource fileSystemResource = new FileSystemResource(new File("/Users/lihongxu6/IdeaProjects/common-study/common-http/http-client-test/target/test-classes/test.txt")); valueMap.add("file", fileSystemResource); valueMap.add("msg", "dddddd"); HttpEntity entity = new HttpEntity(valueMap, headers1); Result result2 = restTemplate2.postForObject("http://localhost:8080/multipart/uploadFileParam", entity, Result.class); System.out.println(result2); }
针对特殊服务端可能请求无法接收普通参数,因为传递过程对普通参数增加了Content-Type。
故可以使用okhttp3,如下
@PostMapping("upload")
public WebResult<ImageUploadResult> upload(@RequestParam("img") MultipartFile file) {
final byte[] bytes;
try {
bytes = file.getBytes();
} catch (IOException e) {
log.warn("fail to read file", file.getOriginalFilename(), e);
return new WebResult<>(500, "服务器错误,请稍后再试");
}
//构造请求Body
MultipartBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("name", "bjlhx15")
.addFormDataPart("file", bytes))
.build();
//构造请求
Request request = new Request.Builder().url("https://aaa.com/upload")
.post(body)
.build();
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslManager.getSocketFactory())
.build();
//后面的省略了...
}
更换
浙公网安备 33010602011771号