本文介绍了WWW/UnityWebRequest POST/GET 请求不会从服务器/url 返回最新数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Unity 创建一个 HoloLens 应用程序,它必须从 REST API 获取数据并显示它.我目前正在使用 WWW 数据类型在协程中获取数据并产生返回语句,该协程将从 Update() 函数调用.当我尝试运行代码时,我从 API 获取最新数据,但是当有人将任何新数据推送到 API 时,它不会自动实时获取最新数据,我必须重新启动应用程序查看最新数据.我的代码:

I am creating a HoloLens app using Unity which has to take data from a REST API and display it.I am currently using WWW datatype to get the data and yield return statement in a coroutine that will be called from the Update() function. When I try to run the code, I get the latest data from the API but when someone pushes any new data onto the API, it does not automatically get the latest data in real time and I have to restart the app to see the latest data.My Code:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.IO;

public class TextChange : MonoBehaviour {

    // Use this for initialization
    WWW get;
    public static string getreq;
    Text text;
    bool continueRequest = false;

    void Start()
    {
        StartCoroutine(WaitForRequest());
        text = GetComponent<Text>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    private IEnumerator WaitForRequest()
    {
        if (continueRequest)
            yield break;

        continueRequest = true;

        float requestFrequencyInSec = 5f; //Update after every 5 seconds
        WaitForSeconds waitTime = new WaitForSeconds(requestFrequencyInSec);

        while (continueRequest)
        {
            string url = "API Link goes Here";
            WWW get = new WWW(url);
            yield return get;
            getreq = get.text;
            //check for errors
            if (get.error == null)
            {
                string json = @getreq;
                List<MyJSC> data = JsonConvert.DeserializeObject<List<MyJSC>>(json);
                int l = data.Count;
                text.text = "Data: " + data[l - 1].content;
            }
            else
            {
                Debug.Log("Error!-> " + get.error);
            }

            yield return waitTime; //Wait for requestFrequencyInSec time
        }
    }

    void stopRequest()
    {
        continueRequest = false;
    }
}

public class MyJSC
{
    public string _id;
    public string author;
    public string content;
    public string _v;
    public string date;
}

推荐答案

这是因为服务器上启用了资源缓存.

This is happening because resources caching is enabled on the Server.

我知道的三种可能的解决方案:

1.禁用服务器上的资源缓存.每个网络服务器的说明都不同.通常在 .htaccess 中完成.

1.Disable resources caching on the server. Instructions are different for every web server. Usually done in .htaccess.

2.使每个请求都带有唯一的时间戳.时间应采用 Unix 格式.

2.Make each request with unique timestamp. The time should in Unix format.

此方法不适用于 iOS.你很好,因为这是 HoloLens.

This method will not work on iOS. You are fine since this is for HoloLens.

例如,如果您的 url 是 http://url.com/file.rar,则在末尾附加 ?t=currentTime.currentTimeUnix 格式的实际时间.

For example, if your url is http://url.com/file.rar, append ?t=currentTime at the end. currentTime is the actual time in Unix Format.

完整示例网址:http://url.com/file.rar?t=1468475141

代码:

string getUTCTime()
{
    System.Int32 unixTimestamp = (System.Int32)(System.DateTime.UtcNow.Subtract(new System.DateTime(1970, 1, 1))).TotalSeconds;
    return unixTimestamp.ToString();
}

private IEnumerator WaitForRequest()
{
    string url = "API Link goes Here" + "?t=" + getUTCTime();
    WWW get = new WWW(url);
    yield return get;
    getreq = get.text;
    //check for errors
    if (get.error == null)
    {
        string json = @getreq;
        List<MyJSC> data = JsonConvert.DeserializeObject<List<MyJSC>>(json);
        int l = data.Count;
        text.text = "Data: " + data[l - 1].content;
    }
    else
    {
        Debug.Log("Error!-> " + get.error);
    }
}

3.Disable 通过提供和修改 Cache-Control客户端 端缓存>Pragma 请求中的标头.

3.Disable Cache on the client side by supplying and modifying the Cache-Control and Pragma headers in the request.

设置 Cache-Control headermax-age=0, no-cache, no-store 然后设置 Pragma headerno-cache.

Set Cache-Control header to max-age=0, no-cache, no-store then set Pragma header to no-cache.

我建议您使用 UnityWebRequest 而不是 WWW 类来执行此操作.首先,包含using UnityEngine.Networking;.

I suggest you do this with UnityWebRequest instead of the WWW class. First, Include using UnityEngine.Networking;.

代码:

IEnumerator WaitForRequest(string url)
{

    UnityWebRequest www = UnityWebRequest.Get(url);
    www.SetRequestHeader("Cache-Control", "max-age=0, no-cache, no-store");
    www.SetRequestHeader("Pragma", "no-cache");

    yield return www.Send();
    if (www.isError)
    {
        Debug.Log(www.error);
    }
    else
    {
        Debug.Log("Received " + www.downloadHandler.text);
    }
}

这篇关于WWW/UnityWebRequest POST/GET 请求不会从服务器/url 返回最新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 06:44