post請求中的參數形式和form-data提交數據時取不到的問題


@Controller
頁面form表單請求時不會丟數據
返回json數據時需要加
注解@ResponseBody
請求格式如下
@ResponseBody
    public Object login(SignIn user)

 

@RestController
頁面form表單請求時會丟數據
返回json數據時不需要加注解@ResponseBody,@RestController已有


他倆請求參數為json時需要注解@RequestBody

一、瀏覽器四種常見的post請求方式

enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。默認地,表單數據會編碼為 "application/x-www-form-urlencoded"

(1)、HTTP 協議是以 ASCII 碼 傳輸,建立在 TCP/IP 協議之上的應用層規范。規范把 HTTP 請求分為三個部分:狀態行、請求頭、消息主體。
(2)、協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議並沒有規定數據必須 使用什么編碼方式 。實際上,開發者完全可以自己決定消息主體的格式,只要最后發送的 HTTP 請求滿足上面的格式就可以。
(3)、數據發送出去,還要服務端解析成功才有意義。一般服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。服務端通常是根據請求頭(headers)中的 Content-Type 字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。

(1)application/x-www-form-urlencoded 
這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 <form> 表單,如果不設置 enctype 屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據。

<form action="form_action.asp" enctype="text/plain">
  <p>First name: <input type="text" name="fname" /></p>
  <p>Last name: <input type="text" name="lname" /></p>
  <input type="submit" value="Submit" />
</form>

此時可以看到,

Content-Type: application/x-www-form-urlencoded;charset=utf-8
title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。大部分服務端語言都對這種方式很好的支持,常用的如jQuery中的ajax請求,Content-Type 默認值都是「application/x-www-form-urlencoded;charset=utf-8

(2)multipart/form-data
這也是常見的post請求方式,一般用來上傳文件,各大服務器的支持也比較好。所以我們使用表單 上傳文件 時,必須讓<form>表單的enctype屬性值為 multipart/form-data.

注意:以上兩種方式:application/x-www-form-urlencoded和multipart/form-data都是瀏覽器原生支持的。

(3)application/json
application/json作為響應頭並不陌生,實際上,現在很多時候也把它作為請求頭,用來告訴服務端消息主體是序列化的JSON字符串,除了低版本的IE,基本都支持。除了低版本的IE都支持JSON.stringify()的方法,服務端也有處理JSON的函數,使用json不會有任何麻煩。例如:

復制代碼
//請求數據
var data = {name:'jack',sex:'man'};
//請求數據序列化處理
JSON.stingify(data);

//結果:{'name':'jack','sex':'man'};
復制代碼

二、postman的幾種參數格式

form-data、x-www-form-urlencoded、raw、binary的區別

1.form-data對應的是頁以form表單提交傳值的情形

等價於http請求中的multipart/form-data,它會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來表名文件類型;content-disposition,用來說明字段的一些信息;
由於有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它采用了鍵值對的方式,所以可以上傳多個文件

復制代碼
POST  HTTP/1.1
Host: test.app.com
Cache-Control: no-cache
Postman-Token: 59227787-c438-361d-fbe1-75feeb78047e
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="filekey"; filename=""
Content-Type: 


------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="textkey"

tttttt
------WebKitFormBoundary7MA4YWxkTrZu0gW--
復制代碼

請求體中的boundary參數指定的就是分隔體,可以看到請求內容被分為了兩段,第一段對應filekey,第二段對應textkey。

2. x-www-form-urlencoded
即application/x-www-from-urlencoded,將表單內的數據轉換為Key-Value。

復制代碼
POST  HTTP/1.1
Host: test.app.com
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: e00dbaf5-15e8-3667-6fc5-48ee3cc89758

key1=value1&key2=value2
復制代碼

form-data與x-www-form-urlencoded的區別

  • multipart/form-data:可以上傳文件或者鍵值對,最后都會轉化為一條消息
  • x-www-form-urlencoded:只能上傳鍵值對,而且鍵值對都是通過&間隔分開的

3.raw對應的是入參是任意格式的可以上傳任意格式的【文本】,可以上傳text、json、xml、html等

(4)binary

相當於Content-Type:application/octet-stream,只可以上傳二進制數據,通常用來上傳文件,但是一次只能上傳一個文件

 

 響應

1.點擊 Send 即可發送請求
在下面的response模塊顯示返回信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM