在HTTP通訊中主要分爲GET和POST。如PUT,DELETE是類POST的傳輸方式,與POST沒有實質區別。OPTION是查看服務器支持的請求方法。HEAD是測試服務器的該資源狀況,不返回實體的主體部分。TRACE請求能夠獲取回服務器接收到的該請求的原始報文,從而判斷路徑中的代理和防火牆是否對該條請求進行修改。前端
<請求方法> <請求路徑> <協議版本> <請求頭> <主體body>
爲了規範,使用GET請求時就不要在主體body中放數據了,避免沒必要要的錯誤。因此請求中的數據是放在URL上的。java
例如用GET作登陸請求spring
GET /online/test/?name=haha& password=miaomiao HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/x-www-form-urlencoded cache-control: no-cache Postman-Token: 14a1347a-c540-48f0-9d49-6299f86c3a73
post請求能夠在body中傳送大量信息json
以上傳name=haha,password=miaomiao爲例,查看不一樣body數據格式瀏覽器
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW cache-control: no-cache Postman-Token: c6e21725-caec-4a40-841c-7b92f87f6999 Content-Disposition: form-data; name="name" haha Content-Disposition: form-data; name="password" miaomiao ------WebKitFormBoundary7MA4YWxkTrZu0gW--
若在表單中附加一張圖片服務器
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW cache-control: no-cache Postman-Token: 437207ba-e007-4de8-bbcd-bdc88db6e445 Content-Disposition: form-data; name="name" haha Content-Disposition: form-data; name="password" miaomiao Content-Disposition: form-data; name="profile"; filename="C:\Users\Think\Pictures\profile.jpg ------WebKitFormBoundary7MA4YWxkTrZu0gW--
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/x-www-form-urlencoded cache-control: no-cache Postman-Token: 35566466-0568-4731-9c1c-6eda7dfca105 name=hahapassword=miaomiaoundefined=undefined
以json格式爲例app
POST /online/test/? HTTP/1.1 Host: 127.0.0.1:8080 Content-Type: application/json cache-control: no-cache Postman-Token: 06a9f071-4424-428a-b17b-9b4fe6f209a2 { "name":"haha", "password":"miaomiao" }------WebKitFormBoundary7MA4YWxkTrZu0gW--
用做傳輸文件,包括前面的form-data上傳文件,文件都是以必定的編碼方式寫在body中的,在服務器端獲取該請求的輸入流後,便可按行接收流中的數據信息。框架
GET參數列表對於數字基本類型和包裝類型均可接收,可是若前端並沒傳這個數字,那麼包裝類型能夠在代碼裏判空,異常處理就好,可是基本類型是不能判空的,因此對於數字首選包裝類型。post
@RequestMapping(value = "/",method = RequestMethod.GET) @ResponseBody private ResInfo test(String name,String password){ return new ResInfo(200,"登陸成功: "+name+" "+password); }
PostMan接收測試
{ "code": 200, "msg": "登陸成功: haha miaomiao" }
兩種表單的請求Java接口均可以這樣寫。
@RequestMapping(value = "/",method = RequestMethod.POST) @ResponseBody private ResInfo test(String name,String password){ return new ResInfo(200,"登陸成功: "+name+" "+password); }
若表單中要上傳文件,則文件項該用註解寫名稱,參數名均可用@RequestParam替代。只有form-data能夠接收文件。
@RequestMapping(value = "/",method = RequestMethod.POST) @ResponseBody private ResInfo test(String name,String password,@RequestParam("profile") MultipartFile multipartFile){ String fileName = multipartFile.getOriginalFilename(); return new ResInfo(200,"登陸成功: "+name+" "+password+"文件名:"+fileName); }
Postman響應
{ "code": 200, "msg": "登陸成功: haha miaomiao文件名:profile.jpg" }
class User { public String name; public String password; public User() { } //若重寫了構造方法,必定要寫上空構造方法,不然spring不能new新對象以接收json public User(String name, String password) { this.name = name; this.password = password; } } @RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody private ResInfo test(@RequestBody User user) { return new ResInfo(200, "登陸成功: " + user.name + " " + user.password); }
Postman響應
{ "code": 200, "msg": "登陸成功: haha miaomiao" }
思想:把json對象放在body中,把單個值放在url參數列表中,因此構造請求時url和body兩部分都要構造。
@RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody private ResInfo test(@RequestBody User user, String msg) { return new ResInfo(200, "登陸成功: " + user.name + " " + user.password + "msg:" + msg); }
Postman響應
{ "code": 200, "msg": "登陸成功: haha miaomiaomsg:hello, my name is msg !" }
至此完成了從HTTP構造到spring對接口解析的總結與梳理,歡迎你們指正。