1. 程式人生 > WINDOWS開發 >轉:關於ASP.NET中WEBAPI中POST請求中FromBody修飾的string型別的引數伺服器端獲取不到值FromBody空值的簡單解決方法

轉:關於ASP.NET中WEBAPI中POST請求中FromBody修飾的string型別的引數伺服器端獲取不到值FromBody空值的簡單解決方法

其實解決辦法很簡單,就是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等,我覺得還是比這種方式要複雜一些,完全不如這種方式來的方便簡單。