Java 开发常见问题汇总(一)
  WebJAVA   0 评论

Java 开发常见问题汇总(一)

  WebJAVA   0 评论

RequestBody 直接解析

问题描述

我们在开发过程中遇到了这样的情况:

前端填写的输入框对应的参数又后端接口获取,然后设置或者修改数据,再发送至接口去添加或者更新数据,由于这些字段是非固定的,按照配置可变更,所以我们无法直接约定好需要解析的参数名

解决方案

考虑到以上的需求情况,我们在设计接口的时候并没有设置任何的参数解析,而是直接使用了请求体内容,并将请求体转换为 String 字符串

@PostMapping("/test")
@ResponseBody
public AjaxResult insertCompany(@RequestBody String requestBody) {
    Map params = new HashMap();
    String[] paramStrings = requestBody.split("&");
    for(int i=0; i<paramStrings.length; i++) {
        String[] param = paramStrings[i].split("=");
        if(param.length == 2) {
            params.put(param[0], param[1]);
        }
    }
    return new AjaxResult(400, "接口正在开发中", null);
}

在接下来的 Log 信息中,我们发现传入 Dao 层的函数中的字符串全都为诸如 %2E 等集合,这是由于使用了 application/x-www-form-urlencoded 的内容类型,请求内的数据在传递过程中会将其中的中文、特殊符号(非西欧字符)等字符串编码,所以,我们要先将我们的 requestBody 字符串进行一次解码

@PostMapping("/test")
@ResponseBody
public AjaxResult insertCompany(@RequestBody String requestBody) {
    Map params = new HashMap();
    String decodeRequestBody = "";
    try { // 执行该函数可能会跑出异常,要作捕获和处理
        decodeRequestBody = URLDecoder.decode(requestBody, "UTF-8");
    } catch (Exception e) {
        return new AjaxResult(400, "请求体解码失败", null);
    }
    String[] paramStrings = decodeRequestBody.split("&");
    for(int i=0; i<paramStrings.length; i++) {
        String[] param = paramStrings[i].split("=");
        if(param.length == 2) {
            params.put(param[0], param[1]);
        }
    }
    return new AjaxResult(400, "接口正在开发中", null);
}

详细知识补充

java.net.URLDecoder.decode(String s,String enc);
// 将 application/x-www-form-urlencoded 字符串转换成普通字符串

java.net.URLEncoder.decode(String s,String enc);
// 将普通字符串转换成 application/x-www-form-urlencoded 字符串

// s 为需要转换的字符串
// enc 为编码形式,如UTF-8、gb2312

Spring Boot 通过 Controller 返回本地图片

问题描述

我们在开发过程中遇到这样一个需求:Spring Boot 本身不是一个文件容器,打包的时候会把所有的资源直接放进 jar 包中,这样我们就无法将图片上传至静态资源文件夹并给出预览连接了,通过询问我们可以把项目发布到 nginx,然后将上传的图片保存至 nginx 的工作目录,但是这样并不方便进行调试,所以我们必须另辟蹊径,考虑能不能通过访问接口来获取图片数据,直接显示图片

解决方案

@GetMapping("/test/cover/{fileName}")
@ResponseBody
public ResponseEntity<?> getProjectCover(@PathVariable(value = "fileName") String fileName) {
    String filePath = "D://upload/cover/" + pid + "/" + fileName; // 组合文件路径
    HttpHeaders httpHeaders = new HttpHeaders();
    try {
        InputStream inputStream = new FileInputStream(new File(filePath));
        InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
        return new ResponseEntity<>(inputStreamResource, httpHeaders, HttpStatus.OK);
    } catch (Exception e) {
        return new ResponseEntity<>(null, httpHeaders, HttpStatus.NOT_FOUND);
    }
}

详细知识补充

回复