Unity常用网络请求方式

引子

小编这两天在测试API接口,主要是用Postman和Unity上写的程序来做测试,刚刚好给大家分享一下Unity中常用的网络请求方式吧

Unity网络请求程序演练

UnityWebRequest

UnityWebRequest 是 Unity 5.2 引入的一个新的 API,可以用来进行 HTTP、HTTPS、FTP 等协议的网络请求。它支持异步请求,支持 GET、POST等请求方式。UnityWebRequest 能够处理大部分常见的 HTTP 状态响应码,如 404(未找到)、302(重定向)、500(服务器内部错误)等。UnityWebRequest 也支持上传和下载文件,以及在后台运行请求

GET请求

以下是一个使用UnityWebRequest发送GET请求的示例:

IEnumerator GetRequest(string url)
{
    UnityWebRequest request = UnityWebRequest.Get(url);

    yield return request.SendWebRequest();

    if (request.result != UnityWebRequest.Result.Success)
    {
        Debug.Log(request.error);
    }
    else
    {
        Debug.Log(request.downloadHandler.text);
    }
}
 

你可以将该函数添加到MonoBehaviour脚本中,并在需要的时候调用它。例如:

void Start()
{
    string url = "https://jsonplaceholder.typicode.com/todos/1";
    StartCoroutine(GetRequest(url));
}

POST请求

以下是使用UnityWebRequest发送POST请求的示例代码:

string url = "http://example.com/api/user/login";
string data = "{\"username\":\"test\",\"password\":\"123456\"}";

UnityWebRequest request = new UnityWebRequest(url, "POST");
byte[] bodyRaw = Encoding.UTF8.GetBytes(data);
request.uploadHandler = new UploadHandlerRaw(bodyRaw);
request.downloadHandler = new DownloadHandlerBuffer();
request.SetRequestHeader("Content-Type", "application/json");

yield return request.SendWebRequest();

if (request.result == UnityWebRequest.Result.Success)
{
    string responseText = request.downloadHandler.text;
    // 处理服务器返回的数据
}
else
{
    Debug.LogError(request.error);
}

在上述示例中,我们使用了 UnityWebRequest 对象来发起一个 POST 请求。我们首先定义了请求目标的 URL 和请求体的数据。接下来创建了一个 UnityWebRequest 类型的对象,指定了请求的方法为 POST,设置了请求体,并指定了请求头。然后通过 SendWebRequest 方法来发送请求。请求发送成功后,我们可以从 downloadHandler 属性中获取服务器的响应数据,并进行相应的处理。如果请求发送失败,则可以从 error 属性获取错误信息。

WWW

WWW 是 Unity 3D 早期版本使用的网络请求类。它很容易使用,可以用来加载图片、音频、视频等资源,也可以用来进行 HTTP 请求。不过,WWW 类没有 UnityWebRequest 强大,它不能很好地处理 HTTP 状态响应码,也不支持上传和下载文件

GET请求

以下是一个简单的Unity WWW Get请求示例:

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {

    void Start () {
        StartCoroutine(GetText());
    }

    IEnumerator GetText() {
        // 向http://www.example.com发送GET请求
        using (WWW www = new WWW("http://www.example.com")) {
            yield return www; // 等待请求完成

            // 检查是否有错误
            if (string.IsNullOrEmpty(www.error)) {
                Debug.Log("Response: " + www.text);
            } else {
                Debug.Log("Error: " + www.error);
            }
        }
    }
}

在这个例子中,我们向http://www.example.com发送一个GET请求,并等待它完成。一旦请求完成,我们检查是否有错误,并输出服务器返回的文本。请注意,我们使用了协程,因为WWW请求在Unity中是异步的,因此我们需要等待它完成

POST请求

以下是使用Unity发送POST请求的示例代码:

IEnumerator Post(string url, string data)
{
    // 将数据转换为字节数组
    byte[] postData = Encoding.UTF8.GetBytes(data);

    // 创建一个Web请求
    UnityWebRequest request = UnityWebRequest.Post(url, "POST");

    // 设置请求体中的数据
    request.uploadHandler = new UploadHandlerRaw(postData);

    // 设置请求头中的内容类型
    request.SetRequestHeader("Content-Type", "application/json");

    // 发送请求
    yield return request.SendWebRequest();

    // 检查请求是否发生错误
    if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.Log("POST请求错误:" + request.error);
    }
    else
    {
        // 获取响应数据
        string response = request.downloadHandler.text;

        // 处理响应数据
        Debug.Log("POST请求响应:" + response);
    }
}

使用示例:

StartCoroutine(Post("https://httpbin.org/post", "{\"name\": \"test\"}"));

该示例将发送一个POST请求到https://httpbin.org/post网址,并携带一个名为test的JSON数据。您可以根据需要修改url和data参数来发送不同的请求。

HttpClient

HttpClient 是一个.NET 的 Http 编程库,可以用来在 Unity 中进行网络请求。它支持异步请求,支持 GET、POST 等请求方式。不过,HttpClient 是一个独立的 .NET 库,需要手动将其导入项目中

GET请求

下面是一个使用C#中HttpClient类发起GET请求的示例代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        using var client = new HttpClient();
        // 设置请求头信息,可选
        client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
        try
        {
            // 发起GET请求
            var response = await client.GetAsync("https://www.example.com/");
            response.EnsureSuccessStatusCode(); // 确保响应成功
            var responseBody = await response.Content.ReadAsStringAsync(); // 获取响应主体内容
            Console.WriteLine(responseBody);
        }
        catch (HttpRequestException e)
        {
            Console.WriteLine($"请求失败:{e.Message}");
        }
    }
}

这个示例使用了HttpClient类中的GetAsync方法发起GET请求,并使用EnsureSuccessStatusCode方法确保响应成功。响应的主体内容可以使用ReadAsStringAsync方法获取。在请求之前,可以使用DefaultRequestHeaders属性设置请求头信息,也可以在发送请求时传递HttpHeaders对象作为参数实现。

POST请求

以下是使用Unity中的HttpClient进行POST请求的示例:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;

public class HttpClientExample : MonoBehaviour {
    async void Start() {
        var values = new Dictionary {
            { "username", "example_user" },
            { "password", "example_password" }
        };

        var content = new FormUrlEncodedContent(values);

        using (var client = new HttpClient()) {
            var response = await client.PostAsync("http://example.com/api/login", content);

            var responseString = await response.Content.ReadAsStringAsync();

            var responseData = JsonConvert.DeserializeObject(responseString);
            
            Debug.Log("Login Status: " + responseData.success);
            Debug.Log("User ID: " + responseData.user_id);
        }
    }
}

public class LoginResponse {
    public bool success { get; set; }
    public string user_id { get; set; }
}

在这个示例中,我们创建了一个Dictionary对象来存储POST请求的参数,然后使用FormUrlEncodedContent将其转换为可以发送到服务器的内容。我们将POST请求发送到“http://example.com/api/login”地址,并使用HttpClient来处理响应。最后,我们使用JsonConvert将响应数据反序列化为LoginResponse对象,并将其输出到Unity的控制台中。

请注意,由于HttpClient是异步的,我们在使用它时必须使用async和await关键字。这将确保我们的应用程序在等待响应时不会被挂起。

RESTful API

是一种基于 HTTP 协议的 API 接口,它使用 HTTP 的 POST、GET、DELETE、PUT 等方法来进行资源的操作。在 Unity 中,可以使用 UnityWebRequest、HttpClient 等类库来调用 RESTful API 接口

GET请求

下面是一个基本的Unity中使用RESTful API进行GET请求的示例代码:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;

public class RESTfulAPIExample : MonoBehaviour {
    IEnumerator Start() {
        // 设置请求的url
        string url = "http://www.example.com/api/data";

        // 创建GET请求对象
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.ContentType = "application/json";

        // 发送请求并获取响应信息
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader reader = new StreamReader(stream, Encoding.UTF8);
        string result = reader.ReadToEnd();
        reader.Close();
        response.Close();

        // 处理响应数据
        Debug.Log(result);

        yield return null;
    }
}

以上代码片段通过使用Unity的协程功能,向指定的url(即http://www.example.com/api/data)发送GET请求,并从响应中获取数据并打印到控制台中。该请求使用了application/json的Content-Type头部,如果需要使用其他类型的Content-Type,需要进行相应的修改。

需要注意,以上代码中的请求均为同步请求,如果需要使用异步请求或其他更高级的功能,需要进行相应的扩展和修改。

POST请求

下面是一个使用Unity的C#代码示例,用于向RESTful API发送POST请求:

IEnumerator PostRequest(string url, string jsonData)
{
    UnityWebRequest request = UnityWebRequest.Post(url, "POST");
    byte[] bodyRaw = Encoding.UTF8.GetBytes(jsonData);
    request.uploadHandler = new UploadHandlerRaw(bodyRaw);
    request.downloadHandler = new DownloadHandlerBuffer();

    yield return request.SendWebRequest();

    if (request.result == UnityWebRequest.Result.ConnectionError || 
        request.result == UnityWebRequest.Result.ProtocolError)
    {
        Debug.LogError(request.error);
    }
    else
    {
        Debug.Log(request.downloadHandler.text);
    }
}

示例中的 url 参数是POST请求的目标URL, jsonData 参数是要发送的JSON数据。

该代码使用Unity的 UnityWebRequest 类来发送POST请求。 UnityWebRequest 允许您指定请求的类型(在本例中为“POST”),上传请求主体,并从响应中下载响应主体。

使用 yield 关键字使此函数成为协程,以确保请求在后台线程上执行而不会阻塞主线程。在协程完成后,检查UnityWebRequest对象的结果以确定是否存在错误,并输出响应的文本内容或错误消息。

Socket

适用于自定义的网络协议,可实现定制化的网络通信

GET请求

这里是一个简单的 Unity C# Socket GET请求示例:

using System;
using System.Net.Sockets;
using System.Text;

public class SocketGETRequest {
    public static void Main() {
        // 创建一个Socket对象
        Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // 连接到目标网站
        clientSocket.Connect("www.example.com", 80);

        // 构建HTTP GET请求
        string getRequest = "GET / HTTP/1.1\r\n";
        getRequest += "Host: www.example.com\r\n";
        getRequest += "Connection: Close\r\n\r\n";

        // 发送请求
        byte[] requestBytes = Encoding.ASCII.GetBytes(getRequest);
        clientSocket.Send(requestBytes);

        // 接收响应
        byte[] buffer = new byte[1024];
        int bytesRead = clientSocket.Receive(buffer);
        string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);

        // 输出响应
        Console.WriteLine(response);

        // 关闭Socket连接
        clientSocket.Shutdown(SocketShutdown.Both);
        clientSocket.Close();
    }
}

这个示例中,我们创建了一个Socket对象,连接到了一个名为www.example.com的网站,然后构建了一个HTTP GET请求,将请求发送给服务器,并等待响应。最后,我们输出了响应,并关闭了Socket连接。

POST请求

以下是使用Unity的C#代码示例来进行Socket POST请求的示例:

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SocketClient
{
    private Socket socket;

    public SocketClient()
    {
        try
        {
            // 创建Socket
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }
        catch (SocketException ex)
        {
            Debug.Log($"创建Socket失败: {ex}");
        }
    }

    public void Request(string url, string data)
    {
        try
        {
            // 解析URL
            Uri uri = new Uri(url);
            IPAddress ipAddress = Dns.GetHostAddresses(uri.Host)[0];
            IPEndPoint remoteEndPoint = new IPEndPoint(ipAddress, uri.Port);

            // 连接服务器
            socket.Connect(remoteEndPoint);

            // 构造HTTP POST请求
            string request = $"POST {uri.PathAndQuery} HTTP/1.1\r\n" +
                             $"Host: {uri.Host}\r\n" +
                             "Content-Type: application/x-www-form-urlencoded\r\n" +
                             $"Content-Length: {data.Length}\r\n" +
                             "Connection: close\r\n" +
                             "\r\n" +
                             $"{data}";

            // 发送请求
            byte[] requestBytes = Encoding.ASCII.GetBytes(request);
            socket.Send(requestBytes);

            // 接收服务器响应
            byte[] receiveBuffer = new byte[1024];
            int receiveSize = socket.Receive(receiveBuffer);

            // 处理服务器响应
            string response = Encoding.ASCII.GetString(receiveBuffer, 0, receiveSize);
            Debug.Log($"服务器响应:{response}");
        }
        catch (Exception ex)
        {
            Debug.Log($"请求异常:{ex}");
        }
        finally
        {
            // 关闭连接
            socket.Close();
        }
    }
}

使用示例:

SocketClient socketClient = new SocketClient();
socketClient.Request("http://localhost:8080/your_api_path", "param=value");

注:以上示例仅用于演示Socket POST请求的基本流程,实际应用中需要考虑更多的异常处理、数据加密等安全问题。

总结

在使用网络请求的过程中,需要注意请求方式的选择、请求参数的设置、请求结果的处理等方面。同时,也需要注意网络请求过程中可能出现的错误情况,如网络连接失败、请求超时、服务器返回错误等,需要进行合理的异常处理

要是有疑问大家可以加我微信详聊 yf1553653788

你可能感兴趣的:(unity,游戏引擎)