其實解決辦法很簡單,就是POST請求的時候,來自實體的參數,content-type:application/x-www-form-urlencoded情況下,是默認按照鍵值對來解析的,比如paramname=paramvalue的形式,但是這里有個隱形的要求就是frombody的參數只能是一個,如果多個參數被修飾為frombody,編譯的時候會報錯,也就是意味着,只要是frombody修飾過的參數,其名字並不重要,而再http請求的body部分,直接忽略起參數名,從=開始寫參數內容,那么就可以直接被讀取為string類型。如果沒看懂,請看下面的截圖示范:
上圖是模擬的一個http請求,中圖是服務器端代碼,下圖是剛剛執行完之后插入到數據庫的值,
其中關注點有3處,
1,服務器端代碼可以看出是需要傳遞兩個參數的,都是string類型的參數,不同的是一個從url中抽取,另一個從body中抽取,url中已經寫入了一個參數,后面沒有加&去跟上另一個參數,
2,數據內容其實就是body中要填寫的內容,編碼形式默認是utf-8,body中上傳的內容中,不能是和url中一樣的鍵值對,key=value的形式並不認可,相反,直接從=開始,后面的全部作為一個frombody的sting類型的參數進行傳遞,如果開頭不是=號,那么服務器上的message將會是null空值,
3,數據內容,也就是body內容的長度參數,是必須要有的,在http1.1以上中,如果使用post,並且body中非空時,必須要有content-length的標頭,並且,如果字符中存在漢字,那么再utf-8編碼模式下,其長度應該采用編碼后的字符長度,而不是編碼前的長度,也就是byte數組的長度,如果不信可以親自手寫一次進行確認。
當然網上對於frombody參數為空值的情況,有很多人都建議自己做一個讀入參數的類去處理,或者將string類型變為object去接收的,然后再抓化成比如json的形式去接收的,但是content-type也要做改變為text/json等,我覺得還是比這種方式要復雜一些,完全不如這種方式來的方便簡單。