GET,POST與後端接口詳記

前言

HTTP通訊的7種方式

在HTTP通訊中主要分爲GET和POST。如PUT,DELETE是類POST的傳輸方式,與POST沒有實質區別。OPTION是查看服務器支持的請求方法。HEAD是測試服務器的該資源狀況,不返回實體的主體部分。TRACE請求能夠獲取回服務器接收到的該請求的原始報文,從而判斷路徑中的代理和防火牆是否對該條請求進行修改。前端

HTTP請求報文發送格式不因請求方式不一樣而改變

  1. HTTP報文格式以下
<請求方法> <請求路徑> <協議版本>
<請求頭>

<主體body>
  1. 不管用任何請求方法,均可以發送這樣的請求報文,報文結構是HTTP的協議規範,請求方法只是告訴服務器如何來看待這條請求。由於在有些文章中會提到GET請求不能傳body數據,而真實的狀況是有些服務端框架接收到GET請求後會自動將GET請求的body部分丟棄,因此你們要注意。因此爲了規範,你們在使用GET請求時仍是不要將請求數據放在body中。

什麼時候用GET請求

爲了規範,使用GET請求時就不要在主體body中放數據了,避免沒必要要的錯誤。因此請求中的數據是放在URL上的。java

  1. 瀏覽器網址欄和頁面跳轉。
  2. 爲了獲取信息且不須要傳大量條件信息的接口。

例如用GET作登陸請求spring

GET /online/test/?name=haha&amp; 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請求

post請求能夠在body中傳送大量信息json

以上傳name=haha,password=miaomiao爲例,查看不一樣body數據格式瀏覽器

form-data(表單,能夠傳文件)

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--
  1. 其中表單的每一項都有Content-Disposition描述。
  2. ------WebKitFormBoundary7MA4YWxkTrZu0gW--是隨機生成的分隔標記

x-www-form-urlencoded(也是表單,但不能夠傳文件)

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
  1. 由於不用傳文件,因此不用單獨描述,將表單信息拼湊在一塊兒就能夠了。
  2. application/x-www-form-urlencoded: 窗體數據被編碼爲名稱/值對。這是標準的編碼格式。
  3. multipart/form-data: 窗體數據被編碼爲一條消息,頁上的每一個控件對應消息中的一個部分。

raw(text,json,xml...)(其它文本格式)

以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--

binary(二進制)

用做傳輸文件,包括前面的form-data上傳文件,文件都是以必定的編碼方式寫在body中的,在服務器端獲取該請求的輸入流後,便可按行接收流中的數據信息。框架

在Spring Boot中接口的接收數據總結

URL接收

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"
}

接收json對象

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對象和單個值混合接收

思想:把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對接口解析的總結與梳理,歡迎你們指正。

相關文章
相關標籤/搜索