问题描述
我正在使用 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
.currentTime
是 Unix 格式的实际时间.
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
header 为 max-age=0, no-cache, no-store
然后设置 Pragma
header 到 no-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 返回最新数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!