Unity は httpClient を使用してサーバーと通信し、litJson はデータを解析し、webGl プラットフォームを公開して、Newtonsoft.Json ツールを使用してエラーを報告します。

1. 最初に、HttpWebRequest、WebClient、および HttpClient の違いについて説明します。

HttpWebRequest を使用すると、開発者は、タイムアウト、Cookie、ヘッダー、プロトコルなど、要求/応答プロセスのさまざまな側面を制御できます。もう 1 つの利点は、HttpWebRequest クラスが UI スレッドをブロックしないことです。たとえば、応答の遅い API サーバーから大きなファイルをダウンロードしても、アプリの UI は応答を停止しません。HttpWebRequest は通常、WebResponse と一緒に使用されます。1 つはリクエストの送信用で、もう 1 つはデータの取得用です。HttpWebRquest はより低レベルであり、アクセス プロセス全体を直感的に理解できますが、より複雑でもあります。

WebClient は、最も一般的なタスクを簡素化するために HttpWebRequest によって作成された高レベルの抽象化です. 使用中に、基本的なヘッダーと時間のかかる設定が欠けていることがわかりますが、これらは httpwebrequest を継承することによって実現できます. 相対的に言えば、WebClient は WebRequest よりも単純であり、リクエスト メソッドとレスポンス メソッドをカプセル化することに相当しますが、Webclient と WebRequest は異なるクラスを継承し、継承の関係はありません。WebClient を使用すると、HttpWebRequest を直接使用するよりも遅くなる可能性があります (約数ミリ秒) が、単純で多くの詳細が削減され、コードの量も比較的少なくなります。

HttpClient は .NET4.5 で導入された HTTP クライアント ライブラリです. その名前空間は System.Net.Http です. .NET 4.5 より前では、WebClient と HttpWebRequest を使用して同じ目的を達成することができました. HttpClient は、最新のタスク指向のパターンを利用して、非同期要求を簡単に処理できるようにします。複数のリクエスト操作に適しています. 通常、デフォルトのヘッダーを設定した後、繰り返しリクエストを行うことができます. 基本的には、任意の HTTP リクエストを 1 つのインスタンスで送信できます. HttpClient にはウォームアップ機構があり、初回アクセス時は比較的遅いため、HttpClient を使用せずに新しいものを作成するだけで、シングルトンまたは他の方法を使用して HttpClient のインスタンスを取得する必要があります

2.私はここでunity2021.2.8であり、json解析の落とし穴を含め、長い間研究してきました

コードに直接

using UnityEngine;
using System.Net.Http;
using System;
using System.Threading.Tasks;
using LitJson;
// TSingleton是单例继承
public class HttpHelp : TSingleton<HttpHelp>
{
    HttpClient m_client = null;

    private string m_url = GameConfig.Url;

    public HttpHelp()
    {
        m_client = new HttpClient();
        m_client.MaxResponseContentBufferSize = 256000;// 最大返回的字节数
        m_client.Timeout = TimeSpan.FromMilliseconds(15000);// 超时时间
        // json解析的格式化添加
        LitJson.JsonMapper.RegisterImporter<long, int>((long input) => { return (int)input; });
        LitJson.JsonMapper.RegisterImporter<int, long>((int input) => { return (long)(input); });
    }
    // 回调方法
    public delegate void OnNetBack(object eventObj);
    public string Get(string url)
    {
        try
        {
            var responseString = m_client.GetStringAsync(url);
            return responseString.Result;
        }
        catch (Exception ex)
        {
            return null;
        }
    }

    public string Post(string url, string strJson)//post同步请求方法
    {
        try
        {
            HttpContent content = new StringContent(strJson);
            content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            //client.DefaultRequestHeaders.Connection.Add("keep-alive");
            //由HttpClient发出Post请求
            Task<HttpResponseMessage> res = m_client.PostAsync(url, content);
            if (res.Result.StatusCode == System.Net.HttpStatusCode.OK)
            {
                string str = res.Result.Content.ReadAsStringAsync().Result;
                return str;
            }
            else
            {
                if (res.Result.StatusCode == System.Net.HttpStatusCode.RequestTimeout)
                {// 请求超时
                    UIManager.Instance.ShowTips("request time out!");
                    Debug.LogWarning("request time out !");
                }
                return null;
            }
        }
        catch (Exception ex)
        {
            Debug.LogException(ex);
            return null;
        }
    }

    public async Task<string> PostAsync(string url, string strJson)//post异步请求方法
    {
        try
        {
            HttpContent content = new StringContent(strJson);
            content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
            //由HttpClient发出异步Post请求
            HttpResponseMessage res = await m_client.PostAsync(url, content);
            if (res.StatusCode == System.Net.HttpStatusCode.OK)
            {
                string str = res.Content.ReadAsStringAsync().Result;
                return str;
            }
            else
            {
                if (res.StatusCode == System.Net.HttpStatusCode.RequestTimeout)
                {// 请求超时
                    UIManager.Instance.ShowTips("request time out!");
                    Debug.LogWarning("request time out !");
                }
                return null;
            }
        }
        catch (Exception ex)
        {
            Debug.LogException(ex);
            return null;
        }
    }

    public async void SendMsg<T>(int cmd, object param, OnNetBack callback)
    {
        
        RequestBaseData bas = new RequestBaseData();// 请求的数据结构体
        bas.setMessage(cmd, JsonMapper.ToJson(param));// 设置命令code和数据
        var jsonContent = new StringContent(JsonMapper.ToJson(bas));// 吧结构体数据stringJson
// 设置数据格式
        jsonContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");

        string res = await this.PostAsync(m_url, JsonMapper.ToJson(bas));
        if (res == null)
        {// 关闭菊花
            UIManager.Instance.ShowLoading(false);
            return;
        }
       // 吧返回的json数据解析成结构体
        ResponseBaseData data = JsonMapper.ToObject<ResponseBaseData>(@res);
        if (data.errorCode != 0)
        {
           // 服务器返回的错误码提示
            string reason = "request error status: "+m_url + cmd;
            Debug.LogError(reason);
            UIManager.Instance.ShowTips(data.errorCode.ToString());
        }
        else
        {
           
            if (data.sysMessage != null)
            {// 同步用户/心跳数据
                if (callback != null) callback(data.sysMessage);
            }
            else
            {
                // 格式化类型数据
                T t = JsonMapper.ToObject<T>(data.message);
                if (callback != null) callback(t);
            }
        }
        UIManager.Instance.ShowLoading(false);
    }

    public void SetUrl(string ip, int port)
    {
        m_url = @"http://" + ip + ":" + port;
    }
}
[Serializable]
// 请求数据
public class RequestBaseData
{
    public int code;
    public int eId = 0;
    public int isCheck = 0;
    public string message;
    public string playerId;
    public int pwd = 0;
    public string sessionKey;
    public int version = 266;
    public void setMessage(int code1, string message1)
    {
        message = message1;
        code = code1;
    }
}


// 返回数据
[Serializable]
public class ResponseBaseData
{
    public string code { get; set; }
    public int errorCode { get; set; }
    public string execution { get; set; }
    public string message { get; set; }
    public SysMessage sysMessage { get; set; }
    public string time { get; set; }
}

メソッド Direct を呼び出します。たとえば、ResponseLogin は返されたデータ分析の構造です。コールバックを受け取った後、オブジェクト タイプを直接強制します。

 HttpHelp.Instance.SendMsg<ResponseLogin>(HttpCode.Email_Login, data, (obj)=> {                 ResponseLogin data = obj as ResponseLogin;             });

3. json 解析の問題はプラットフォームによって異なります

さらに、この LitJson または Newtonsoft.Json を json 分析に使用できます. dll をダウンロードして、プロジェクトの Assets->Plugins の下に直接配置できます. それでもコード内の参照が見つからない場合は、右クリックしてくださいプロジェクト vs 追加 -> 既存のアイテム、dll を選択

しかし、Newtonsoft の分析では、webGl に発行できません。エラーが発生します。おそらく、実装メソッドが js でリフレクションをサポートしていないためです。エラーは次のとおりです: platformNotSupportedException: Operation is not supported on this platform. at System.Reflection.Emit.DynamicMethod . . ..

LitJson を使用して解析することをお勧めします。

おすすめ

転載: blog.csdn.net/github_38633141/article/details/123137557