【问题标题】:IHttpRequest response length limitIHttpRequest 响应长度限制
【发布时间】:2015-04-14 05:47:15
【问题描述】:

我正在设置一个 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 循环中使用了该代码,但似乎没有什么不同。有时,代码会中断,因为当我尝试以字符串形式访问内容时,响应为空。

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


编辑:

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

然而,这会导致无限循环。

【问题讨论】:

    标签: c++ http unreal-engine4


    【解决方案1】:

    我认为响应没有这么小的限制。看起来您更像是在实际处理请求之前获取响应。您应该尝试仅在 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 循环中进行检查,但仅在您的演员的滴答事件期间进行一次。
    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()));
    }
    

    【讨论】:

    • 太棒了!谢谢。我会在一分钟内尝试并告诉你。
    • 请检查我的编辑,如果我做错了什么,请告诉我。我做的循环是一个无限循环。状态永远不会更改为已完成。
    • 我调整了答案,希望对您有所帮助!
    猜你喜欢
    • 2017-01-26
    • 2019-10-16
    • 2013-09-03
    • 1970-01-01
    • 2020-08-12
    • 2013-10-25
    • 2010-12-06
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多