首页 > 解决方案 > 在获取 HTTP 请求后,对 JSON 的 LINQ 查询在移动设备上不会返回任何值,但在 Windows 上会返回

问题描述

我发送一个 HTTP 请求并接收一个 JSON。我在类结构中列出了 JSON 格式。Linq 查询此 json 并提交下一个场景的幂(变量)。

当我在 PC 上运行时,这适用于我的 Unity 编辑器。但是,当我在我的 Android 上构建和运行时,即使 HTTP 请求成功,它也不会从查询中返回任何值。

private void SendJson(string currPlayer)
    {
        string bodyJsonString = "{\"player_id\":\"" + currPlayer + "\"}";
        string currURI = djangoApi + userOwnedMarbles;
        StartCoroutine(PostRequestCoroutine(currURI, bodyJsonString));
    }

    private IEnumerator PostRequestCoroutine(string url, string json)
    {
        var jsonBinary = System.Text.Encoding.UTF8.GetBytes(json);

        DownloadHandlerBuffer downloadHandlerBuffer = new DownloadHandlerBuffer();

        UploadHandlerRaw uploadHandlerRaw = new UploadHandlerRaw(jsonBinary);
        uploadHandlerRaw.contentType = "application/json";

        UnityWebRequest www =
            new UnityWebRequest(url, "POST", downloadHandlerBuffer, uploadHandlerRaw);

        yield return www.SendWebRequest();

        if (www.isNetworkError)
            Debug.LogError(string.Format("{0}: {1}", www.url, www.error));
        else
        {
            string test = string.Format("{0}", www.downloadHandler.text);
            JObject myJson = JObject.Parse(test);
            Debug.Log("welcome" + test);

            var welcome2 = Welcome.FromJson(www.downloadHandler.text);

            CurrPower.numberColorBombs = welcome2.Marbles.Count(n => n.Nickname.ToLower() == "Corkscrew Swirl".ToLower());
            CurrPower.myPowerups[0] = CurrPower.numberColorBombs;

            CurrPower.numberVerticalBombs = welcome2.Marbles.Count(n => n.Nickname.ToLower() == "Clearie".ToLower());
            CurrPower.myPowerups[1] = CurrPower.numberVerticalBombs;

            CurrPower.numberHorizontalBombs = welcome2.Marbles.Count(n => n.Nickname.ToLower() == "Cloud".ToLower());
            CurrPower.myPowerups[2] = CurrPower.numberHorizontalBombs;

            CurrPower.numberAdjacentBombs = welcome2.Marbles.Count(n => n.Nickname.ToLower() == "Onionskin".ToLower());
            CurrPower.myPowerups[3] = CurrPower.numberAdjacentBombs;

            CurrPower.numberSingleBombs = welcome2.Marbles.Count(n => n.Nickname.ToLower() == "Bullseye".ToLower());
            CurrPower.myPowerups[4] = CurrPower.numberSingleBombs;
        }            
    }

Welcome2包含具有 json 对象的所有元素的部分类。Android不能很好地处理LINQ吗?

AndroidLauncherManifest.xml是我编辑过的文件

<?xml version="1.0" encoding="utf-8"?>
<!-- GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.unity3d.player" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:usesCleartextTraffic="true" tools:ignore="GoogleAppIndexingWarning" android:label="@string/app_name" android:icon="@mipmap/app_icon" />
  <uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
</manifest>

标签: c#androidlinqunity3dhttprequest

解决方案


这是安卓设备的一个众所周知的问题。去年的谷歌更新使 9.0(pie) 或更高版本的安卓设备默认只接受来自所有应用程序的 HTTPS 请求。

您可以通过修改 XML 清单文件来解决此问题。这是您需要添加的内容:

android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning">
<uses-library
    android:name="org.apache.http.legacy"
    android:required="false" />

注意其中一些标签可能已经存在,您只需要修改属性。如果您迷路了,可以查看链接以获得更多解释

希望它有所帮助:)


推荐阅读