【嘮叨】
HTTP用於客戶端終端(用戶)與服務器(WEB)之間的數據通訊。
若菜不懂WEB,也不會服務端開發。所以在這裏只能講講客戶端如果使用http連接WEB服務器了。
常見的WEB服務器有PHP、JSP、ASP等。
Cocos爲我們封裝了HTTP客戶端的接口:HttpClient類。HttpClient封裝了各種對象,處理cookies,身份認證,連接管理等。
【參考】
http://blog.csdn.net/jackystudio/article/details/17347069 (弱聯網與服務器的通訊)
【Demo下載】
https://github.com/shahdza/Cocos_LearningTest/tree/master/HttpClient
【HTTP簡介】
Wiki百科 :http://zh.m.wikipedia.org/wiki/Http
超文本傳輸協議(HyperText Transfer Protocol,縮寫:HTTP),是互聯網上應用最爲廣泛的一種網絡協議。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。
HTTP是一個無連接,無狀態連接的應用層協議,由請求 — 響應構成,是標準的C/S模型,主要解決如何包裝數據。
HTTP連接使用的是“請求——響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求後,服務器端才能回覆數據。
HTTP主要由兩種請求方式:GET、POST。
// // 用GET獲取表單數據,表單數據對任何人都是可見的 http://www.abc.com/index.php?username=shahdza&password=123 // 用POST獲取表單數據,表單數據則是不可見的 http://www.abc.com.cn/index.php //
> get是從服務器上獲取(查詢)數據;而post是向服務器傳送(修改)數據。
> get傳輸數據量較小,2KB;而post傳輸一般不受限制。
> get安全性非常低,但執行效率比較好;而post安全性相對來說就比較好。
建議:在做數據查詢時用get方式,而在做數據添加,修改或刪除時用post方式。
【HTTP連接的步驟】
(1)客戶端請求服務器連接。
(2)客戶端發送GET或POST指令,請求數據。
(3)服務端接收到請求數據指令後,發送響應請求的數據。
(4)釋放連接,一次連接結束。
【HttpClient】
Cocos爲我們封裝了HTTP客戶端的接口:HttpClient類。
HttpClient類是一個單例類,用於管理HTTP連接請求。
HttpClient封裝了各種對象,處理cookies,身份認證,連接管理等。
還有兩個重要的類:
> HttpRequest :提供發送HTTP請求有關的數據信息(包含:url、請求方式、數據、響應函數等信息)
> HttpResponse :服務器返回的響應信息(包含:響應代碼、錯誤信息、響應的數據等信息)
0、引入頭文件
// #include "network/HttpClient.h" using namespace network; //
1、相關函數
// /** * HttpRequest 相關 **/ HttpRequest { // 請求方式 HttpRequest::Type::GET HttpRequest::Type::POST // 設置請求方式 void setRequestType(Type type); // 設置訪問服務器的資源URL void setUrl(const char* url); // 發送請求數據,用於POST方式 void setRequestData(const char* buffer, size_t len); // 綁定請求的響應函數 void setResponseCallback(const ccHttpRequestCallback& callback); // HttpResponse爲服務器返回的響應信息 callback(HttpClient* sender, HttpResponse* response); }; /** * HttpResponse 相關 **/ HttpResponse { // HTTP請求是否成功 bool isSucceed(); // 響應代碼 long getResponseCode(); // 錯誤信息 const char* getErrorBuffer(); // 發送回來的響應數據信息 std::vector<char>* getResponseData(); }; /** * HttpClient 相關 **/ HttpClient { // 獲取HttpClient單例 static HttpClient* getInstance(); static void destroyInstance(); // 發送HTTP請求 void send(HttpRequest* request); // 設置連接超時時長 inline void setTimeoutForConnect(int value) {_timeoutForConnect = value;}; // 設置下載超時時長 inline void setTimeoutForRead(int value) {_timeoutForRead = value;}; }; //
2、使用步驟
(1)創建HttpRequest請求
(2)設置request請求的url、請求方式GET/POST、發送的數據、請求的響應函數。
(3)發送request請求,HttpClient::getInstance()->send(request); 。
(4)處理請求的響應函數。
(5)釋放HTTP連接。
3、代碼例子
// // 發送HTTP請求 void HelloWorld::onHttpRequest(std::string type) { // 創建HTTP請求 HttpRequest* request = new HttpRequest(); if (type == "get") { request->setRequestType(HttpRequest::Type::GET); // url後面附加數據信息 request->setUrl("http://httpbin.org/get?name=hello&pwd=world"); } else if(type == "post") { request->setRequestType(HttpRequest::Type::POST); request->setUrl("http://httpbin.org/post"); // 設置post發送請求的數據信息 std::string data = "hello world!"; request->setRequestData(data.c_str(), data.length()); } // HTTP響應函數 request->setResponseCallback(CC_CALLBACK_2(HelloWorld::onHttpResponse, this)); // 發送請求 HttpClient::getInstance()->send(request); // 釋放鏈接 request->release(); } // HTTP響應請求函數 void HelloWorld::onHttpResponse(HttpClient* sender, HttpResponse* response) { // 沒有收到響應 if (!response) { CCLOG("no response"); return; } int statusCode = response->getResponseCode(); char statusString[64] = {}; sprintf(statusString, "HTTP Status Code: %d, tag = %s", statusCode, response->getHttpRequest()->getTag()); CCLOG("response code: %s", statusString); // 鏈接失敗 if (!response->isSucceed()) { CCLOG("response failed"); CCLOG("error buffer: %s", response->getErrorBuffer()); return; } // 獲取數據 std::vector<char>* v = response->getResponseData(); for (int i = 0; i < v->size(); i++) { printf("%c", v->at(i)); } printf("\n"); } //
4、運行結果