@RequestMapping("/{userName}/{year}") @ResponseBody public String checkChannel(@PathVariable("userName") String userName, @PathVariable("year") String year){ return userName+"_"+year; }
远程调用一个 HTTP 接口时,可以使用Spring框架提供的工具类: Spring 框架提供的一个工具类RestTemplate。
但是在 Spring 5 中已经不再建议使用 RestTemplate
通过 RestTemplate,我们可以非常方便的进行 Rest API 调用。
RequestEntity
参数,可以自己设置 HTTP method,URL,headers 和 body,返回 ResponseEntity;(1)普通接口调用
String defaultJsonResult = restTemplate.postForObject(ntpUrl,null, String.class); JSONObject object = JSON.parseObject(defaultJsonResult);
JSONObject forObject = restTemplate.getForObject(ibs, JSONObject.class); districts = (List<JSONObject>) forObject.get("districts"); JSONObject object = JSON.parseObject(JSON.toJSONString(districts.get(0))); districts=(List<JSONObject>)object.get("districts");
String flagStr = restTemplate.postForObject(volunUrl, null, String.class); JSONObject object = JSON.parseObject(flagStr); boolean flag1 = (boolean) object.get("data");
Map<String, String> vars = Collections.singletonMap("hotel", "42"); // 通过 GET 方式调用,返回一个 String 值,还可以给 URL 变量设置值(也可通过 uriTemplateHandler 这个属性自定义) String result = restTemplate.getForObject( "https://example.com/hotels/{hotel}/rooms/{hotel}", String.class, vars); String url = "http://127.0.0.1:8080/hello"; JSONObject param = new JSONObject(); //restTemplate 会根据 params 的具体类型,调用合适的 HttpMessageConvert 将请求参数写到请求体 body 中,并在请求头中添加合适的 content-type; // 也会根据 responseType 的类型(本列子中是 JSONObject),设置 head 中的 accept 字段,当响应返回的时候再调用合适的 HttpMessageConvert 进行响应转换 ResponseEntity<JSONObject> responseEntity=restTemplate.postForEntity(url,params,JSONObject.class); int statusCodeValue = responseEntity.getStatusCodeValue(); HttpHeaders headers = responseEntity.getHeaders(); JSONObject body = responseEntity.getBody();
(2)添加 Header 和 Cookie
UriComponents uriComponents = UriComponentsBuilder.fromHttpUrl("127.0.0.1:8080"). path("/test").build(true); URI uri = uriComponents.toUri(); RequestEntity<JSONObject> requestEntity = RequestEntity.post(uri). // 添加 cookie(这边有个问题,假如我们要设置 cookie 的生命周期,作用域等参数我们要怎么操作) header(HttpHeaders.COOKIE,"key1=value1"). // 添加 header header(("MyRequestHeader", "MyValue") accept(MediaType.APPLICATION_JSON). contentType(MediaType.APPLICATION_JSON). body(requestParam); ResponseEntity<JSONObject> responseEntity = restTemplate.exchange(requestEntity,JSONObject.class); // 响应结果 JSONObject responseEntityBody = responseEntity.getBody();
(3)文件上传发送
public Object uplaod(@RequestBody JSONObject params) throws Exception{ final String url = "http://localhost:8888/hello/m3"; // 设置请求头 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.MULTIPART_FORM_DATA); // 设置请求体,注意是 LinkedMultiValueMap FileSystemResource resource1 = new FileSystemResource("D:\\dir1\\ss\\pic1.jpg"); FileSystemResource resource2 = new FileSystemResource("D:\\dir1\\ss\\pic2.jpg"); MultiValueMap<String, Object> form = new LinkedMultiValueMap<>(); form.add("file", resource1); form.add("file", resource2); form.add("param1","value1"); HttpEntity<MultiValueMap<String, Object>> files = new HttpEntity<>(form, headers); JSONObject s = restTemplate.postForObject(url, files, JSONObject.class); return s; }
(4)文件上传接收
@RequestMapping("/m3") public Object fileUpload(@RequestParam("file") MultipartFile[] files, HttpServletRequest request) throws Exception { // 携带的其他参数可以使用 getParameter 方法接收 String param1 = request.getParameter("param1"); Response response = new Response(); if (files == null) { response.failure("文件上传错误, 服务端未拿到上传的文件!"); return response; } for (MultipartFile file : files) { if (!file.isEmpty() && file.getSize() > 0) { String fileName = file.getOriginalFilename(); // 参考 FileCopyUtils 这个工具类 file.transferTo(new File("D:\\" + fileName)); logger.info("文件:{} 上传成功...",fileName); } } response.success("文件上传成功"); return response; }