HTTP三點注意事項:
- HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答後,即斷開連接。採用這種方式可以節省傳輸時間。
- HTTP是媒體獨立的這意味着,只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
- HTTP是無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果後續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
https://www.runoob.com/http/http-intro.html
HTTP 協議的 9 種請求類型介紹
GET
:請求指定的頁面信息,並返回實體主體。POST
:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件),傳輸實體主體。數據被包含在請求體中。POST請求可能會導致新的資源的創建和/或已有資源的修改。PUT
:向指定資源位置上傳其最新內容;PUT 方法用來傳輸文件。就像 FTP 協議的文件上傳一樣,要求在請求報文的主體中包含文件內容,然後保存到請求 URI 指定的位置。OPTIONS
:詢問支持的方法。返回服務器針對特定資源所支持的HTTP請求方法。也可以利用向Web服務器發送’*'的請求來測試服務器的功能性。HEAD
:獲得報文首部。類似於 GET 請求,只不過返回的響應中沒有具體的內容,用於獲取報頭。這一方法可以在不必傳輸整個響應內容的情況下,就可以獲取包含在響應消息頭中的元信息。DELETE
:刪除文件。請求服務器刪除指定的頁面,是與 PUT 相反的方法。TRACE
:追蹤路徑。回顯服務器收到的請求,主要用於測試或診斷。CONNECT
:要求用隧道協議連接代理。HTTP/1.1 協議中預留給能夠將連接改爲管道方式的代理服務器。PATCH
:是對 PUT 方法的補充,用來對已知資源進行局部更新 。
控制檯的network裏出現兩次相同請求
https://www.cnblogs.com/bradwarden/p/11505999.html
Options請求出現的情況有兩種:
1、獲取後臺服務器支持的HTTP的通信方式
2、對跨域請求進行preflight request(預檢請求)。
預檢請求首先需要向另外一個域名的資源發送一個Http Options的請求頭,以檢測實際發送的請求是否是安全的。options請求是瀏覽器自發起的preflight request(預檢請求)。
preflight request請求報文中有兩個需要關注的首部字段:
(1)Access-Control-Request-Method:告知服務器實際請求所使用的HTTP方法;
(2)Access-Control-Request-Headers:告知服務器實際請求所攜帶的自定義首部字段。
同時服務器也會添加origin header,告知服務器實際請求的客戶端的地址。服務器基於從預檢請求獲得的信息來判斷,是否接受接下來的實際請求。
服務器所返回的Access-Control-Allow-Methods首部字段將所有允許的請求方法告知客戶端,返回將所有Access-Control-Request-Headers首部字段將所有允許的自定義首部字段告知客戶端。此外,服務器端可返回Access-Control-Max-Age首部字段,允許瀏覽器在指定時間內,無需再發送預檢請求,直接用本次結果即可。
在我們開發過程中出現的瀏覽器自發起的options請求就是上面的第二種情況。實際上,跨域請求中的”複雜請求”發出前會進行一次方法是options的preflight request。
二、當跨域請求是簡單請求時不會進行preflight request,只有複雜請求才會進行preflight request。
跨域請求分兩種:簡單請求、複雜請求;
符合以下任一情況的就是複雜請求:
1.使用方法put/delete/patch/post;
2.發送json格式的數據(content-type: application/json)
3.請求中帶有自定義頭部;
其他情況則可理解爲是簡單請求。
爲什麼跨域的複雜請求需要preflight request?
複雜請求可能對服務器數據產生副作用。例如delete或者put,都會對服務器數據進行修改,所以在請求之前都要先詢問服務器,當前網頁所在域名是否在服務器的許可名單中,服務器允許後,瀏覽器纔會發出正式的請求,否則不發送正式請求。