当前位置:   article > 正文

Spring cloud restTemplate 传递复杂参数(多个对象)_postmapping传多个参数

postmapping传多个参数

使用微服务的时候往往服务之间调用比较麻烦,spring cloud提供了Feign接口调用, RestTemplate调用的方式

这里我探讨下RestTemplate调用的方式:

服务A:接收三个对象参数 这三个参数的是通过数据库查询出来的

服务B:要调用服务A 服务B提供了查询三个参数的方法,后面要使用三个参数

对于服务A,处理的方式有两中

1. 服务B提供一个Feign接口将查询三个参数的方法公开,服务A直接引用Feign来查询参数,服务B只需要将三个查询关键字传递过去即可

服务A action

  1.  @PostMapping("/import/{busiCode}/{filePath}")
  2. public Map<String,String> importExcel(@PathVariable("filePath") String filePath,@PathVariable("busiCode") String busiCode,@RequestBody Map<String, String> params,
  3. HttpServletRequest request,HttpServletResponse response) {
  4. response.setCharacterEncoding("UTF-8");
  5. UserInfo user = UserUtil.getUser();
  6. return excelService.importExcel(filePath,busiCode,params,user);
  7. }

服务A service

  1. //引入Feign接口
  2. private ExcelFreign excelFreign;
  3. public Map<String,String> importExcel(String filePath, String busiCode,Map<String, String> params,UserInfo user ) {
  4. Map<String,String> result=new HashMap<String,String>();
  5. excelFreign = SpringTool.getApplicationContext().getBean(ExcelFreign.class);
  6. CmdImportConfigDto configDto = excelFreign.getCmdImportConfigByBusiCode(busiCode);
  7. CmdImportDto importDto=new CmdImportDto();
  8. importDto.setImportConfigId(configDto.getId());
  9. importDto.setExcelPath(filePath);
  10. importDto.setParam(new GsonBuilder().create().toJson(params));
  11. importDto.setLog("");
  12. Long impId=null;
  13. try {
  14. impId= Long.valueOf(excelFreign.saveCmdImportDto(importDto));
  15. } catch (Exception e1) {
  16. e1.printStackTrace();
  17. result.put("error", "保存出现异常");
  18. result.put("message", e1.getMessage());
  19. return result;
  20. }
  21. try{
  22. excelFreign.updateImportStatus(impId, ImportConstant.ImportStatus.SUBMIT, "提交成功");
  23. }catch(Exception e){
  24. e.printStackTrace();
  25. }
  26. ValidateTask validateTask=new ValidateTask();
  27. validateTask.init(impId,filePath, busiCode, params,user);
  28. String message;
  29. try {
  30. message = validateTask.call();
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. result.put("error", "验证出现异常");
  34. result.put("message", e.getMessage());
  35. return result;
  36. }
  37. if(message!=null){
  38. result.put("error", "验证不通过");
  39. result.put("message", message);
  40. return result;
  41. }
  42. PersistTask persistTask=new PersistTask();
  43. persistTask.init(impId,filePath, busiCode, params,user);
  44. result.putAll(ImportQueue.submit(persistTask));
  45. return result;
  46. }

服务B 提供的B-Fegin

  1. @FeignClient(value = "frame-service",path = "/excelApi/v1")
  2. public interface ExcelFreign extends ExcelApi {
  3. }

服务B api层 B-api

  1. public interface ExcelApi {
  2. /**
  3. * 更新状态
  4. * @param impId
  5. * @param importType
  6. * @param result
  7. */
  8. @PostMapping("/updateImportStatus/{impId}/{importType}/{result}")
  9. void updateImportStatus(@PathVariable("impId") Long impId, @PathVariable("importType") String importType, @PathVariable("result") String result) throws Exception;
  10. /**
  11. * 获取导入配置项
  12. * @param busiCode
  13. * @return
  14. */
  15. @GetMapping("/getImportConfig/{busicode}")
  16. CmdImportConfigDto getCmdImportConfigByBusiCode(@PathVariable("busicode") String busiCode);
  17. /**
  18. * 保存信息
  19. * @param importDto
  20. * @return
  21. */
  22. @PostMapping("/saveImport")
  23. String saveCmdImportDto(@RequestBody CmdImportDto importDto);
  24. }

服务B 实现api接口的action

  1. @RestController
  2. @RequestMapping("/excelApi/v1")
  3. public class ExcelFeignAction implements ExcelApi {
  4. @Autowired
  5. private CmdExportService exportService;
  6. /**
  7. * 获取导入配置项
  8. * @param busiCode
  9. * @return
  10. */
  11. @GetMapping("/getImportConfig/{busicode}")
  12. public CmdImportConfigDto getCmdImportConfigByBusiCode(@PathVariable("busicode") String busiCode){
  13. return cmdImportConfigService.getCmdImportConfigByBusiCode(busiCode);
  14. }
  15. /**
  16. * 更新状态
  17. * @param impId
  18. * @param importStatus
  19. * @param result
  20. */
  21. @PostMapping("/updateImportStatus/{impId}/{importType}/{result}")
  22. public void updateImportStatus(@PathVariable("impId") Long impId, @PathVariable("importType") String importStatus, @PathVariable("result") String result) throws Exception{
  23. cmdImportService.updateImportStatus(impId,importStatus,new Date() , result);
  24. }
  25. /**
  26. * 保存信息
  27. * @param importDto
  28. * @return
  29. */
  30. @PostMapping("/saveImport")
  31. public String saveCmdImportDto(@RequestBody CmdImportDto importDto){
  32. try{
  33. cmdImportService.saveCmdImportDto(importDto);
  34. return importDto.getId();
  35. }catch (Exception e){
  36. e.printStackTrace();
  37. throw new BusinessRuntimeException("系统出现异常");
  38. }
  39. }
  40. }

服务B 调用服务A  action层

  1. /**
  2. *
  3. * @param busicode 导出的业务编码 能确定某个模块做导出操作
  4. * @param values 请求参数
  5. *
  6. * 通过restTemplate 传递复杂参数
  7. * @return
  8. * 返回 文件流 让浏览器弹出下载
  9. */
  10. @PostMapping(value = "/export/v3/{busicode}")
  11. @ResponseBody
  12. public ResponseEntity<byte[]> expDownLoadV3(@PathVariable("busicode") String busicode , @RequestBody Map<String,Object> values, HttpServletRequest request)throws Exception {
  13. if(StringUtils.isBlank(busicode)){
  14. throw new BusinessRuntimeException("参数错误,请检查参数是否正确,busicode ?");
  15. }
  16. // 获取执行过程
  17. Map map = restTemplate.postForObject("http://" + serviceId + "/excelApi/v1/文件名"/"+busicode,values,Map.class);
  18. String path = (String)map.get("filepath");
  19. byte[] excel = FastDFSClient.downloadToBytes(path);
  20. CmdExportConfigDto cmdExportConfig = exportService.getCmdExportConfigByBusiCode(busicode);
  21. //获取文件名
  22. String fileName = cmdExportConfig.getReportName();
  23. // 获取文件后缀名
  24. String extFileName = path.substring(path.lastIndexOf('.')+1);
  25. HttpHeaders headers = new HttpHeaders();
  26. // 获取用户浏览器的种类 对不同的浏览器进行编码处理
  27. final String userAgent = request.getHeader("USER-AGENT");
  28. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  29. headers.setContentDispositionFormData("attachment", FrameUrlConstants.transFromFileName(userAgent,fileName) + "." + extFileName);
  30. return new ResponseEntity<byte[]>(excel,headers,HttpStatus.OK);
  31. }

2.服务B将查询出来的参数直接传递给服务A

服务A:

  1. /**
  2. * 接收参数传递
  3. * 分别接收下面三种key value的键值对
  4. * cmdExportConfig:CmdExportConfigDto
  5. * exportFieldList:List<CmdExportFieldConfigDto>
  6. * params:Map
  7. * @param params
  8. * @param request
  9. * @param response
  10. * @return
  11. */
  12. @PostMapping("/export/v2")
  13. public ResponseEntity exportExcel(@RequestBody Map<String,Object> params,HttpServletRequest request,HttpServletResponse response) {
  14. response.setCharacterEncoding("UTF-8");
  15. try {
  16. // 将文件的路径获取到
  17. ObjectMapper mapper = new ObjectMapper();
  18. LinkedHashMap requestParMap = (LinkedHashMap)params.get("cmdExportConfig");
  19. CmdExportConfigDto cmdExportConfigDto = null;
  20. List<CmdExportFieldConfigDto> exportFieldList = null;
  21. if(requestParMap.size()>0){
  22. cmdExportConfigDto = mapper.convertValue(requestParMap,CmdExportConfigDto.class);
  23. }
  24. ArrayList arrayList = (ArrayList)params.get("exportFieldList");
  25. if(arrayList.size()>0){
  26. exportFieldList = mapper.convertValue(arrayList, new TypeReference<CmdExportFieldConfigDto>() {});
  27. }
  28. Map values = (Map)params.get("params");
  29. String filePath = excelService.exportExcel(cmdExportConfigDto,exportFieldList,params,request.getServletContext().getRealPath("/"));
  30. Map<String,String> map = new HashMap<String, String>();
  31. map.put("filepath", filePath);
  32. return new ResponseEntity(map,HttpStatus.OK);
  33. }catch (IOException e){
  34. throw new RuntimeException("输出文件出错");
  35. }
  36. }

服务B:

  1. /**
  2. *
  3. * @param busicode 导出的业务编码 能确定某个模块做导出操作
  4. * @param values 请求参数
  5. *
  6. * 通过restTemplate 传递复杂参数
  7. * @return
  8. * 返回 文件流 让浏览器弹出下载 目前需要解决 将字节流响应到浏览器的控制台了 后面均采用url下载的方式
  9. */
  10. @PostMapping(value = "/export/v3/{busicode}",produces = MediaType.TEXT_PLAIN_VALUE)
  11. @ResponseBody
  12. public ResponseEntity<byte[]> expDownLoadV3(@PathVariable("busicode") String busicode , @RequestBody Map<String,Object> values, HttpServletRequest request)throws Exception {
  13. String busiCode = values.get("busiCode").toString();
  14. if(StringUtils.isBlank(busiCode)){
  15. throw new BusinessRuntimeException("参数错误,请检查参数是否正确,busiCode ?");
  16. }
  17. // 获取执行过程
  18. Map map = excuteRestTemplate(busiCode,values);
  19. String path = (String)map.get("filepath");
  20. byte[] excel = FastDFSClient.downloadToBytes(path);
  21. CmdExportConfigDto cmdExportConfig = exportService.getCmdExportConfigByBusiCode(busiCode);
  22. //获取文件名
  23. String fileName = cmdExportConfig.getReportName();
  24. // 获取文件后缀名
  25. String extFileName = path.substring(path.lastIndexOf('.')+1);
  26. HttpHeaders headers = new HttpHeaders();erAgent = request.getHeader("USER-AGENT");
  27. headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
  28. headers.setContentDispositionFormData("attachment", FrameUrlConstants.transFromFileName(userAgent,fileName) + "." + extFileName);
  29. return new ResponseEntity<byte[]>(excel,headers,HttpStatus.OK);
  30. }
  31. /**
  32. * 执行请求调用
  33. * @param busiCode
  34. * @param variables
  35. * @return
  36. */
  37. private Map excuteRestTemplate(String busiCode,Map variables){
  38. String serviceId="";
  39. //查询导出配置
  40. CmdExportConfigDto cmdExportConfig = exportService.getCmdExportConfigByBusiCode(busiCode);
  41. serviceId = cmdExportConfig.getSystemType();
  42. if(cmdExportConfig==null){
  43. throw new BusinessRuntimeException("没有导出配置无法导出");
  44. }
  45. //根据导出配置id获取导出字段信息
  46. List<CmdExportFieldConfigDto> exportFieldList = exportService.getAllCmdExportFieldConfigDtoByConfigId(cmdExportConfig.getId());
  47. if(StringUtils.isBlank(serviceId)){
  48. throw new BusinessRuntimeException("未配置导出的服务");
  49. }
  50. Map<String, Object> uriVariables = new HashMap<>();
  51. uriVariables.put("cmdExportConfig",cmdExportConfig);
  52. uriVariables.put("exportFieldList",exportFieldList);
  53. uriVariables.put("params",variables);
  54. return restTemplate.postForObject("http://" + serviceId + "/excelService/export/v2",new HttpEntity(uriVariables),Map.class);
  55. }

设置浏览器头

  1. /**
  2. * 根据不同的浏览器类型设置下载文件的URL编码
  3. * @param userAgent
  4. * @param fileName
  5. * @return
  6. * @throws Exception
  7. */
  8. public static String transFromFileName(String userAgent,String fileName) throws Exception{
  9. String finalFileName = "";
  10. if(StringUtils.contains(userAgent, "MSIE")){//IE浏览器
  11. finalFileName = URLEncoder.encode(fileName,"UTF-8");
  12. }else if(StringUtils.contains(userAgent, "Mozilla")){//google,火狐浏览器
  13. finalFileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
  14. }else{
  15. finalFileName = URLEncoder.encode(fileName,"UTF-8");//其他浏览器
  16. }
  17. return finalFileName;
  18. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/302771?site
推荐阅读
相关标签
  

闽ICP备14008679号