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.