Cocos網絡篇[3.2](2) ——HTTP連接

【嘮叨】

    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 IdentifiersURI)來標識。

    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)釋放連接,一次連接結束。

wKioL1T3FxKQ_AnvAAB8jvhVr2w997.jpg




【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、運行結果

wKioL1T3IRqBf2epAAIXvKbMM-w601.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章