update network sample
This commit is contained in:
		
							parent
							
								
									e2b5953a75
								
							
						
					
					
						commit
						0b7ca8670f
					
				|  | @ -901,7 +901,7 @@ namespace easy2d | ||||||
| 				case JsonType::String: | 				case JsonType::String: | ||||||
| 				{ | 				{ | ||||||
| 					out->write('\"'); | 					out->write('\"'); | ||||||
| 					out->write(json.value_.data.string->c_str()); | 					dump_string(*json.value_.data.string); | ||||||
| 					out->write('\"'); | 					out->write('\"'); | ||||||
| 					return; | 					return; | ||||||
| 				} | 				} | ||||||
|  | @ -986,6 +986,31 @@ namespace easy2d | ||||||
| 				out->write(number_buffer.data()); | 				out->write(number_buffer.data()); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | 			void dump_string(const string_type & val) | ||||||
|  | 			{ | ||||||
|  | 				for (const auto& ch : val) | ||||||
|  | 				{ | ||||||
|  | 					switch (ch) | ||||||
|  | 					{ | ||||||
|  | 					case '\t': | ||||||
|  | 						out->write('\\'); | ||||||
|  | 						out->write('t'); | ||||||
|  | 						break; | ||||||
|  | 					case '\r': | ||||||
|  | 						out->write('\\'); | ||||||
|  | 						out->write('r'); | ||||||
|  | 						break; | ||||||
|  | 					case '\n': | ||||||
|  | 						out->write('\\'); | ||||||
|  | 						out->write('n'); | ||||||
|  | 						break; | ||||||
|  | 					default: | ||||||
|  | 						out->write(ch); | ||||||
|  | 						break; | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
| 		private: | 		private: | ||||||
| 			output_adapter<char_type>* out; | 			output_adapter<char_type>* out; | ||||||
| 			char_type indent_char; | 			char_type indent_char; | ||||||
|  | @ -1247,10 +1272,20 @@ namespace easy2d | ||||||
| 				{ | 				{ | ||||||
| 					string_buffer.clear(); | 					string_buffer.clear(); | ||||||
| 
 | 
 | ||||||
|  | 					bool must_read_next = false; | ||||||
| 					while (true) | 					while (true) | ||||||
| 					{ | 					{ | ||||||
| 						const auto ch = read_next(); | 						const auto ch = read_next(); | ||||||
| 						if (ch == '\"') | 
 | ||||||
|  | 						if (must_read_next) | ||||||
|  | 						{ | ||||||
|  | 							must_read_next = false; | ||||||
|  | 						} | ||||||
|  | 						else if (ch == '\\') | ||||||
|  | 						{ | ||||||
|  | 							must_read_next = true; | ||||||
|  | 						} | ||||||
|  | 						else if (ch == '\"') | ||||||
| 						{ | 						{ | ||||||
| 							// skip last \"
 | 							// skip last \"
 | ||||||
| 							read_next(); | 							read_next(); | ||||||
|  |  | ||||||
|  | @ -554,7 +554,7 @@ namespace easy2d | ||||||
| 	{ | 	{ | ||||||
| 		discard_const_data(); | 		discard_const_data(); | ||||||
| 
 | 
 | ||||||
| 		if (cstr) | 		if (cstr && count) | ||||||
| 		{ | 		{ | ||||||
| 			if (count > capacity_) | 			if (count > capacity_) | ||||||
| 			{ | 			{ | ||||||
|  |  | ||||||
|  | @ -15,10 +15,11 @@ public: | ||||||
| 
 | 
 | ||||||
| 	Demo5() | 	Demo5() | ||||||
| 	{ | 	{ | ||||||
|  | 		// 添加按键监听
 | ||||||
| 		AddListener(Event::KeyDown, Closure(this, &Demo5::OnKeyDown)); | 		AddListener(Event::KeyDown, Closure(this, &Demo5::OnKeyDown)); | ||||||
| 
 | 
 | ||||||
| 		// 创建说明文字
 | 		// 创建说明文字
 | ||||||
| 		TextPtr text = new Text(L"按空格键发送测试请求"); | 		TextPtr text = new Text(L"按G发送GET请求\n按P发送POST请求\n按U发送PUT请求\n按D发送DELETE请求"); | ||||||
| 		// 设置节点大小为文字布局大小
 | 		// 设置节点大小为文字布局大小
 | ||||||
| 		text->SetSize(text->GetLayoutSize()); | 		text->SetSize(text->GetLayoutSize()); | ||||||
| 		// 设置文字位置
 | 		// 设置文字位置
 | ||||||
|  | @ -31,30 +32,107 @@ public: | ||||||
| 
 | 
 | ||||||
| 	void OnEnter() override | 	void OnEnter() override | ||||||
| 	{ | 	{ | ||||||
|  | 		// 进入场景时打开控制台
 | ||||||
| 		Application::ShowConsole(true); | 		Application::ShowConsole(true); | ||||||
| 		SendRequest(); |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void OnExit() override | 	void OnExit() override | ||||||
| 	{ | 	{ | ||||||
|  | 		// 退出场景时关闭控制台
 | ||||||
| 		Application::ShowConsole(false); | 		Application::ShowConsole(false); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	void OnKeyDown(Event const& e) | 	void OnKeyDown(Event const& e) | ||||||
| 	{ | 	{ | ||||||
| 		if (e.key.code == KeyCode::Space) | 		// 按不同键发送不同请求
 | ||||||
|  | 		if (e.key.code == KeyCode::G) | ||||||
| 		{ | 		{ | ||||||
| 			SendRequest(); | 			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 SendRequest() | 	void SendGetRequest() | ||||||
| 	{ | 	{ | ||||||
| 		Logger::Instance().Println(L"Start to send request..."); | 		// 发送 GET 请求
 | ||||||
|  | 		Logger::Instance().Println(L"Start to send GET request..."); | ||||||
| 
 | 
 | ||||||
| 		HttpRequestPtr request = new HttpRequest; | 		HttpRequestPtr request = new HttpRequest; | ||||||
|  | 		// 设置请求 URL
 | ||||||
| 		request->SetUrl(L"http://httpbin.org/get"); | 		request->SetUrl(L"http://httpbin.org/get"); | ||||||
|  | 		// 设置请求类型为 GET
 | ||||||
| 		request->SetType(HttpRequest::Type::Get); | 		request->SetType(HttpRequest::Type::Get); | ||||||
|  | 		// 设置请求完成后的回调函数
 | ||||||
|  | 		request->SetResponseCallback(Closure(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", "StringTest"}, | ||||||
|  | 			{"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->SetData(request_data.dump()); | ||||||
|  | 		request->SetResponseCallback(Closure(this, &Demo5::Complete)); | ||||||
|  | 
 | ||||||
|  | 		HttpClient::Instance().Send(request); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void SendPutRequest() | ||||||
|  | 	{ | ||||||
|  | 		// 发送 PUT 请求
 | ||||||
|  | 		Logger::Instance().Println(L"Start to send PUT request..."); | ||||||
|  | 
 | ||||||
|  | 		// 创建 JSON 格式的 PUT 数据
 | ||||||
|  | 		Json request_data = { | ||||||
|  | 			{"user", {{"id", 1}, {"phone", "12345678"}}}, | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		HttpRequestPtr request = new HttpRequest; | ||||||
|  | 		request->SetUrl(L"http://httpbin.org/put"); | ||||||
|  | 		request->SetType(HttpRequest::Type::Put); | ||||||
|  | 		// 设置 PUT 请求的数据
 | ||||||
|  | 		request->SetData(request_data.dump()); | ||||||
|  | 		request->SetResponseCallback(Closure(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(Closure(this, &Demo5::Complete)); | 		request->SetResponseCallback(Closure(this, &Demo5::Complete)); | ||||||
| 
 | 
 | ||||||
| 		HttpClient::Instance().Send(request); | 		HttpClient::Instance().Send(request); | ||||||
|  | @ -62,22 +140,39 @@ public: | ||||||
| 
 | 
 | ||||||
| 	void Complete(HttpRequestPtr request, HttpResponsePtr response) | 	void Complete(HttpRequestPtr request, HttpResponsePtr response) | ||||||
| 	{ | 	{ | ||||||
|  | 		// 判断请求是否成功
 | ||||||
| 		if (response->IsSucceed()) | 		if (response->IsSucceed()) | ||||||
| 		{ | 		{ | ||||||
|  | 			try | ||||||
|  | 			{ | ||||||
|  | 				// 将获取到的数据解析成 JSON 格式
 | ||||||
| 				Json response_data = Json::parse(response->GetData()); | 				Json response_data = Json::parse(response->GetData()); | ||||||
| 				Json result = { | 				Json result = { | ||||||
| 					{L"HttpCode", response->GetResponseCode()}, | 					{L"HttpCode", response->GetResponseCode()}, | ||||||
| 					{L"Data", response_data}, | 					{L"Data", response_data}, | ||||||
| 				}; | 				}; | ||||||
|  | 
 | ||||||
| 				std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; | 				std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; | ||||||
| 			} | 			} | ||||||
|  | 			catch (json_exception& e) | ||||||
|  | 			{ | ||||||
|  | 				E2D_ERROR_LOG(L"Parse JSON failed: %s", e.what()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
|  | 			// 请求失败时打印错误信息
 | ||||||
|  | 			OutputError(response); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	void OutputError(HttpResponsePtr response) | ||||||
|  | 	{ | ||||||
|  | 		// 打印 HTTP 响应结果的状态码和错误信息
 | ||||||
| 		Json result = { | 		Json result = { | ||||||
| 				{L"HttpCode", response->GetResponseCode()}, | 				{L"HttpCode", response->GetResponseCode()}, | ||||||
| 				{L"Error", response->GetError()}, | 				{L"Error", response->GetError()}, | ||||||
| 		}; | 		}; | ||||||
| 		std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; | 		std::wcout << L"Response: " << std::endl << result.dump(4) << std::endl; | ||||||
| 	} | 	} | ||||||
| 	} |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue