HTTP 為一個通信協(xié)議。HTTP 客戶端發(fā)起請求并創(chuàng)建端口。HTTP 服務器在端口監(jiān)聽客戶端的請求。 HTTP 服務器在收到請求后則返回狀態(tài)和所請求的內容。
網頁瀏覽全過程 (粗淺流程)
/etc/hosts
)其中包括主機地址,HTTP 協(xié)議版本號。頭部由鍵值對組成。因為此請求為 GET 方法所以請求體為空。
其中包括 HTTP 版本號,狀態(tài)碼及狀態(tài)碼描述。頭部依然為鍵值對組成。主體則為 HTML 文件。
常用方法
方法 | 描述 | 是否包含主題 |
---|---|---|
GET | 從服務器獲取一份文檔 | 否 |
POST | 向服務器發(fā)送需要處理的數(shù)據 | 是 |
PUT | 將請求的主題部分儲存在服務器上 | 是 |
DELETE | 從服務器刪除一份文檔 | 否 |
不常用方法
方法 | 描述 | 是否包含主題 |
---|---|---|
HEAD | 只從服務器獲取頭文檔的首部 | 否 |
TRACE | 對可能經過代理服務器傳送到服務器上的報文進行追蹤 | 否 |
OPTIONS | 決定可以在服務器上執(zhí)行的方法 | 否 |
http://www.github.com:8080/index.html?user=li-xinyang&lang=zh-CN#home
| | | | | |
protocol | | | | |
hostname port | | |
\ / pathname search hash
host
可選部分包括:
NOTE:上面提供的 URL 地址僅為參考所用。
NOTE:此文寫于2015年6月。
狀態(tài)碼 | 描述 | 代碼描述 |
---|---|---|
200 | 請求成功,一般用于 GET 和 POST 方法 | OK |
301 | 資源移動。所請求資源自動到新的 URL,瀏覽器自動跳轉至新的 URL | Moved Permanently |
304 | 未修改。所請求資源未修改,瀏覽器讀取緩存數(shù)據 | Not Modified |
400 | 請求語法錯誤,服務器無法解析 | Bad Request |
404 | 未找到資源,可以設置個性“404頁面” | Not Found |
500 | 服務器內部錯誤 | Internal Server Error |
AJAX(Asynchronous JavaScript and HTML)異步獲取數(shù)據的概念,由 Jesse James Garrett 在2005年提出。
AJAX 請求全過程
三部完成 AJAX 調用
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(callback) {
if (xhr.readyState === 4) {
if ((xhr.status >== 200 && xhr.status < 300) || xhr.status === 304) {
callback(xhr.responseText);
} else {
console.error('Request was unsuccessful: ' + xhr.status);
}
}
}
xhr.open('get', 'exmaple.json', true);
xhr.setRequestHeader('myHeader', 'myValue');
xhr.send(null);
NOTE:xhr.onload
只針對當 readyState === 4
和 status === 200
時的事件。
xhr.open(method, url[, async = true]);
method
為上面說過的 HTTP 方法(例如,GET、POST)url
為資源地址async
默認為真,用于設置異步請求xhr.setRequestHeader('myHeader', 'myValue');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
用于設置頭部的鍵值對。
xhr.send([data=null]);
xhr.send()
數(shù)據可包含字符串或表單數(shù)控,但需要提前為 RequestHeader 做設置。
將查詢參數(shù)使用字符串,跟入資源地址中。
xhr.open('get', 'example.json?' + 'name=value&age=value', true);
對象轉換字符串的函數(shù)實現(xiàn)
function serialize(data) {
if (!data) return '';
var pairs = [];
for (var name in data) {
if (!data.hasOwnProperty(name)) continue;
if (typeof data[name] === 'function') continue;
var value = data[name].toString();
name = encodeURIComponent(name);
value = encodeURIComponent(value);
pairs.push(name + '=' + value);
}
return pairs.join('&');
}
GET 請求
var url = 'example.json?' + serialize(formData);
xhr.open('get', url, true);
xhr.send(null);
POST 請求
查詢參數(shù)需要作為 send()
的存數(shù)傳入。
xhr.open('get', 'example.json', true);
xhr.send(serialize(formData));
兩個頁面擁有相同的協(xié)議(Protocol)、端口(Port)、和主機(host)那么這兩個頁面就是屬于同一個源(Origin)。
http://www.github.com:8080/index.html?user=li-xinyang&lang=zh-CN#home
| | | | | |
protocol | | | | |
hostname port | | |
\ / pathname search hash
host
|-----完全一致則同源------|
不滿足同源策略的資源訪問均屬于跨域資源訪問,W3C 定義了 CORS?,F(xiàn)代瀏覽器已經實現(xiàn)了 CORS 的支持。
CORS 原理實現(xiàn)圖
Frame 代理
關于 Frame 代理的更多內容在這里。
優(yōu)點:
缺點:
JSONP
全程為 JSON with Padding(填充式 JSON),它利用 <script>
可以跨域的原理。請求一段 JavaScript 代碼,然后執(zhí)行 JavaScript 代碼來實現(xiàn)跨域。
function handleResponse(response) {
alert(response.name);
}
var script = document.createElement('script');
script.src = 'http://localhost:3000/json?callback=handleResponse';
document.body.insertBefore(script, document.body.firstChild);
更多建議: