背景 :
今天遇到一個類似于下面這樣的一個問題,后端寫了一個 GET resful 接口啊楚,請求的時候需要帶一個test參數(shù)参袱,當(dāng)請求參數(shù)里有+
號的時候电谣,后端接口把+
號替換成了 空字符串。
客戶端請求如下:
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);
}
}
后端調(diào)試接口獲得的值為
'123456 '
之所以出現(xiàn)這個原因就是抹蚀,+
號在url參數(shù)里的時候必須要進行編碼剿牺,否則后端就會出現(xiàn)問題,把+
號环壤,當(dāng)做空字符串來進行處理晒来。但是如果前端調(diào)用接口的時候進行了編碼,那么后端就需要進行相應(yīng)的解碼郑现,否則也會出問題湃崩。
把url里的參數(shù)進行編碼后變成下面這樣了:
123456%2b
后端接口debug的時候取到的值如下:
123456+
可以看到,后端獲取了正確的數(shù)據(jù)接箫,或許有些人感覺很奇怪攒读,我并沒好對參數(shù)進行解碼,為什么還是可以獲取到正確的數(shù)據(jù)呢辛友?
其實spring @RequestParam
這個注解標(biāo)識的參數(shù)薄扁,會自動的進行解碼,spring幫我們做了這樣一件事情废累。
如果用戶在服務(wù)端想對url參數(shù)進行編碼或者解碼怎么辦呢邓梅?
String encodedParam = URLEncoder.encode(test, "UTF-8"); //encode
String decodedParam = URLDecoder.decode(test, "UTF-8"); //decode