diff --git a/Easy2D-Network/HttpClient.cpp b/Easy2D-Network/HttpClient.cpp index 19e565ae..51de0234 100644 --- a/Easy2D-Network/HttpClient.cpp +++ b/Easy2D-Network/HttpClient.cpp @@ -119,11 +119,7 @@ namespace return false; CURLcode code = curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, response_code); - if (code != CURLE_OK || !(*response_code >= 200 && *response_code < 300)) - { - return false; - } - return true; + return code == CURLE_OK && (*response_code >= 200 && *response_code < 300); } template @@ -133,41 +129,68 @@ namespace } public: - static inline bool GetRequest(HttpClient* client, HttpRequestPtr const& request, long* response_code, std::string* response_data, std::string* response_header, char* error_buffer) + static inline bool GetRequest( + HttpClient* client, + Array const& headers, + std::string const& url, + long* response_code, + std::string* response_data, + std::string* response_header, + char* error_buffer) { Curl curl; - return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer) + return curl.Init(client, headers, url, response_data, response_header, error_buffer) && curl.SetOption(CURLOPT_FOLLOWLOCATION, true) && curl.Perform(response_code); } - static inline bool PostRequest(HttpClient* client, HttpRequestPtr const& request, long* response_code, std::string* response_data, std::string* response_header, char* error_buffer) + static inline bool PostRequest( + HttpClient* client, + Array const& headers, + std::string const& url, + std::string const& request_data, + long* response_code, + std::string* response_data, + std::string* response_header, + char* error_buffer) { Curl curl; - const auto request_data = request->GetData(); - return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer) + return curl.Init(client, headers, url, response_data, response_header, error_buffer) && curl.SetOption(CURLOPT_POST, 1) && curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str()) && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code); } - static inline bool PutRequest(HttpClient* client, HttpRequestPtr const& request, long* response_code, std::string* response_data, std::string* response_header, char* error_buffer) + static inline bool PutRequest( + HttpClient* client, + Array const& headers, + std::string const& url, + std::string const& request_data, + long* response_code, + std::string* response_data, + std::string* response_header, + char* error_buffer) { Curl curl; - const auto request_data = request->GetData(); - return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer) + return curl.Init(client, headers, url, response_data, response_header, error_buffer) && curl.SetOption(CURLOPT_CUSTOMREQUEST, "PUT") && curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str()) && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.Perform(response_code); } - static inline bool DeleteRequest(HttpClient* client, HttpRequestPtr const& request, long* response_code, std::string* response_data, std::string* response_header, char* error_buffer) + static inline bool DeleteRequest( + HttpClient* client, + Array const& headers, + std::string const& url, + long* response_code, + std::string* response_data, + std::string* response_header, + char* error_buffer) { Curl curl; - const auto request_data = request->GetData(); - return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer) + return curl.Init(client, headers, url, response_data, response_header, error_buffer) && curl.SetOption(CURLOPT_CUSTOMREQUEST, "DELETE") && curl.SetOption(CURLOPT_FOLLOWLOCATION, true) && curl.Perform(response_code); @@ -250,21 +273,32 @@ namespace easy2d { bool ok = false; long response_code = 0; - char error_message[256]; + char error_message[256] = { 0 }; + std::string response_header; + std::string response_data; + + std::string url = request->GetUrl().to_string(); + std::string data = request->GetData().to_string(); + Array headers; + headers.reserve(request->GetHeaders().size()); + for (const auto& header : request->GetHeaders()) + { + headers.push_back(header.to_string()); + } switch (request->GetType()) { case HttpRequest::Type::Get: - ok = Curl::GetRequest(this, request, &response_code, response->GetDataPtr(), response->GetHeaderPtr(), error_message); + ok = Curl::GetRequest(this, headers, url, &response_code, &response_data, &response_header, error_message); break; case HttpRequest::Type::Post: - ok = Curl::PostRequest(this, request, &response_code, response->GetDataPtr(), response->GetHeaderPtr(), error_message); + ok = Curl::PostRequest(this, headers, url, data, &response_code, &response_data, &response_header, error_message); break; case HttpRequest::Type::Put: - ok = Curl::PutRequest(this, request, &response_code, response->GetDataPtr(), response->GetHeaderPtr(), error_message); + ok = Curl::PutRequest(this, headers, url, data, &response_code, &response_data, &response_header, error_message); break; case HttpRequest::Type::Delete: - ok = Curl::DeleteRequest(this, request, &response_code, response->GetDataPtr(), response->GetHeaderPtr(), error_message); + ok = Curl::DeleteRequest(this, headers, url, &response_code, &response_data, &response_header, error_message); break; default: E2D_ERROR_LOG(L"HttpClient: unknown request type, only GET, POST, PUT or DELETE is supported"); @@ -272,6 +306,8 @@ namespace easy2d } response->SetResponseCode(response_code); + response->SetHeader(response_header); + response->SetData(response_data); if (!ok) { response->SetSucceed(false); diff --git a/Easy2D-Network/HttpRequest.h b/Easy2D-Network/HttpRequest.h index c6413f42..d0c5a14b 100644 --- a/Easy2D-Network/HttpRequest.h +++ b/Easy2D-Network/HttpRequest.h @@ -56,7 +56,7 @@ namespace easy2d url_ = url.to_string(); } - inline std::string const& GetUrl() const + inline String const& GetUrl() const { return url_; } @@ -76,21 +76,17 @@ namespace easy2d data_ = data.to_string(); } - inline std::string const& GetData() const + inline String const& GetData() const { return data_; } inline void SetHeaders(Array const& headers) { - headers_.reserve(headers.size()); - for (const auto& header : headers) - { - headers_.push_back(header.to_string()); - } + headers_ = headers; } - inline Array const& GetHeaders() const + inline Array const& GetHeaders() const { return headers_; } @@ -107,9 +103,9 @@ namespace easy2d protected: Type type_; - std::string url_; - std::string data_; - Array headers_; + String url_; + String data_; + Array headers_; ResponseCallback response_cb_; }; } diff --git a/Easy2D-Network/HttpResponse.h b/Easy2D-Network/HttpResponse.h index 9081ecdd..27d21aeb 100644 --- a/Easy2D-Network/HttpResponse.h +++ b/Easy2D-Network/HttpResponse.h @@ -60,49 +60,34 @@ namespace easy2d return response_code_; } - inline void SetHeader(std::string const& response_header) + inline void SetHeader(String const& response_header) { response_header_ = response_header; } inline String GetHeader() const { - return String(response_header_); + return response_header_; } - inline std::string* GetHeaderPtr() - { - return &response_header_; - } - - inline void SetData(std::string const& response_data) + inline void SetData(String const& response_data) { response_data_ = response_data; } - inline String GetData() const + inline String const& GetData() const { - return String(response_data_); + return response_data_; } - inline std::string* GetDataPtr() - { - return &response_data_; - } - - inline void SetError(std::string const& error_buffer) + inline void SetError(String const& error_buffer) { error_buffer_ = error_buffer; } - inline String GetError() const + inline String const& GetError() const { - return String(error_buffer_); - } - - inline std::string* GetErrorPtr() - { - return &error_buffer_; + return error_buffer_; } protected: @@ -110,9 +95,9 @@ namespace easy2d long response_code_; HttpRequestPtr request_; - std::string response_header_; - std::string response_data_; - std::string error_buffer_; + String response_header_; + String response_data_; + String error_buffer_; }; } } diff --git a/samples/Samples/Demo5.h b/samples/Samples/Demo5.h index 222e6600..38bc651b 100644 --- a/samples/Samples/Demo5.h +++ b/samples/Samples/Demo5.h @@ -2,6 +2,7 @@ #pragma once #include "common.h" +#include class Demo5 : public Scene @@ -31,6 +32,7 @@ public: void OnEnter() override { Application::ShowConsole(true); + SendRequest(); } void OnExit() override @@ -42,25 +44,40 @@ public: { if (e.key.code == KeyCode::Space) { - HttpRequestPtr request = new HttpRequest; - request->SetUrl(L"http://httpbin.org/get/"); - request->SetType(HttpRequest::Type::Get); - request->SetResponseCallback(Closure(this, &Demo5::Complete)); - - HttpClient::Instance().Send(request); + SendRequest(); } } + void SendRequest() + { + Logger::Instance().Println(L"Start to send request..."); + + HttpRequestPtr request = new HttpRequest; + request->SetUrl(L"http://httpbin.org/get"); + request->SetType(HttpRequest::Type::Get); + request->SetResponseCallback(Closure(this, &Demo5::Complete)); + + HttpClient::Instance().Send(request); + } + void Complete(HttpRequestPtr request, HttpResponsePtr response) { if (response->IsSucceed()) { - std::wcout << "Response: " << std::endl << "HttpCode: " << response->GetResponseCode() - << std::endl << "Data: " << response->GetData() << std::endl; + Json response_data = Json::parse(response->GetData()); + Json result = { + {L"HttpCode", response->GetResponseCode()}, + {L"Data", response_data}, + }; + std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; } else { - std::wcout << "Error: " << response->GetError() << std::endl; + Json result = { + {L"HttpCode", response->GetResponseCode()}, + {L"Error", response->GetError()}, + }; + std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; } } };