一、HTTP請求
HTTP即超文本傳輸協議,用以進行HTML 文件、 圖片文件、 查詢結果等的網絡傳輸。
- 一個完整的HTTP請求包括:請求行、請求頭、空行和請求數據(請求數據可以為空)
- HTTP1.1標准請求方式有:GET, POST, PUT, HEAD, DELETE, CONNECT, TRACE, OPTIONS
請求行和請求頭里包含URL、Request Method、Accept、Cookie、User Agent等等信息。實際使用中,即使只確定一個url,客戶端也會發出完整的HTTP請求。服務端也會返回HTTP響應,包含響應正文以及Status Code、Content Type、Date等等信息。其中狀態碼(Status Code)常見的有:
- 200 請求成功
- 400 客戶端請求的語法錯誤,服務器無法理解
- 401 權限錯誤,身份認證失敗
- 404 請求的資源(網頁等)不存在
- 500 內部服務器錯誤
二、Ajax
原始的網頁開發方式是前后端合一的,代碼寫在一起,我請求一個地址,服務器就以相應正文的形式返回給我一個頁面。Ajax的出現就改變了這一現象,我們可以借此獲取所需的特定數據,在不重載整個頁面的情況下進行數據更新。
var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest();// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼 } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");// IE6, IE5 瀏覽器執行代碼 } xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById("myDiv").innerHTML = xmlhttp.responseText; } } xmlhttp.open("GET", "/try/ajax/ajax_info.txt", true); xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlhttp.send(fname=Henry&lname=Ford);
如上例所示,Ajax中最重要的就是XMLHttpRequest對象,它以多種屬性和方法來定義HTTP請求、處理HTTP響應:
- open() -- 定義請求方式、URL、是否異步
- setRequestHeader() -- 添加請求頭信息
- send() -- 發送請求,可附加請求數據
- onreadystatechange() -- readyState改變時觸發
- readyState -- 標記請求狀態,從 0 到 4 (請求未初始化-服務器連接已建立-請求已接收-請求處理中-請求已完成,且響應已就緒)
- status -- 響應的Status Code,200、404等等
- responseText/responseXML -- 響應正文,字符串或xml形式的數據
三、RESTful API
REST(REpresentational State Transfer)指的是一組架構約束條件和原則。滿足REST的接口實現方式,就是RESTful API,表現為:用URL定位資源,用HTTP動詞(GET,POST,DELETE,DETC)描述操作。
URL中只使用名詞來指定資源,原則上不使用動詞。“資源”是REST架構或者說整個網絡處理的核心。用HTTP協議里的動詞來實現資源的添加,修改,刪除等操作。即通過HTTP動詞來實現資源的狀態扭轉:
- GET 獲取資源數據(一項或多項)
- POST 新建一個資源
- PUT 更新資源(提供完整資源數據)
- PATCH 更新資源(提供需要修改的資源數據)
- DELETE 刪除資源
網上教程在解說ajax的時候,通常會比較GET和POST,而RESTful API依據功能規范了多種請求方式,其中PATCH並不在HTTP1.1標准請求方式中。前端要使用這些請求方式,首先瀏覽器要支持,其次服務端也要實現對應功能,進行正確的響應。假設http://api.xx.com/v1/friends是一個“我的好友”數據接口:
- DELETE http://api.xx.com/v1/friends 刪除某個好友(在http參數中指定好友id)
- PATCH http://api.xx.com/v1/friends 添加某個好友(在http參數中附加改好友數據)
- PUT http://api.xx.com/v1/friends 更新個人好友數據(在http參數中附加所有好友數據)
RESTful API擴展了前后端的工作方式,Web端不再用之前典型的PHP或JSP架構,而是改為前端渲染和附帶處理簡單邏輯(比如AngularJS或者BackBone的一些樣例)。Web端和服務端只使用API來傳遞數據和改變數據狀態。格式一般是JSON。由此,Web,iOS,Android和第三方開發者變為平等的角色通過一套API來與服務端交互。
四、$.ajax實踐RESTful API
$.ajax提供了一些很實用的屬性設置:
- url :規定發送請求的 URL。默認是當前頁面
- type :規定請求方式,默認GET
- data :規定要發送到服務器的數據
- contentType :發送數據到服務器時所使用的內容類型
- dataType :預期服務器返回的數據類型。默認根據 HTTP 包 MIME 信息來智能判斷
回想下一個完整的HTTP請求包括那些東西呢?type設置的就是HTTP請求的Request Method,即請求方式、HTTP動詞;date包含的就是請求數據,contentType/dataType即請求頭中的Content-Type和Accept。對於ajax而言,應該還要設置請求成功和失敗后對應的回調函數。注意,當設置"application/json"時,需要對傳遞的數據做JSON.stringify處理
var newFriend = { name : "aaa", age : 18 }; var config = { url: "/api/vi/friend", type: "PATCH", data: JSON.stringify(newFriend), contentType: "application/json", dataType: "json", success: function(data){ console.log(data) }, error: function(err){ console.log("請求失敗:"+err) } }; $.ajax(config);