在Unity中的三种Http通信方式

1、WWW(基于协程,不适用于线程)

IEnumerator WWWGet()
{
    using (WWW www = new WWW("http://127.0.0.1:9997/gameInit?uid=7"))
    {
        yield return www;
        if (www.error != null)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log(www.text.ToString());
        }
        www.Dispose();//释放
    }
}
IEnumerator WWWPost()
{
    Dictionary hash = new Dictionary();
    hash.Add("Content-Type", "application/json");
    string data = "{\"Name\":\"zhangsan\",\"Password\":\"123456\"}";
    byte[] bs = System.Text.UTF8Encoding.UTF8.GetBytes(data);
    WWW www = new WWW("http://127.0.0.1:9997/login", bs, hash);
    
    yield return www;
    if (www.error != null)
    {
            Debug.Log(www.error);
    }
    else
    {
        Debug.Log(www.text.ToString());
    }
    www.Dispose();//释放
}

2、UnityWebRequest(基于协程,不适用于线程)

IEnumerator GetRequest()
{
    string url = "https://www.baidu.com/";
    using (UnityWebRequest webRequest = UnityWebRequest.Get(url))
    {

        //设置header
        webRequest.SetRequestHeader("Content-Type", "application/json");
        webRequest.SetRequestHeader("authKey", "leohui");

        yield return webRequest.SendWebRequest();

        if (webRequest.isHttpError || webRequest.isNetworkError)
        {
            Debug.LogError(webRequest.error);
        }
        else
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}
IEnumerator PostRequest()
{
    string url = "https://www.baidu.com/";
    using (UnityWebRequest webRequest = new UnityWebRequest(url, "POST"))
    {
        string data = "{\"Name\":\"zhangsan\",\"Password\":\"123456\"}";
        byte[] bodyRaw = Encoding.UTF8.GetBytes(data);
        webRequest.uploadHandler = (UploadHandler) new UploadHandlerRaw(bodyRaw);
        webRequest.downloadHandler = (DownloadHandler) new DownloadHandlerBuffer();

        //设置header
        webRequest.SetRequestHeader("Content-Type", "application/json");
        webRequest.SetRequestHeader("authKey", "leohui");

        yield return webRequest.SendWebRequest();

        if (webRequest.isHttpError || webRequest.isNetworkError)
        {
            Debug.LogError(webRequest.error);
        }
        else
        {
            Debug.Log(webRequest.downloadHandler.text);
        }
    }
}

3、HttpWebRequest(C#原生的HttpWebRequest,同步接口,阻塞等待结果返回,适用于线程)

在Unity中,使用C#原生的HttpWebRequest,若是数据较大,会卡顿,主要因为Unity单线程,HttpWebRequest不能异步执行,但适用于多线程。

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.ReadWriteTimeout = ReadWriteTimeOut;
request.Timeout = TimeOutWait;
//设置Range值,断点续传
request.AddRange((int)startPos);
HttpWebResponse respone = (HttpWebResponse)request.GetResponse();
Stream ns = respone.GetResponseStream();
ns.ReadTimeout = TimeOutWait;
byte[] bytes = new byte[oneReadLen];
int readSize = ns.Read(bytes, 0, oneReadLen); // 读取第一份数据
while (readSize > 0)
{
     fs.Write(bytes, 0, readSize); // 将下载到的数据写入临时文件
     // 往下继续读取
     readSize = ns.Read(bytes, 0, oneReadLen);
}

你可能感兴趣的:(在Unity中的三种Http通信方式)