C ++中的同步HTTP请求

时间:2015-04-11 18:14:49

标签: c++ http synchronous unreal-engine4

我已经设置了一个使用PHP脚本和MySQL数据库运行的多人专用服务器。我试图通过HTTP访问服务器来发送/接收游戏数据,从获取服务器状态这样简单的事情开始。

我已经能够使用虚幻文档的IHttpRequest成功联系服务器:

void ANetwork::getContentsOfURL(FString URL)
{
    serverResponse = NULL;

    TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();
    HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
    HttpRequest->SetURL(URL);
    HttpRequest->SetVerb(TEXT("POST"));

    //Creating JSON Object
    FString json = "{\"auth\":\"" + authenticator = "\"";

    json += "}";

    HttpRequest->SetContentAsString(json);
    HttpRequest->OnProcessRequestComplete().BindUObject(this, &ANetwork::OnResponseReceived);
    HttpRequest->ProcessRequest();
}

void ANetwork::OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
    GEngine->AddOnScreenDebugMessage(-1, 15.0f, FColor::Red, Response->GetContentAsString());

    if (!Response.IsValid())
    {
        serverResponse = "FAIL";
    }
    else
    {
        serverResponse = Response->GetContentAsString();
    }
}

这与调试器的正确代码相呼应,因此我知道服务器正在运行,代码实际上正在获取它需要的内容。但是,我需要能够将HTTP响应作为FString并将其返回给调用者,以便我可以在游戏中使用它。现在这个方法是异步的,这阻止我返回响应。

如何创建同步HTTP请求以便我可以将响应作为字符串返回给调用者?

FString ANetwork::getContentsOfURL(FString URL)

1 个答案:

答案 0 :(得分:1)

重置(无信号)getContentsOfUrl底部的事件。 等待它发出信号。 从OnResponseReceived发出事件信号。

CreateEvent https://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx ResetEvent https://msdn.microsoft.com/en-us/library/windows/desktop/ms685081(v=vs.85).aspx WaitForSingleObject https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx SetEvent(发信号)https://msdn.microsoft.com/en-us/library/windows/desktop/ms686211(v=vs.85).aspx

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// bottom getCongentsOfUrl:
ResetEvent(hEvent); // optional because inital state is unsignaled
WaitForSingleObject(hEvent);

// OnResponseReceived
SetEvent(hEvent)