gpt4 book ai didi

c# - 用于 HTTP 基本身份验证的 UnityWebRequest 嵌入用户 + 密码数据在 Android 上不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:39:24 26 4
gpt4 key购买 nike

下面的代码用于从托管在我们自己的系统之一中的 Thingworx 服务器获取温度值。 这在统一中工作得很好但在andoird中不是,一旦生成apk,它不会从服务器获取任何数据,而是会建立连接。但是,它只是不会获取数据并将其放入文本网格中。

我正在使用 unity 5.4.1 32bit 。 checkin 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:ZZh7y6dn@*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 list 权限

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:password@example.com)。那是因为这不是标准执行 HTTP 身份验证的方法。 Unity 或 Android 很可能没有在他们这边实现这一点。

我使用 http://Administrator:ZZh7y6dn@*IP Address*:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/ 在内置的 Android 浏览器上对此进行了测试,但它失败了功能。所以,我猜这个问题来自 Android。

我在没有用户名和密码的情况下再次测试 http://*IP Address**:8080/Thingworx/Things/SimulationData/Properties/OvenTemperature/ 然后登录窗口出现。当我输入用户名和密码时,它起作用了。

您仍然可以使用 UnityWebRequest 来解决这个问题,方法是使用 SetRequestHeaderUnityWebRequest 提供 AUTHORIZATION header > 功能。这仅在授权类型为 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";
}
}
}
}
}

关于c# - 用于 HTTP 基本身份验证的 UnityWebRequest 嵌入用户 + 密码数据在 Android 上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39482954/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com