Magic_Game/samples/Samples/Demo5.h

177 lines
3.9 KiB
C++

// Copyright (C) 2019 Nomango
#pragma once
#include "common.h"
#include <iostream>
class Demo5
: public Scene
{
public:
static ScenePtr Create()
{
return new Demo5;
}
Demo5()
{
// 添加按键监听
AddListener(Event::KeyDown, MakeClosure(this, &Demo5::OnKeyDown));
// 创建说明文字
TextPtr text = new Text(L"按G发送GET请求\n按P发送POST请求\n按U发送PUT请求\n按D发送DELETE请求");
// 设置节点大小为文字布局大小
text->SetSize(text->GetLayoutSize());
// 设置文字位置
text->SetAnchor(0.5f, 0.5f);
text->SetPosition(WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2);
// 添加到场景
this->AddChild(text);
}
void OnEnter() override
{
// 进入场景时打开控制台
Logger::Instance().ShowConsole(true);
}
void OnExit() override
{
// 退出场景时关闭控制台
Logger::Instance().ShowConsole(false);
}
void OnKeyDown(Event const& e)
{
// 按不同键发送不同请求
if (e.key.code == KeyCode::G)
{
SendGetRequest();
}
else if (e.key.code == KeyCode::P)
{
SendPostRequest();
}
else if (e.key.code == KeyCode::U)
{
SendPutRequest();
}
else if (e.key.code == KeyCode::D)
{
SendDeleteRequest();
}
}
void SendGetRequest()
{
// 发送 GET 请求
Logger::Instance().Println(L"Start to send GET request...");
HttpRequestPtr request = new HttpRequest;
// 设置请求 URL
request->SetUrl(L"http://httpbin.org/get");
// 设置请求类型为 GET
request->SetType(HttpRequest::Type::Get);
// 设置请求完成后的回调函数
request->SetResponseCallback(MakeClosure(this, &Demo5::Complete));
// 发送 HTTP 请求
HttpClient::Instance().Send(request);
}
void SendPostRequest()
{
// 发送 POST 请求
Logger::Instance().Println(L"Start to send POST request...");
// 创建 JSON 格式的 POST 数据
Json request_data = {
{ "string", "test中文" },
{ "boolean", true },
{ "integer", 12 },
{ "float", 3.125 },
{ "array", { 1, 2, 3, 4, 4.5 } },
{ "object", { "key", "value" } },
};
HttpRequestPtr request = new HttpRequest;
request->SetUrl(L"http://httpbin.org/post");
request->SetType(HttpRequest::Type::Post);
// 设置 POST 请求的数据
request->SetJsonData(request_data);
request->SetResponseCallback(MakeClosure(this, &Demo5::Complete));
HttpClient::Instance().Send(request);
}
void SendPutRequest()
{
// 发送 PUT 请求
Logger::Instance().Println(L"Start to send PUT request...");
// 创建 JSON 格式的 PUT 数据
Json request_data = Json::array({ 1, 2, 3 });
HttpRequestPtr request = new HttpRequest;
request->SetUrl(L"http://httpbin.org/put");
request->SetType(HttpRequest::Type::Put);
// 设置 PUT 请求的数据
request->SetJsonData(request_data);
request->SetResponseCallback(MakeClosure(this, &Demo5::Complete));
HttpClient::Instance().Send(request);
}
void SendDeleteRequest()
{
// 发送 DELETE 请求
Logger::Instance().Println(L"Start to send DELETE request...");
HttpRequestPtr request = new HttpRequest;
request->SetUrl(L"http://httpbin.org/delete");
request->SetType(HttpRequest::Type::Delete);
request->SetResponseCallback(MakeClosure(this, &Demo5::Complete));
HttpClient::Instance().Send(request);
}
void Complete(HttpRequestPtr request, HttpResponsePtr response)
{
// 判断请求是否成功
if (response->IsSucceed())
{
try
{
// 将获取到的数据解析成 JSON 格式
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;
}
catch (json_exception& e)
{
std::wcout << L"Parse JSON failed: " << e.what() << std::endl;
}
}
else
{
// 请求失败时打印错误信息
OutputError(response);
}
}
void OutputError(HttpResponsePtr response)
{
// 打印 HTTP 响应结果的状态码和错误信息
Json result = {
{L"HttpCode", response->GetResponseCode()},
{L"Error", response->GetError()},
};
std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl;
}
};