encoder decoder.png
背景 :
今天遇到一個類似于下面這樣的一個問題,后端寫了一個 GET resful 接口,請求的時候需要帶一個test參數,當請求參數里有+
號的時候,后端接口把+
號替換成了 空字符串。
客戶端請求如下:
curl localhost/rest/test?test=123456+
后端接口如下:
@RestController
@RequestMapping("/rest")
public class TestController {
@RequestMapping("/test")
public ResponseEntity<String> test(@RequestParam final String test){
return ResponseEntity.ok("Requested: " + test);
}
}
后端調試接口獲得的值為
'123456 '
之所以出現這個原因就是,+
號在url參數里的時候必須要進行編碼,否則后端就會出現問題,把+
號,當做空字符串來進行處理。但是如果前端調用接口的時候進行了編碼,那么后端就需要進行相應的解碼,否則也會出問題。
把url里的參數進行編碼后變成下面這樣了:
123456%2b
后端接口debug的時候取到的值如下:
123456+
可以看到,后端獲取了正確的數據,或許有些人感覺很奇怪,我并沒好對參數進行解碼,為什么還是可以獲取到正確的數據呢?
其實spring @RequestParam
這個注解標識的參數,會自動的進行解碼,spring幫我們做了這樣一件事情。
如果用戶在服務端想對url參數進行編碼或者解碼怎么辦呢?
String encodedParam = URLEncoder.encode(test, "UTF-8"); //encode
String decodedParam = URLDecoder.decode(test, "UTF-8"); //decode