web-dev-qa-db-fra.com

Envoi de requêtes http en C # avec Unity

Comment envoyer des requêtes HTTP GET et POST en C # avec Unity?

Ce que je veux c'est:

  • envoyer des données json dans une demande de publication (j'utilise le sérialiseur Unity, donc aucun besoin innew one, je veux simplement transmettre une chaîne dans des données de publication et avoir la possibilité de.
  • obtenir le code de réponse et le corps sans aucun problème;
  • faites tout cela de manière asynchrone sans bloquer le rendu de l'interface utilisateur.

Ce que j'ai essayé

  • implémentation avec HttpWebRequest/HttpWebResponse, mais c'est trop dur et de faible niveau (si je ne trouve rien de mieux, je devrai l'utiliser);
  • utiliser l’unité WWW, mais cela ne correspond pas à mes besoins;
  • en utilisant des paquets externes de NuGet - Unity ne les accepte pas :(

La plupart des problèmes étaient liés à la thread, je ne suis pas assez expérimenté en C # . L'éditeur de texte que j'utilise est Intellij Rider.

16
Kamo Spertsian

Cela devrait être fait par l'API WWW, mais UnityWebRequest l'a remplacée et je vais donc répondre à l'API plus récente. C'est vraiment simple. Pour ce faire, vous devez utiliser coroutine avec l'API de Unity, sinon vous devez utiliser l'une des API de requête Web standard C # et Thread. Avec coroutine, vous pouvez céder la demande jusqu'à ce que ce soit fait. Cela ne bloquera pas le thread principal ni empêchera d'autres scripts de s'exécuter.

Remarque :

Pour les exemples ci-dessous, si vous utilisez un élément ci-dessous Unity 2017.2, remplacez SendWebRequest() par Send(), puis remplacez isNetworkError par isError. Cela fonctionnera alors pour la version inférieure de Unity. De même, si vous devez accéder aux données téléchargées sous une forme binaire, remplacez uwr.downloadHandler.text par uwr.downloadHandler.data. Enfin, la fonction SetRequestHeader permet de définir l’en-tête de la requête.

Demande GET :

void Start()
{
    StartCoroutine(getRequest("http:///www.yoururl.com"));
}

IEnumerator GetRequest(string uri)
{
    UnityWebRequest uwr = UnityWebRequest.Get(uri);
    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError)
    {
        Debug.Log("Error While Sending: " + uwr.error);
    }
    else
    {
        Debug.Log("Received: " + uwr.downloadHandler.text);
    }
}

POST demande avec Formulaire :

void Start()
{
    StartCoroutine(postRequest("http:///www.yoururl.com"));
}

IEnumerator PostRequest(string url)
{
    WWWForm form = new WWWForm();
    form.AddField("myField", "myData");
    form.AddField("Game Name", "Mario Kart");

    UnityWebRequest uwr = UnityWebRequest.Post(url, form);
    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError)
    {
        Debug.Log("Error While Sending: " + uwr.error);
    }
    else
    {
        Debug.Log("Received: " + uwr.downloadHandler.text);
    }
}

POST demande avec Json :

 void Start()
 {
     StartCoroutine(postRequest("http:///www.yoururl.com", "your json"));
 }

 IEnumerator PostRequest(string url, string json)
 {
     var uwr = new UnityWebRequest(url, "POST");
     byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
     uwr.uploadHandler = (UploadHandler)new UploadHandlerRaw(jsonToSend);
     uwr.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
     uwr.SetRequestHeader("Content-Type", "application/json");

     //Send the request then wait here until it returns
     yield return uwr.SendWebRequest();

     if (uwr.isNetworkError)
     {
         Debug.Log("Error While Sending: " + uwr.error);
     }
     else
     {
         Debug.Log("Received: " + uwr.downloadHandler.text);
     }
 }

POST demande avec fichier multipart FormData/Multipart Form File

void Start()
{
    StartCoroutine(postRequest("http:///www.yoururl.com"));
}

IEnumerator PostRequest(string url)
{
    List<IMultipartFormSection> formData = new List<IMultipartFormSection>();
    formData.Add(new MultipartFormDataSection("field1=foo&field2=bar"));
    formData.Add(new MultipartFormFileSection("my file data", "myfile.txt"));

    UnityWebRequest uwr = UnityWebRequest.Post(url, formData);
    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError)
    {
        Debug.Log("Error While Sending: " + uwr.error);
    }
    else
    {
        Debug.Log("Received: " + uwr.downloadHandler.text);
    }
}

Demande PUT

void Start()
{
    StartCoroutine(putRequest("http:///www.yoururl.com"));
}

IEnumerator PutRequest(string url)
{
    byte[] dataToPut = System.Text.Encoding.UTF8.GetBytes("Hello, This is a test");
    UnityWebRequest uwr = UnityWebRequest.Put(url, dataToPut);
    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError)
    {
        Debug.Log("Error While Sending: " + uwr.error);
    }
    else
    {
        Debug.Log("Received: " + uwr.downloadHandler.text);
    }
}

Supprimer la demande

void Start()
{
    StartCoroutine(deleteRequest("http:///www.yoururl.com"));
}

IEnumerator DeleteRequest(string url)
{
    UnityWebRequest uwr = UnityWebRequest.Delete(url);
    yield return uwr.SendWebRequest();

    if (uwr.isNetworkError)
    {
        Debug.Log("Error While Sending: " + uwr.error);
    }
    else
    {
        Debug.Log("Deleted");
    }
}
44
Programmer

Utilisez HttpClient et quelque chose comme:

public static HttpContent DoPost(object payload, string subPath)
    {
        var httpClient = new HttpClient();

        HttpClient.BaseAddress = new Uri(Global.BaseUrl);
        HttpClient.DefaultRequestHeaders.Clear();
        HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // if you're using json service

        // make request
        var response = Global.HttpClient.PostAsJsonAsync(subPath.TrimLeadingSlash(), payload).Result;

        // check for error
        response.EnsureSuccessStatusCode();

        // return result
        return response.Content;
    }

Payload est un objet à sérialiser en json. Si toutes les demandes vont à la même baseUrl, vous pouvez configurer HttpClient globalement et le réutiliser ici.

0
Jonathan