1

我有一个我正在设置的 HTTP 游戏服务器,我有一个函数可以返回很多关于地图的信息。来自服务器的输出大约有 7800 个字符,但是当我在游戏中获取 URL 的内容时,游戏只得到了 1124 个字符。

IHttpRequest 的响应内容的长度是否有限制?

相关代码:

FString ANetwork::getContentsOfURL(FString URL, TArray<FString> keys, TArray<FString> values)
{
    serverResponse = NULL;

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

    int32 count = keys.Num();
    URL += "?auth=" + authenticator;
    for (int i = 0; i < count; i++)
    {
        URL += "&" + keys[i] + "=" + values[i];
    }

    HttpRequest->SetURL(URL);
    HttpRequest->SetVerb(TEXT("GET"));
    HttpRequest->OnProcessRequestComplete().BindUObject(this, &ANetwork::OnResponseReceived);
    HttpRequest->ProcessRequest();

    bool wait = true;
    while (wait)
    {
        FHttpResponsePtr response = HttpRequest->GetResponse();
        FHttpResponsePtr httpnull;
        if (response != httpnull)
        {
            if (HttpRequest->GetResponse()->GetContentAsString() != "")
            {
                return HttpRequest->GetResponse()->GetContentAsString();
            }
        }
    }

    return "";
}

在旁注中,我不确定如何检查 an 是否FHttpResponsePtr指向空对象。我以为我在 while 循环中使用了该代码,但似乎没有什么不同。偶尔,代码会中断,因为当我尝试以字符串形式访问内容时响应为空。

任何人都知道如何正确检查它是否为空?


编辑:

根据@TheBrain 的回答,这是我修改后的循环:

bool wait = true;
while (wait)
{
    if (HttpRequest->GetStatus() != EHttpRequestStatus::Processing)
    {
        FHttpResponsePtr response = HttpRequest->GetResponse();

        if (response.IsValid())
        {
            return response->GetContentAsString();
        }
        else
            return "INVALID";
    }
}

return "";

但是,这会导致无限循环。

4

1 回答 1

2

我认为响应没有这么小的限制。看起来您更像是在实际处理请求之前获取响应。您应该尝试仅在 GetStatus() 返回处理以外的其他内容后调用 GetResponse() 。

在空指针检查中:FHttpResponsePtr 只不过是 TSharedPtr。与任何 TSharedPtr 一样,您可以在指针本身上使用 IsValid() 。例如,使用上面的代码:

FHttpResponsePtr response = HttpRequest->GetResponse();

if (response != nullptr) { // wrong, the pointer itself is never null!

if (response.IsValid()) { // correct, check for pointer validity

if (response.Get() != nullptr) { // basically the same, but longer

编辑:

很抱歉对于这个误会。你绝不能用这样的 while 循环阻塞游戏循环。所以你有两种可能:

  1. 您从 while 循环中进行检查,但仅在您的演员的滴答事件期间进行一次。
  2. 您等待您的回调委托触发。

这是使用委托的工作代码示例:

void AYourActor::NetworkTest()
{
    TSharedRef<IHttpRequest> HttpRequest = FHttpModule::Get().CreateRequest();
    HttpRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
    HttpRequest->SetURL("http://www.google.com");
    HttpRequest->SetVerb(TEXT("GET"));
    HttpRequest->OnProcessRequestComplete().BindUObject(this, &AYourActor::OnResponseReceived);
    HttpRequest->ProcessRequest();
}

void AYourActor::OnResponseReceived(FHttpRequestPtr request, FHttpResponsePtr response, bool didConnect)
{
    UE_LOG(LogExec, Warning, TEXT("Response received %d!"), didConnect);
    UE_LOG(LogExec, Warning, TEXT("Response: %s"), *(response->GetContentAsString()));
}
于 2015-04-14T09:18:37.770 回答