Fila de solicitação de rede Unity

Cartilha

Em um projeto recente, devido a um determinado requisito, foi necessário solicitar dados de interface em segundo plano várias vezes, então eu mesmo encapsulei a fila de solicitações de rede; apenas para compartilhar com vocês, trocar e aprender uns com os outros

descrição breve

A fila de solicitações de rede do Unity é implementada pela classe UnityWebRequestQueue. Esta classe herda da classe MonoBehaviour, você pode criar um GameObject na cena do Unity e montar UnityWebRequestQueue neste GameObject, então você pode usá-lo na cena.

O módulo WebRequest do Unity encapsula solicitações de rede em uma fila e as processa na ordem em que são enviadas. Quando uma solicitação é adicionada à fila, o WebRequest determinará se há uma solicitação em andamento; em caso afirmativo, adicionará a solicitação à fila de espera e aguardará o término da solicitação em andamento antes de enviá-la. Se não houver nenhuma solicitação em andamento, a solicitação será enviada diretamente. Quando uma solicitação termina, o WebRequest retirará a próxima solicitação da fila de espera e a enviará.

Fila de solicitações GET

O código principal da fila de solicitações GET é o seguinte:

public class GetRequestQueue : MonoBehaviour
{
    private Queue<UnityWebRequest> webRequestQueue = new Queue<UnityWebRequest>();

    void Update()
    {
        if (webRequestQueue.Count > 0)
        {
            UnityWebRequest webRequest = webRequestQueue.Peek();

            if (webRequest.isDone)
            {
                string responseText = webRequest.downloadHandler.text;
                Debug.Log(responseText);
                webRequestQueue.Dequeue();
            }
            else if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.Log(webRequest.error);
                webRequestQueue.Dequeue();
            }
        }
    }

    public void AddRequest(string url)
    {
        UnityWebRequest webRequest = UnityWebRequest.Get(url);
        webRequestQueue.Enqueue(webRequest);
        StartCoroutine(webRequest.SendWebRequest());
    }
}

Esta classe define um objeto Queue webRequestQueue para armazenar em cache todas as solicitações GET. No método Update, cada vez que a fila é verificada para ver se há uma solicitação, se houver uma solicitação, a primeira solicitação da fila é retirada e a corrotina é iniciada para enviar a solicitação. Se a solicitação for concluída, ela será removida da fila, caso contrário, a solicitação também será removida da fila se houver um erro na solicitação.

Você pode expor o método AddRequest a outras classes para adicionar solicitações à fila de solicitações GET. Do seguinte modo:

public class GetRequestDemo : MonoBehaviour
{
    public string url = "http://localhost:8080/get";

    private GetRequestQueue getRequestQueue;

    void Start()
    {
        getRequestQueue = GameObject.Find("GetRequestQueue").GetComponent<GetRequestQueue>();
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 100, 50), "Send GET Request"))
        {
            getRequestQueue.AddRequest(url);
        }
    }
}

Neste exemplo, definimos uma classe Demo para solicitações GET. Quando o usuário clica no botão, o método AddRequest é chamado para adicionar a solicitação à fila.

Fila de solicitação POST

A implementação da fila de solicitações POST é semelhante à fila de solicitações GET, a principal diferença é que precisamos adicionar um corpo de solicitação para a solicitação POST. A seguir está o código de implementação da fila de solicitações POST:

public class PostRequestQueue : MonoBehaviour
{
    private Queue<UnityWebRequest> webRequestQueue = new Queue<UnityWebRequest>();

    void Update()
    {
        if (webRequestQueue.Count > 0)
        {
            UnityWebRequest webRequest = webRequestQueue.Peek();

            if (webRequest.isDone)
            {
                string responseText = webRequest.downloadHandler.text;
                Debug.Log(responseText);
                webRequestQueue.Dequeue();
            }
            else if (webRequest.isHttpError || webRequest.isNetworkError)
            {
                Debug.Log(webRequest.error);
                webRequestQueue.Dequeue();
            }
        }
    }

    public void AddRequest(string url, string requestBody)
    {
        UnityWebRequest webRequest = UnityWebRequest.Post(url, requestBody);
        webRequestQueue.Enqueue(webRequest);
        StartCoroutine(webRequest.SendWebRequest());
    }
}

Esta classe define um objeto Queue webRequestQueue para armazenar em cache todas as solicitações POST. No método AddRequest, usamos o método UnityWebRequest.Post para criar uma solicitação POST e passar o corpo da solicitação requestBody para o método.

Da mesma forma, você pode expor o método AddRequest a outras classes para adicionar solicitações à fila de solicitações POST. Do seguinte modo:

public class PostRequestDemo : MonoBehaviour
{
    public string url = "http://localhost:8080/post";
    public string requestBody = "{\"key\": \"value\"}";

    private PostRequestQueue postRequestQueue;

    void Start()
    {
        postRequestQueue = GameObject.Find("PostRequestQueue").GetComponent<PostRequestQueue>();
    }

    void OnGUI()
    {
        if (GUI.Button(new Rect(10, 10, 100, 50), "Send POST Request"))
        {
            postRequestQueue.AddRequest(url, requestBody);
        }
    }
}

Neste exemplo, definimos uma classe Demo de solicitação POST. Quando o usuário clica no botão, o método AddRequest é chamado para adicionar a solicitação à fila e o corpo da solicitação requestBody é passado para o método AddRequest.

Perceber

Na fila, o WebRequest suporta a configuração do número máximo de simultaneidade, ou seja, o número máximo de solicitações que podem ser feitas ao mesmo tempo. Quando o número de solicitações na fila atingir o número máximo simultâneo, novas solicitações serão adicionadas à fila de espera e não serão enviadas até o final da solicitação. Isso pode garantir que as solicitações de rede não sejam executadas excessivamente e que problemas como congestionamento de rede possam ser evitados.

O princípio da fila de solicitações de rede do módulo WebRequest do Unity é encapsular as solicitações em filas e processá-las de acordo com o princípio do primeiro a entrar, primeiro a sair. Ele suporta a definição do número máximo de solicitações simultâneas para garantir que o número de solicitações simultâneas não ser excessivo e evitar problemas como congestionamento da rede.

Acho que você gosta

Origin blog.csdn.net/Ai1114/article/details/132346402
Recomendado
Clasificación