重慶南川網站制作公司哪家專業(yè)sem搜索引擎營銷
首先,前端請求后端數(shù)據(jù),后端響應數(shù)據(jù)給前端,這是我們大家都知道的,那其中所涉及到的數(shù)據(jù)傳輸協(xié)議又是什么呢?這個傳輸規(guī)范就是我們大名鼎鼎的HTTP協(xié)議!
什么是HTTP協(xié)議?
HTTP(超文本傳輸協(xié)議)是一種用于在計算機網絡上發(fā)送和接收超文本資源的應用層協(xié)議。它是在Web應用程序之間傳輸數(shù)據(jù)的一種規(guī)范。HTTP的設計目的是實現(xiàn)客戶端和服務器之間的通信和數(shù)據(jù)交換。
HTTP協(xié)議使用簡單的請求-響應模型來傳輸數(shù)據(jù)??蛻舳税l(fā)送HTTP請求到服務器,服務器根據(jù)請求作出相應并返回HTTP響應。請求和響應的內容可以是文本、HTML、XML、JSON等格式的數(shù)據(jù)。
HTTP協(xié)議的特點包括:
1. 無連接:每個請求-響應交互都是獨立的,服務器不會保持與客戶端之間的持久連接。每個請求都需要建立一個新的連接。這使得HTTP協(xié)議具有輕量級和靈活性,但也會增加一些額外的開銷。
2. 無狀態(tài):HTTP協(xié)議是無狀態(tài)的,服務器不會記錄之前的通信狀態(tài)。每個請求都是相互獨立的,服務器無法感知到之前的請求。這要求服務端在處理請求時,對前后請求之間的上下文和狀態(tài)進行管理。
3. 可擴展:HTTP協(xié)議支持開發(fā)者擴展協(xié)議功能。通過使用頭部字段來傳遞各種參數(shù)和元數(shù)據(jù),開發(fā)者可以自定義和擴展協(xié)議的行為。
先來一個簡單的示例,創(chuàng)建springboot工程之后,加入以下代碼片段:
@RestController
public class SpringbootFirstTest {//設置請求的地址@RequestMapping("/helloTest")public String getAddress(){System.out.println("hello world!");return "hello world!";}
}
說明:
@RestController= @Controller + @ResponseBody
@ResponseBody注解是作用于類的返回對象
????????● 類型:屬于方法注解、類注解
????????● 位置:書寫在Controller方法上或類上
????????● 作用:將方法返回值直接響應給瀏覽器,且如果返回值類型是實體對象/集合,將會轉換為JSON格式后在響應給瀏覽器?,所以這里特別注意如果返回值不是實體類對象/集合的話,是不會轉換成json格式的!
Springboot的服務啟動之后,我們來到瀏覽器找到本地8080端口下,對請求路徑發(fā)起請求得到如下的圖?
@RestController
public class SpringbootFirstTest {//設置請求的地址@RequestMapping("/helloTest")public Set<Object> getAddress(){System.out.println("hello world!");Set<Object> set = new HashSet<>();set.add(1);set.add(2);set.add(3);return set;}
}
這里我的瀏覽器安裝了對應的json格式解析插件?
HTTP協(xié)議又分為:請求協(xié)議和響應協(xié)議
● 請求協(xié)議:瀏覽器將數(shù)據(jù)以請求格式發(fā)送到服務器
????????● 包括:**請求行**、**請求頭** 、**請求體**
● 響應協(xié)議:服務器將數(shù)據(jù)以響應格式返回給瀏覽器
????????● 包括:**響應行** 、**響應頭** 、**響應體**?
打開開發(fā)者工具(右鍵檢查或則F12快捷鍵),每點擊一次刷新,瀏覽器都會重新發(fā)起一個網絡請求,框起來的部分即就是我們HTTP的固定格式,可以看出http無論是請求還是響應都是以Key、Value的形式進行展示
先看常規(guī):
這里邊需要關注的是請求的網址、方法、狀態(tài)代碼,請求的網址在前后端開發(fā)的時候必須遵守,要不然找不到對應的資源;方法即代表當前所請求的類型,待會兒會著重梳理一下,這里有一個非常重要的知識——狀態(tài)碼,狀態(tài)碼是鑒別本次請求響應,返回結果的一種體現(xiàn):
狀態(tài)碼 | 說明 |
---|---|
1xx | 信息性狀態(tài)碼,表示請求被接收并繼續(xù)處理。 |
2xx | 成功狀態(tài)碼,表示請求被成功接收、理解和處理。 |
3xx | 重定向狀態(tài)碼,表示資源位置發(fā)生變化,需要進一步處理。 |
4xx | 客戶端錯誤狀態(tài)碼,表示請求包含錯誤或無法完成請求。 |
5xx | 服務器錯誤狀態(tài)碼,表示服務器無法完成合法請求。 |
瀏覽器向服務器發(fā)起請求:
可以看到,在請求行中,有一個GET,而他代表的就是瀏覽器所發(fā)起請求的方式,那么請求方式有哪些呢?
請求方式???????? | 請求說明 |
---|---|
GET???????? | 獲取資源:向特定的資源發(fā)起請求 |
POST | 傳輸實體主體:向指定資源提交數(shù)據(jù)進行處理請求,常見的就是上傳的操作,數(shù)據(jù)被包含在請求體中 |
PUT | PUT方法用來傳輸文件。類似FTP協(xié)議,文件內容包含在請求報文的實體中,然后請求保存到URL指定的服務器位置。 |
DELETE | 刪除文件:請求服務器刪除Request-URL所標識的資源 |
CONNECT | 用求用隧道協(xié)議連接代理,HTTP/1.1協(xié)議中預留給能夠將連接改為管道方式的代理服務器 |
OPTIONS | 返回服務器針對特定資源所支持的HTTP請求方式。因為并不是所有的服務器都支持規(guī)定的方法,為了安全有些服務器可能會禁止掉一些方法,例如:DELETE、PUT等。那么OPTIONS就是用來詢問服務器支持的方法。 |
HEAD | HEAD方法類似GET方法,但是不同的是HEAD方法不要求返回數(shù)據(jù)。通常用于確認URI的有效性及資源更新時間等。 |
請求的常用配置詳解:
請求行:
????????HTTP請求中的第一行數(shù)據(jù)。由: 請求方式 、 資源路徑 、 協(xié)議/版本 組成(之間使用空格分隔)
● 請求方式:GET
● 資源路徑:/brand/findAll?name=OPPO&status=1
● 請求路徑:/brand/findAll
● 請求參數(shù):name=OPPO&status=1
● 請求參數(shù)是以key=value形式出現(xiàn)
● 多個請求參數(shù)之間使用 & 連接
● 請求路徑和請求參數(shù)之間使用 ? 連接
● 協(xié)議/版本:HTTP/1.1請求頭:
1. Accept:指定客戶端可接受的媒體類型,可以用來告訴服務器返回特定類型的內容。例如:Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp
2. Content-Type:指定請求體(Request Body)的媒體類型。常見的有 application/json、application/x-www-form-urlencoded、multipart/form-data等。
例如:Content-Type: application/json,這里在Springboot工程中,如果不確定是否使用@Requstbody注解,通常項目開發(fā)中會約定數(shù)據(jù)的傳輸格式,如果不確定是否使用json時,可以根據(jù)網絡請求體的媒體類型來決定要不要將json數(shù)據(jù)封裝成為對象。如果盲目使用@Requstbody可能會造成以下的異常:
HttpMessageNotReadableException: Required request body is missing
3. User-Agent:標識發(fā)起請求的客戶端應用程序的軟件和版本信息。通常用于統(tǒng)計和識別用戶代理。例如:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36
4. Authorization:用于在請求中發(fā)送認證憑據(jù),通常用于身份驗證。例如:Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
5. Cookie:用于在請求中發(fā)送存儲在客戶端的 Cookie 數(shù)據(jù)。例如:Cookie: sessionId=abc123; userId=12345
6. Referer:指定請求的來源頁面的 URL,用于一些安全策略和數(shù)據(jù)分析。例如:Referer: https://www.example.com/page1.html
7. Cache-Control:指定緩存機制和緩存策略。例如:Cache-Control: no-cache
8. If-None-Match:用于實現(xiàn)緩存驗證機制,服務器會根據(jù)請求頭中的 ETag 值判斷資源是否需要重新發(fā)送。例如:If-None-Match: "686897696a7c876b7e"
9.?Accept-Encoding: 支持的壓縮類型,如:gzip, deflate, br?
10.sec-fetch/ch- ?代表
sec-ch-ua:瀏覽器信息
sec-ch-ua-mobile:是否為移動設備
sec-ch-ua-platform:平臺
sec-fetch-dest:表示請求的目的,期望需要什么樣的資源
sec-fetch-mode:表明了一個請求的模式
????????request:一個瀏覽器的頁面切換請求
????????navigate:僅在瀏覽器切換頁面時創(chuàng)建,該請求應該返回HTML
sec-getch-site:一個請求發(fā)起者的來源與目標資源之間的關系,如果用戶直接觸發(fā)頁面導航,例如在瀏覽器地址中輸入地址,點擊書簽跳轉等,就會設置為none
sec-getc-user:取值是一個Boolean類型的值
? ? ? ? true(?1):表示導航請求由用戶激活觸發(fā)(鼠標點擊/鍵盤)
? ? ? ? false(?0):表示導航請求由用戶激活以外的原因觸發(fā)
upgrade-Insecure-requests:升級不安全的連接
? ? ? ? 在https頁面中,如果調用了http資源,那么瀏覽器就會拋出以下錯誤,為了改變這一狀況,chrome(谷歌瀏覽器)會在http請求中加入‘Upgrade-Insecure-requests:1’,服務器收到請求后會返回 "Content-Security-Policy: upgrade-insecure-requests" 頭,告訴瀏覽器,可以把所屬本站的所有http 連接升級為 https 連接
服務器向瀏覽器響應數(shù)據(jù):
?響應常用配置詳解:
響應行:
請求行(以上圖中紅色部分):包含請求方式、資源路徑、協(xié)議/版本
● 請求方式:POST
● 資源路徑:/brand
● 協(xié)議/版本:HTTP/1.1?響應頭:
1. Content-Type:指定響應體(Response Body)的媒體類型。常見的有 text/html、application/json、image/jpeg 等。例如:Content-Type: application/json
2. Content-Length:指定響應體的內容長度,以字節(jié)為單位。例如:Content-Length: 1024
3. Cache-Control:指定緩存機制和緩存策略??梢钥刂瓶蛻舳撕椭虚g緩存服務器對響應內容進行緩存的方式。例如:Cache-Control: max-age=3600, public
4. Expires:指定響應的過期時間,告訴客戶端該資源的有效期截止時間。例如:Expires: Wed, 01 Feb 2024 12:00:00 GMT
5. Last-Modified:指定響應資源的最后修改時間,用于實現(xiàn)緩存驗證機制。例如:Last-Modified: Fri, 24 Jan 2024 10:00:00 GMT
6. ETag:指定響應資源的唯一標識符,也用于實現(xiàn)緩存驗證機制。例如:ETag: "686897696a7c876b7e"
7. Set-Cookie:用于在響應中設置客戶端的 Cookie 數(shù)據(jù)。例如:Set-Cookie: sessionId=abc123; Max-Age=3600; Path=/
8. Access-Control-Allow-Origin:用于允許跨域訪問的源,設置為 * 表示允許所有域名跨域。例如:Access-Control-Allow-Origin: *
兩者有什么區(qū)別?
區(qū)別方式 | ?GET請求 | POST請求 |
請求參數(shù) | GET的請求參數(shù)在請求行中就有所體現(xiàn),在上邊請求配置詳解中有提到,例:/brand/findAll? name=OPPO&status=1 | 請求參數(shù)在請求體中 |
請求長度 | 請求參數(shù)長度有限制(瀏覽器不同限制也不同) | 請求參數(shù)長度沒有限制 |
安全性 | 安全性低。原因:請求參數(shù)暴露在瀏覽器地址欄中。 | 安全性相對高 |