面試常見問題(get與post的區別,http常用狀態碼,跨域條件及解決方案)
1.get與post的區別,什麼時候使用post?
1.get和post在HTTP中都代表着請求數據,其中get請求相對來說更簡單、快速,效率高些
2.get相對post安全性低
3.get有緩存,post沒有
4.get體積小,post可以無限大
5.get的url參數可見,post不可見
6.get只接受ASCII字符的參數數據類型,post沒有限制
7.get請求參數會保留歷史記錄,post中參數不會保留
8.get會被瀏覽器主動catch,post不會,需要手動設置
9.get在瀏覽器回退時無害,post會再次提交請求
10.post一般用於修改服務器上的資源,對所發送的信息沒有限制。比如
1. 無法使用緩存文件(更新服務器上的文件或數據庫)
2. 向服務器發送大量數據(POST 沒有數據量限制)
3. 發送包含未知字符的用戶輸入時,POST 比 GET 更穩定也更可靠
2.http常用狀態碼
狀態碼 狀態碼英文名稱 中文描述
200 OK 請求成功。一般用於GET與POST請求
301 Moved Permanently 永久重定向。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替301 和 302 共同點: 就是用戶都可以看到url替換爲了一個新的,然後發出請求。
302 Found 臨時重定向。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
303 See Other 查看其它地址。與301類似。使用GET和POST請求查看
304 Not Modified 未修改。所請求的資源未修改,服務器返回此狀態碼時,不會返回任何資源。客戶端通常會緩存訪問過的資源,通過提供一個頭信息指出客戶端希望只返回在指定日期之後修改的資源
400 Bad Request 客戶端請求的語法錯誤,服務器無法理解
401 Unauthorized 請求要求用戶的身份認證
402 Payment Required 保留,將來使用
403 Forbidden 服務器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found 服務器無法根據客戶端的請求找到資源(網頁)。通過此代碼,網站設計人員可設置"您所請求的資源無法找到"的個性頁面
405 Method Not Allowed 客戶端請求中的方法被禁止
500 Internal Server Error 服務器內部錯誤,無法完成請求
501 Not Implemented 服務器不支持請求的功能,無法完成請求
502 Bad Gateway 充當網關或代理的服務器,從遠端服務器接收到了一個無效的請求
503 Service Unavailable 由於超載或系統維護,服務器暫時的無法處理客戶端的請求。延時的長度可包含在服務器的Retry-After頭信息中
504 Gateway Time-out 充當網關或代理的服務器,未及時從遠端服務器獲取請求
505 HTTP Version not supported 服務器不支持請求的HTTP協議的版本,無法完成處理
3.跨域
- 跨域的條件:同源策略(協議 域名 端口 三者)三者任一不同就爲跨域
- 跨域的解決方案
- jsonp (json padding) (callback({a: 1, b: 2})) 前端定義好這個函數的業務邏輯,利用script標籤可以引入任意外部的資源
- cors(跨站資源共享)
- 在使用時前端正常發起異步請求,後端需要設置允許的請求頭 請求方法 請求域名
- access-control-allow-origin: 設置請求域名/主機
- access-control-allow-headers: 設置請求頭
- access-control-allow-methods: 設置請求方法
- 什麼是預檢請求 options類型,什麼情況下發起預檢請求
- 簡單請求不需要發起預檢,直接傳輸數據到後臺
- 請求方法:get post head
- 請求頭:accept accept-lunguage content-type content-length last-eventID
- 發送請求的數據格式:text/plain application/x-www-form-urlencoded multipart/form-data
- 非簡單請求需要先進行預檢,如果後臺支持的話再攜帶數據發起請求到後臺
- 簡單請求不需要發起預檢,直接傳輸數據到後臺
- 在使用時前端正常發起異步請求,後端需要設置允許的請求頭 請求方法 請求域名
- 反向代理(客戶端 => 網頁服務器(nginx) => node.js / PHP / java / python)
- 如果代理服務器代理的是後臺的處理程序,那就是反向代理。當前頁面www.a.com,想請求一個接口www.b.com/api/test,此時網頁正常發起請求www.a.com/api/test到達網頁服務器nginx,nginx此時收到請求,重置請求域名到www.b.com下的接口地址上,當真正的接口數據返回後,nginx再把數據返回給前端(前端 => 開發服務器8080 => 8888)
- iframe + window.name / window.hash
- 比如當前頁面1www.a.com/abc,請求的接口地址www.b.com/api/test。在頁面1下內嵌一個iframe,iframe的src屬性賦值www.b.com/abc頁面2,在頁面2中發起異步請求,拿到數據後寫在window.name或者window.hash,重置iframe的src屬性(更改頁面地址),更改到a域名下的一個頁面 3,頁面3和頁面2是同一個窗口,所以頁面3能夠取到頁面2寫在window.name或者window.hash的數據
- onMessage和postMessage: IE6 7不支持,ie8支持部分內容
- document.domain: 僅適用主域相同跨子域的情況. 頁面位於www.a.com下,請求的接口位於api.a.com