一、概述
请求示例集合
服务端: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(); //后面的省略了... }
更换