首先聲明,本文并不對HTTP做專業的解釋與說明,因為網上肯定有很多專業的解釋與說明。解釋專業,本文盡量嘗試以不那么專業的方式去解釋HTTP,并且最重要的是在Cocos Creator中快速實現并且使用。
對于初學者來說,認為HTTP很復雜,不知道是什么協議。專業名詞為超文本傳輸協議(Hyper Text Transfer Protocol,HTTP),專業解釋是一個簡單的請求-響應協議。通常情況下,HTTP是一個短連接,就是當你向HTTP服務器的指定URL發送一個請求之后,HTTP服務器會返回給你數據,當你收完數據之后,通訊就結束了,這樣就完成了一次HTTP通訊。例如下載一個文件,提交一個表單等等。不像TCP協議,HTTP協議的連接通常(不是所有)是一個短連接,它主要包含三個要素:一個URL地址、一個請求(HttpRequest)、一個回應(HttpResponse)。
Http頭 (Http Header)
HTTP的請求數據包(HttpRequest)和回應數據包(HttpResponse)都包含一個類似于鍵值對的數據,這部分稱為HTTP頭(HeaderFields),可以將這部分的數據類型理解為C++的map
Http Body
Http Body是數據本身,也是最重要的部分,你可以簡單理解為數據正文。Http Body既可以存在于請求中,也可以存在于回應中。
Http狀態碼(Status Code)
HTTP狀態碼存在于回應包中,用來描述服務器處理的結果。通常狀態碼200代表服務器處理正常,這種狀態下的Body數據應該才是想要得到的數據。不同的狀態碼有不同的含義,可以在網上查詢,不做過多解釋。
Http請求模式(Method)
較常見的兩種HTTP請求模式(Method)為GET模式和POST模式。它們的主要區別在于,GET模式的Body數據是空的,POST模式的Body數據不為空。如果我們向一個HTTP地址發送請求時,需要附加額外的數據,那么可以使用POST模式,否則使用GET模式就行了。
Cocos Creator需要實現什么
其實在游戲開發中,一般來說只需要實現GET模式和POST模式的幾種數據格式的協議請求就行了。下面實現幾個重要函數:
以GET方式向一個URL請求,返回一個字符串,結果以異步回調的方式返回:
export function getString(url: string, callback: (statusCode: number, resp: string, respText: string) => any): {
let xhr = new ();
xhr.open("GET", url);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
let resp: string = xhr.responseText;
callback && callback(xhr.status, resp, xhr.responseText);
}
};
xhr. = function (err) {
callback && callback(-1, "", "Network error");
};
xhr.send();
return xhr;
}
以GET方式向一個URL請求,返回一個JSON數據,結果以異步的方式返回:
export function getJson(url: string, callback: (statusCode: number, resp: object | null, respText: string) => any): {
let xhr = new ();
xhr.open("GET", url);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
let resp = null;
try {
if (xhr.responseText != "") {
resp = JSON.parse(xhr.responseText);
}
}
catch (e) {
}
callback && callback(xhr.status, resp, xhr.responseText);
}
};
xhr. = function (err) {
callback && callback(-1, null, "Network error");
};
xhr.send();
return xhr;
}
以POST方式向一個URL請求,返回一個JSON數據,結果以異步的方式返回:
export function postJson(url: string, data: object | string, callback: (statusCode: number, resp: object | null, respText: string) => any): {
let xhr = new ();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "applicationjson;charset=utf-8");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
let resp = null;
try {
if (xhr.responseText != "") {
resp = JSON.parse(xhr.responseText);
}
}
catch (e) {
}
callback && callback(xhr.status, resp, xhr.responseText);
}
};
xhr. = function (err) {
callback && callback(-1, null, "Network error");
};
var text = typeof (data) == "string" ? data :JSON.stringify(data);
xhr.send(text);
return xhr;
}
總結
有了以上幾個函數之后,游戲中的大多數HTTP協議都能夠應對了。
責任編輯:Rex_08