我一直在尝试在支持 64 位(IL2CPP 构建)的 android 构建上简单地调用 api,而 UnityWebRequest 类似乎不起作用。它是通过一个简单的 ui 按钮单击来调用的。它击中webRequest.SendWebRequest();
并没有任何反应。我尝试了以下示例。一,直接来自 UnityWebRequest 的 Unity 文档和其他使用标准 HttpClient 的文档。
UnityWeb请求:
IEnumerator GetRequest(string uri)
{
using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
{
webRequest.SetRequestHeader("Authorization", "Bearer " + API_KEY);
yield return webRequest.SendWebRequest();
if (webRequest.isNetworkError)
{
debugText.text = ": Error: " + webRequest.error;
coroutineAllowed = false;
}
else
{
debugText.text = ":\nReceived: " + webRequest.downloadHandler.text;
dynamic jsonObj = JsonConvert.DeserializeObject(webRequest.downloadHandler.text);
foreach (var obj in jsonObj["businesses"])
{
businessResults.Add(new Business()
{
name = (string)obj["name"],
image_url = (string)obj["image_url"],
review_count = (string)obj["review_count"],
rating = (string)obj["rating"],
Coordinates = new Coordinates()
{
Latitude = (float)obj["coordinates"]["latitude"],
Longitude = (float)obj["coordinates"]["longitude"]
},
price = (string)obj["price"]
});
}
debugText.text = businessResults.Count.ToString();
//coroutineAllowed = true;
}
debugText.text = "getRequest 4";
}
}
不幸的是,这在yield return webRequest.SendWebRequest();
我尝试的下一个示例是使用 HttpClient():
IEnumerator HttpClientCall(string uri) //possibly wrap in IEnumerator
{
debugText.text += "http coroutine started" +Environment.NewLine;
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", API_KEY);
var response = httpClient.GetAsync(uri);
if (response.Result.StatusCode != HttpStatusCode.OK)
{
debugText.text += "FAILED HTTP GET";
}
yield return response.Result.Content.ReadAsStringAsync();
dynamic jsonObj = JsonConvert.DeserializeObject(response.Result.Content.ReadAsStringAsync().Result);
foreach (var obj in jsonObj["businesses"])
{
businessResults.Add(new Business()
{
name = (string)obj["name"],
image_url = (string)obj["image_url"],
review_count = (string)obj["review_count"],
rating = (string)obj["rating"],
Coordinates = new Coordinates()
{
Latitude = (float)obj["coordinates"]["latitude"],
Longitude = (float)obj["coordinates"]["longitude"]
},
price = (string)obj["price"]
});
debugText.text += Environment.NewLine + ((string)obj["name"]);
}
}
}
再一次,当它击中时什么都没有yield return response.Result.Content.ReadAsStringAsync();
这些都可以在 PC 上运行,并且它们都返回了我期望的结果。
我听到的下一件事是关于设置 android manifest 应用程序标签android:usesCleartextTraffic="true"
不幸的是,这对我也没有用,哈哈。我知道它必须是 64 支持,因为这适用于标准构建。当我使用 64 支持构建时,它不起作用。
关于为什么它没有正确返回的任何帮助都会非常有帮助。
旁注,我知道代码很丑陋,但是在我弄清楚为什么构建在设备上不起作用之后,将进行大量的重构。提前致谢!