IHttp请求响应长度限制

IHttpRequest response length limit

本文关键字:长度限制 响应 请求 IHttp      更新时间:2023-10-16

我有一个正在设置的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 "";
}
<小时 />

附带说明一下,我不确定如何检查FHttpResponsePtr是否指向空对象。我以为我在 while 循环中用了那个代码,但它似乎没有区别。偶尔,代码会中断,因为当我尝试以字符串形式访问内容时,响应为 null。

有人知道如何正确检查它是否为空吗?

<小时 />

编辑:

根据@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 "";

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

我认为响应没有这么小的限制。看起来更像是在响应实际处理请求之前获取响应。您应该仅在 GetStatus() 重新调整 Processing() 以外的内容后尝试调用 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 循环中执行检查,但在 actor 的 tick 事件期间只执行一次。
  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()));
}