Unity usa HTTPS para solicitar dados

  • Solicitação não assíncrona:
  1. solicitação de postagem:
    /// <summary>
    /// 回调验证证书
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="certificate"></param>
    /// <param name="chain"></param>
    /// <param name="errors"></param>
    /// <returns></returns>
    public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
        return true; // 总是接受    
    }


    /// <summary>
    /// HTTPS Post请求
    /// </summary>
    /// <param name="URL">访问地址</param>
    /// <param name="strPostData">携带数据</param>
    /// <param name="func">回调lua方法</param>
    /// <returns></returns>
    public void HttpsPost(string URL, string strPostData, LuaFunction func)
    {
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
        Encoding encoding = Encoding.UTF8;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.CookieContainer = new CookieContainer();
        request.Method = "POST";
        request.Accept = "text/html, application/xhtml+xml, *";
        request.ContentType = "application/x-www-form-urlencoded";

        byte[] buffer = encoding.GetBytes(strPostData);
        request.ContentLength = buffer.Length;
        request.GetRequestStream().Write(buffer, 0, buffer.Length);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
        {
            func.Call(reader.ReadToEnd());
        }
    }

func é chamado de volta para Lua e os dados retornados foram obtidos em reader.ReadToEnd();

O método CheckValidationResult() é para verificação de certificado. O certificado é ignorado toda vez que é verificado. O certificado no projeto é um conjunto de verificação de certificado escrito pelos próprios alunos do servidor, portanto, ignore-o sempre.

  1. obter solicitação:
    /// <summary>
    /// HTTPS Post请求
    /// </summary>
    /// <param name="URL">访问地址</param>
    /// <param name="strPostData">携带数据</param>
    /// <param name="func">回调lua方法</param>
    /// <returns></returns>
    public void HttpsPost(string URL, string strPostData, LuaFunction func)
    {
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
        Encoding encoding = Encoding.UTF8;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);
        request.CookieContainer = new CookieContainer();
        request.Method = "POST";
        request.Accept = "text/html, application/xhtml+xml, *";
        request.ContentType = "application/x-www-form-urlencoded";

        byte[] buffer = encoding.GetBytes(strPostData);
        request.ContentLength = buffer.Length;
        request.GetRequestStream().Write(buffer, 0, buffer.Length);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
        {
            func.Call(reader.ReadToEnd());
        }
    }
    /// <summary>
    /// HTTPS get请求
    /// </summary>
    /// <param name="url">访问地址</param>
    /// <param name="func">lua回调</param>
    public void HTTPSGet(string url, LuaFunction func)
    {
        try
        {
            ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
            HttpWebRequest req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url));
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            Stream stream = res.GetResponseStream();
            using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("utf-8")))
            {
                func.Call(reader.ReadToEnd());
            }
        }
        catch (System.Exception ex)
        {
            Debug.LogError(ex);
        }
    }
  • Solicitação assíncrona:

Se o jogo usar Socket, se a rede não for boa e HTTPS for usado, o servidor não responderá, o que fará com que o thread principal trave e afete a comunicação do soquete, portanto, operações assíncronas devem ser utilizadas no projeto. Aqui está o código assíncrono:

 public void HttpsPostAsyn(string url, string strPostData, LuaFunction func)
    {
        Asyncdelegate isgt = new Asyncdelegate(Commit);
         IAsyncResult ar = isgt.BeginInvoke(url, strPostData, func, null, new AsyncCallback(CallbackMethod), isgt);

    }

    //定义委托
    public delegate void Asyncdelegate(string url, string strPostData, LuaFunction func, WebProxy objName);

    //异步调用完成时,执行回调方法
    private void CallbackMethod(IAsyncResult ar)
    {
        Asyncdelegate dlgt = (Asyncdelegate)ar.AsyncState;
        dlgt.EndInvoke(ar);
        Debug.Log("dlgt:" + dlgt);
        Debug.Log("ar:" + ar);
    }


    //向APM接口提交数据
    //为什么要用WebProxy,因为.Net 4.0以下没有Host属性,无法设置标头来做DNS重连
    public virtual void Commit(string url, string strPostData, LuaFunction func, WebProxy objName = null)
    {
        ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);
        string ret = string.Empty;
        string ip = string.Empty;
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";//
            request.Timeout = 30000;
            request.ContentType = "application/x-www-form-urlencoded";
            request.ServicePoint.Expect100Continue = false;
            if (objName != null)
            {
                request.Proxy = objName;
            }
            Debug.Log("strPostData:" + strPostData);

            //strPostData = UrlEncode(strPostData);
            Debug.Log("strPostData:" + strPostData);
            byte[] byteArray = Encoding.UTF8.GetBytes(strPostData);
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();
            WebResponse response = request.GetResponse();
            dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Debug.Log("responseFromServer:" + responseFromServer);
            func.Call(responseFromServer);
            reader.Close();
            dataStream.Close();
            response.Close();
        }
        catch (WebException ex)
        {
            Debug.LogError("链接失败:" + ex.Status.ToString());
            if (ex.Status.ToString().Equals("NameResolutionFailure"))//域名解释错误,重连一次,重新获取域名ip,用ip来拼接提交
            {
                //ip = this.DnRetryGet("域名");
                //if (ip.Equals("0"))
                //{
                //    return
                //}
                //WebProxy proxy = new WebProxy(ip, 80);
                //this.Commit(proxy);
            }
        }
    }

PS: Ao enviar dados, pode ser carregado algum '+''*', que será analisado em "espaços" pelo servidor em C# e Java. Se isso acontecer, você pode usar

WWW.EscapeURL agrupa os dados que estão sendo enviados.

Devido às necessidades do projeto, um método pode ser dividido em um método para sua referência.

 public string UrlEncode(string str)
    {
        string[] s1 = str.Split('&');
        string encodeStr = "";
        for (int i = 0; i < s1.Length; i++)
        {
            string[] s1Split = s1[i].Split('=');
            if (i == s1.Length - 1)
            {
                encodeStr = encodeStr + WWW.EscapeURL(s1Split[0]) + "=" + WWW.EscapeURL(s1Split[1]);
            }
            else
            {
                encodeStr = encodeStr + WWW.EscapeURL(s1Split[0]) + "=" + WWW.EscapeURL(s1Split[1]) + "&";
            }

        }
        return encodeStr;
    }

 

Acho que você gosta

Origin blog.csdn.net/qq_33515628/article/details/102914541
Recomendado
Clasificación