UnityWebRequest嵌入用于HTTP基本身份验证的用户密码数据不适用于Android
以下代码用于从我们自己的系统中托管的Thingworx服务器获取温度值。 这在团结完美。 但不是在andoird中,一旦生成apk,它将不会从服务器获取任何数据,并且会建立连接。但是,它只是不会获取数据并将其放入文本网格中。UnityWebRequest嵌入用于HTTP基本身份验证的用户密码数据不适用于Android
我使用统一5.4.1 32位。检查同时在Android - 5.0.2和6
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Text.RegularExpressions;
using System;
using UnityEngine.UI;
public class GETTempValue : MonoBehaviour {
public GameObject TempText;
static string TempValue;
void Start()
{
StartCoroutine(GetText());
}
IEnumerator GetText()
{
Debug.Log("Inside Coroutine");
while (true)
{
yield return new WaitForSeconds(5f);
string url = "http://Administrator:[email protected]*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/";
Debug.Log("Before UnityWebRequest");
UnityWebRequest www = UnityWebRequest.Get (url);
yield return www.Send();
Debug.Log("After UnityWebRequest");
if (www.isError) {
Debug.Log ("Error while Receiving: "+www.error);
} else {
Debug.Log("Success. Received: "+www.downloadHandler.text);
string result = www.downloadHandler.text;
Char delimiter = '>';
String[] substrings = result.Split(delimiter);
foreach (var substring in substrings)
{
if (substring.Contains ("</TD"))
{
String[] Substrings1 = substring.Split ('<');
Debug.Log (Substrings1[0].ToString()+"Temp Value");
TempValue = Substrings1 [0].ToString();
TempText.GetComponent<TextMesh>().text = TempValue+"'C";
}
}
}
}
}
}
这是Android清单许可
uses-permission android:name="android.permission.INTERNET"
uses-permission android:name="android.permission.CAMERA"
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
在URL中嵌入用户名和密码(http://username:[email protected]
)在一些应用和操作系统不再支持出于安全原因。这是因为这不是执行HTTP身份验证的标准方式。 Unity或Android很可能没有实现这一点。
我在内置Android浏览器上用http://Administrator:[email protected]*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/
进行了测试,结果失败。所以,我猜这个问题来自Android。
我再次测试没有用户名和密码http://*IP Address**:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/
然后出现登录窗口。当我输入用户名和密码时,它工作。
你仍然可以使用UnityWebRequest
通过提供AUTHORIZATION
头到UnityWebRequest
与SetRequestHeader
功能来解决这个问题。这只适用于授权类型为Basic
而不是Digest
。在你的情况下,它是HTTP Basic
。
对于一般的解决方案:
string authenticate(string username, string password)
{
string auth = username + ":" + password;
auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth));
auth = "Basic " + auth;
return auth;
}
IEnumerator makeRequest()
{
string authorization = authenticate("YourUserName", "YourPassWord");
string url = "yourUrlWithoutUsernameAndPassword";
UnityWebRequest www = UnityWebRequest.Get(url);
www.SetRequestHeader("AUTHORIZATION", authorization);
yield return www.Send();
.......
}
对于你的问题的解决方案:
public GameObject TempText;
static string TempValue;
void Start()
{
StartCoroutine(GetText());
}
string authenticate(string username, string password)
{
string auth = username + ":" + password;
auth = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth));
auth = "Basic " + auth;
return auth;
}
IEnumerator GetText()
{
WaitForSeconds waitTime = new WaitForSeconds(2f); //Do the memory allocation once
string authorization = authenticate("Administrator", "ZZh7y6dn");
while (true)
{
yield return waitTime;
string url = "http://*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/";
UnityWebRequest www = UnityWebRequest.Get(url);
www.SetRequestHeader("AUTHORIZATION", authorization);
yield return www.Send();
if (www.isError)
{
Debug.Log("Error while Receiving: " + www.error);
}
else
{
string result = www.downloadHandler.text;
Char delimiter = '>';
String[] substrings = result.Split(delimiter);
foreach (var substring in substrings)
{
if (substring.Contains("</TD"))
{
String[] Substrings1 = substring.Split('<');
Debug.Log(Substrings1[0].ToString() + "Temp Value");
TempValue = Substrings1[0].ToString();
TempText.GetComponent<TextMesh>().text = TempValue + "'C";
}
}
}
}
}
而不是做所有这些字符串操作,请考虑在Unity中的Json。这比你的代码中的所有字符串操作都强大得多。 [Json文档](https://docs.unity3d.com/ScriptReference/JsonUtility.html)和[Json派生示例](http://stackoverflow.com/questions/36239705/deserialization-of-json-using-minijson- in-unity-c-sharp/36244111#36244111) – Programmer
非常感谢您的帮助。有效 !!! –
你并不需要包括允许一个清单,以便使用'UnityWebRequest'。请删除该权限。 Unity会为你生成它。至于你的问题,所提供的信息不足以帮助你。您需要在'return return www.Send()'之后并在'if(www.isError)'声明中放置Debug.Log。这将帮助我们知道你失败的地方。编辑并在你的问题中包含这个。另外,这是一个本地服务器? – Programmer
@Programmer是的,它是一个本地服务器,它是公开的。我从上面的代码从这个答案我的[问题](http://stackoverflow.com/questions/39031641/retrieving-data-from-rest-api-in-unity-without-lag-or-jitter-using- c-sharp/39031840?noredirect = 1#comment65749849_39031840)。你在调试日志中想要什么,这有助于解决问题?我很乐意为您提供更多信息。 –
我用'Debug.Log'更新了这个问题。运行该程序,然后编辑问题并将日志放在它下面。如果您可以公开您的服务器并提供网址,我也可以尝试一下,看看有什么不对。 – Programmer