javaspringspring-boothttp-request-parameters

What's the best way to encode and decode parameter in springboot?


I use @RequestParam to get the parameter value,but I find the if I pass the value like 'name=abc&def&id=123',I will get the name value 'abc' instead of 'abc&def'. I find the encode and decode the parameter value can solve my problem.But I have to write the encode and decode mehtod in every controller method,Do spring have the global mehtod that decode every @RequestParam value?When using @RequestParam, is it necessary to encode and decode every value?

Here is my code:

@PostMapping("/getStudent")
public Student getStudent(
        @RequestParam String name,
        @RequestParam String id) { 
        name= URLDecoder.decode(name, "UTF-8");  
        //searchStudent
        return Student;
}

@PostMapping("/getTeacher")
public teacher getTeacher(
        @RequestParam String name,
        @RequestParam String teacherNo) { 
        name= URLDecoder.decode(name, "UTF-8");  
        //searchTeacher
        return teacher;
}

Somebody say the the Spring will have already done this,but I have try,the result is not right.Only use curl cmd is ok,but java code is not ok.

@PostMapping(value = "/example")
public String handleUrlDecode1(@RequestParam String param) { 
    //print ello%26test
    System.out.println("/example?param received: " + param); 
    return "success";
}

@GetMapping(value = "/request")
public String request() {
    String url =  "http://127.0.0.1:8080/example?param=ello%26test";
    System.out.println(url);
    RestTemplate restTemplate = new RestTemplate();
    return restTemplate.postForObject(url, null, String.class);
}

Solution

  • You must create an HTTP entity and send the headers and parameter in body.

    @GetMapping(value = "/request")
    public String request()  {
        String url =  "http://127.0.0.1:8080/example";
        System.out.println(url);
        RestTemplate restTemplate = new RestTemplate(); 
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
        map.add("param","ello&test");
        map.add("id","ab&c=def");
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers); 
        return restTemplate.postForObject(url, request, String.class);
    }