update HttpClient

This commit is contained in:
Nomango 2019-03-31 13:09:31 +08:00 committed by Nomango
parent eea3f92567
commit e2b5953a75
4 changed files with 101 additions and 67 deletions

View File

@ -119,11 +119,7 @@ namespace
return false; return false;
CURLcode code = curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, response_code); CURLcode code = curl_easy_getinfo(curl_, CURLINFO_RESPONSE_CODE, response_code);
if (code != CURLE_OK || !(*response_code >= 200 && *response_code < 300)) return code == CURLE_OK && (*response_code >= 200 && *response_code < 300);
{
return false;
}
return true;
} }
template <typename ..._Args> template <typename ..._Args>
@ -133,41 +129,68 @@ namespace
} }
public: 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<std::string> const& headers,
std::string const& url,
long* response_code,
std::string* response_data,
std::string* response_header,
char* error_buffer)
{ {
Curl curl; 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.SetOption(CURLOPT_FOLLOWLOCATION, true)
&& curl.Perform(response_code); && 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<std::string> 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; Curl curl;
const auto request_data = request->GetData(); return curl.Init(client, headers, url, response_data, response_header, error_buffer)
return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer)
&& curl.SetOption(CURLOPT_POST, 1) && curl.SetOption(CURLOPT_POST, 1)
&& curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str()) && curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str())
&& curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size())
&& curl.Perform(response_code); && 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<std::string> 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; Curl curl;
const auto request_data = request->GetData(); return curl.Init(client, headers, url, response_data, response_header, error_buffer)
return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer)
&& curl.SetOption(CURLOPT_CUSTOMREQUEST, "PUT") && curl.SetOption(CURLOPT_CUSTOMREQUEST, "PUT")
&& curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str()) && curl.SetOption(CURLOPT_POSTFIELDS, request_data.c_str())
&& curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size()) && curl.SetOption(CURLOPT_POSTFIELDSIZE, request_data.size())
&& curl.Perform(response_code); && 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<std::string> const& headers,
std::string const& url,
long* response_code,
std::string* response_data,
std::string* response_header,
char* error_buffer)
{ {
Curl curl; Curl curl;
const auto request_data = request->GetData(); return curl.Init(client, headers, url, response_data, response_header, error_buffer)
return curl.Init(client, request->GetHeaders(), request->GetUrl(), response_data, response_header, error_buffer)
&& curl.SetOption(CURLOPT_CUSTOMREQUEST, "DELETE") && curl.SetOption(CURLOPT_CUSTOMREQUEST, "DELETE")
&& curl.SetOption(CURLOPT_FOLLOWLOCATION, true) && curl.SetOption(CURLOPT_FOLLOWLOCATION, true)
&& curl.Perform(response_code); && curl.Perform(response_code);
@ -250,21 +273,32 @@ namespace easy2d
{ {
bool ok = false; bool ok = false;
long response_code = 0; 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<std::string> headers;
headers.reserve(request->GetHeaders().size());
for (const auto& header : request->GetHeaders())
{
headers.push_back(header.to_string());
}
switch (request->GetType()) switch (request->GetType())
{ {
case HttpRequest::Type::Get: 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; break;
case HttpRequest::Type::Post: 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; break;
case HttpRequest::Type::Put: 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; break;
case HttpRequest::Type::Delete: 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; break;
default: default:
E2D_ERROR_LOG(L"HttpClient: unknown request type, only GET, POST, PUT or DELETE is supported"); 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->SetResponseCode(response_code);
response->SetHeader(response_header);
response->SetData(response_data);
if (!ok) if (!ok)
{ {
response->SetSucceed(false); response->SetSucceed(false);

View File

@ -56,7 +56,7 @@ namespace easy2d
url_ = url.to_string(); url_ = url.to_string();
} }
inline std::string const& GetUrl() const inline String const& GetUrl() const
{ {
return url_; return url_;
} }
@ -76,21 +76,17 @@ namespace easy2d
data_ = data.to_string(); data_ = data.to_string();
} }
inline std::string const& GetData() const inline String const& GetData() const
{ {
return data_; return data_;
} }
inline void SetHeaders(Array<String> const& headers) inline void SetHeaders(Array<String> const& headers)
{ {
headers_.reserve(headers.size()); headers_ = headers;
for (const auto& header : headers)
{
headers_.push_back(header.to_string());
}
} }
inline Array<std::string> const& GetHeaders() const inline Array<String> const& GetHeaders() const
{ {
return headers_; return headers_;
} }
@ -107,9 +103,9 @@ namespace easy2d
protected: protected:
Type type_; Type type_;
std::string url_; String url_;
std::string data_; String data_;
Array<std::string> headers_; Array<String> headers_;
ResponseCallback response_cb_; ResponseCallback response_cb_;
}; };
} }

View File

@ -60,49 +60,34 @@ namespace easy2d
return response_code_; return response_code_;
} }
inline void SetHeader(std::string const& response_header) inline void SetHeader(String const& response_header)
{ {
response_header_ = response_header; response_header_ = response_header;
} }
inline String GetHeader() const inline String GetHeader() const
{ {
return String(response_header_); return response_header_;
} }
inline std::string* GetHeaderPtr() inline void SetData(String const& response_data)
{
return &response_header_;
}
inline void SetData(std::string const& response_data)
{ {
response_data_ = 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() inline void SetError(String const& error_buffer)
{
return &response_data_;
}
inline void SetError(std::string const& error_buffer)
{ {
error_buffer_ = error_buffer; error_buffer_ = error_buffer;
} }
inline String GetError() const inline String const& GetError() const
{ {
return String(error_buffer_); return error_buffer_;
}
inline std::string* GetErrorPtr()
{
return &error_buffer_;
} }
protected: protected:
@ -110,9 +95,9 @@ namespace easy2d
long response_code_; long response_code_;
HttpRequestPtr request_; HttpRequestPtr request_;
std::string response_header_; String response_header_;
std::string response_data_; String response_data_;
std::string error_buffer_; String error_buffer_;
}; };
} }
} }

View File

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "common.h" #include "common.h"
#include <iostream>
class Demo5 class Demo5
: public Scene : public Scene
@ -31,6 +32,7 @@ public:
void OnEnter() override void OnEnter() override
{ {
Application::ShowConsole(true); Application::ShowConsole(true);
SendRequest();
} }
void OnExit() override void OnExit() override
@ -42,25 +44,40 @@ public:
{ {
if (e.key.code == KeyCode::Space) if (e.key.code == KeyCode::Space)
{ {
SendRequest();
}
}
void SendRequest()
{
Logger::Instance().Println(L"Start to send request...");
HttpRequestPtr request = new HttpRequest; HttpRequestPtr request = new HttpRequest;
request->SetUrl(L"http://httpbin.org/get/"); request->SetUrl(L"http://httpbin.org/get");
request->SetType(HttpRequest::Type::Get); request->SetType(HttpRequest::Type::Get);
request->SetResponseCallback(Closure(this, &Demo5::Complete)); request->SetResponseCallback(Closure(this, &Demo5::Complete));
HttpClient::Instance().Send(request); HttpClient::Instance().Send(request);
} }
}
void Complete(HttpRequestPtr request, HttpResponsePtr response) void Complete(HttpRequestPtr request, HttpResponsePtr response)
{ {
if (response->IsSucceed()) if (response->IsSucceed())
{ {
std::wcout << "Response: " << std::endl << "HttpCode: " << response->GetResponseCode() Json response_data = Json::parse(response->GetData());
<< std::endl << "Data: " << response->GetData() << std::endl; Json result = {
{L"HttpCode", response->GetResponseCode()},
{L"Data", response_data},
};
std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl;
} }
else 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;
} }
} }
}; };