UE4与WEB服务器交互(json)

[复制链接]
查看10538 | 回复21 | 2016-8-7 23:24:42 | 显示全部楼层 |阅读模式
概述

制作游戏在很多情况下需要和WEB服务器进行交互,最常见的是在做Demo时需要通过游戏向WEB服务器传递数据(登录/注册验请求),WEB服务器处理(操作数据库)之后返回结果并调用指定的方法。 该教程简单介绍了如何通过UE4向WEB服务器(PHP)发送json数据包及回调方法。


添加模块和头文件引用

在代码编辑器中打开项目解决方案,在<Solution Name>/Source/< ProjectName>路径下,找到并打开< ProjectName>.Build.cs文件,添加HTTP模块:

[mw_shl_code=cpp,true]PrivateDependencyModuleNames.AddRange(new string[] {"HTTP"});
PrivateIncludePathModuleNames.AddRange(new string[] {"HTTP"});[/mw_shl_code]


然后在需要实现该功能的类文件中添加如下的头文件引用:

[mw_shl_code=cpp,true]#include "Http.h"
#include "Json.h"[/mw_shl_code]


创建json数据包

数据内容为:

[mw_shl_code=javascript,true]{ "user" : "StormUnited"}[/mw_shl_code]


创建:

[mw_shl_code=cpp,true]// Create a writer and hold it in this FString
FString JsonStr;
TSharedRef< TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR> > > JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR> >::Create(&JsonStr);
JsonWriter->WriteObjectStart();
JsonWriter->WriteValue(TEXT("user"), TEXT("StormUnited"));
JsonWriter->WriteObjectEnd();

// Close the writer and finalize the output such that JsonStr has what we want
JsonWriter->Close();[/mw_shl_code]


至此,json数据包准备完成。


准备接收json数据包的PHP网页

本示例中使用了PHP,你可以选择使用搭建动态网站或者服务器的开源软件,比如说wamp/lamp等在本机上建立一个WEB服务器来解析PHP页面。 创建mywebpage.php文件,并添加如下代码:

[mw_shl_code=php,true]<?php
     // 首先接收上传的数据
     $post_data = file_get_contents('php://input');
     // 解析json字符串
     $obj = json_decode($post_data);
     // 获取包含在Json字符串中的数据
     echo $obj->{'user'};
?>[/mw_shl_code]


POST数据

将通过如下的代码将上面准备好的json数据包提交给 http://localhost/mywebpage.php

  • SetHeader:可以设置POST数据的格式
  • SetURL:可以指定用于处理上传数据的链接
  • SetVerb:可以设置POST/PUT/GET
  • SetContentAsString:用于填充上传的数据内容
  • OnProcessRequestComplete().BindUObject 用于指定在发送请求之后的回调方法。

[mw_shl_code=cpp,true]TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();
HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json; charset=utf-8"));
HttpRequest->SetURL(TEXT("http://localhost/mywebpage.php"));
HttpRequest->SetVerb(TEXT(" POST"));
HttpRequest->SetContentAsString(JsonStr);
HttpRequest->OnProcessRequestComplete().BindUObject(this, &ASUMiniGameMode::HttpCompleteCallback);
HttpRequest-> ProcessRequest();[/mw_shl_code]
关于回调函数的结构:
[mw_shl_code=cpp,true]void HttpCompleteCallback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful); 示例:
void ASUMiniGameMode::HttpCompleteCallback(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
     FString MessageBody = "";

     // If HTTP fails client-side, this will still be called but with a NULL shared pointer!
     if (!Response.IsValid())
     {
          MessageBody = "{\"success\":\"Error: Unable to process HTTP Request!\"}";
     }
     else if (EHttpResponseCodes::IsOk(Response->GetResponseCode()))
     {
          MessageBody = Response->GetContentAsString();
     }
     else
     {
          MessageBody = FString:: Printf(TEXT("{\"success\":\"HTTP Error: %d\"}"), Response->GetResponseCode());
     }
}
[/mw_shl_code]
一旦发送出请求后肯定会调用HttpCompleteCallback方法,WEB服务器处理的数据结果包含在Response参数中,可以通过Response->GetContentAsString()来获取返回的字符串,比如在本例中是StormUnited。


本帖被以下淘专辑推荐:

个人博客 : ericsong.org
keven | 2016-8-8 09:18:33 | 显示全部楼层
改天单独找你请教这个问题
回复 支持 反对

使用道具 举报

chinabeater | 2016-8-8 09:55:33 | 显示全部楼层
论坛里大神越来越多了
回复 支持 反对

使用道具 举报

nameless123456 | 2016-8-8 11:01:19 | 显示全部楼层
谢谢分享,非常有用呢~~~~
回复 支持 反对

使用道具 举报

method | 2016-8-9 09:55:52 | 显示全部楼层
好屌啊。大神
回复 支持 反对

使用道具 举报

zhoulijing | 2016-8-16 09:01:57 | 显示全部楼层
很牛逼,赞一个
回复 支持 反对

使用道具 举报

c天使之恋z | 2016-8-17 11:51:17 | 显示全部楼层
大神,膜拜
回复

使用道具 举报

madrid10 | 2016-8-20 08:53:29 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

山楂卷 | 2016-8-29 16:14:43 | 显示全部楼层
说了那么多,这个感觉还不实用,想要快速实用的话,官方商城里已经有做好的免费插件,叫Varest。需要这个功能的可以去看看
回复 支持 反对

使用道具 举报

crackertoo | 2016-8-31 12:25:28 | 显示全部楼层
这个好~ 值得学习~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则