Синхронные HTTP-запросы в переполнении стека

Я настроил многопользовательский выделенный сервер, который работает с использованием сценариев PHP и баз данных MySQL. Я пытаюсь получить доступ к серверу через HTTP для отправки / получения игровых данных, начиная с чего-то такого простого, как получение статуса сервера.

Мне удалось успешно связаться с сервером с помощью IHttpRequest Unreal Doc:

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)

0

Решение

Сброс (без сигнала) события в нижней части getContentsOfUrl.
Ждите, чтобы это стало сигналом.
Сигнализировать событие от OnResponseReceived.

Создать событие 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)
1

Другие решения


По вопросам рекламы [email protected]