Invio di richieste http in C # con Unity

Come posso inviare richieste HTTP GET e POST in C # con Unity?

Quello che voglio è:

  • inviare dati json in post richiesta (io uso serializzatore Unity, quindi non ne ho bisogno in uno nuovo, voglio solo passare una stringa nei dati post e avere la possibilità di impostare ContentType su application / json);
  • ottenere codice di risposta e corpo senza problemi;
  • fai tutto in modo asincrono senza bloccare il rendering dell’interfaccia utente.

Quello che ho provato:

  • implementando con HttpWebRequest / HttpWebResponse, ma è troppo difficile e di basso livello (se non troverò nulla di meglio, dovrò usarlo);
  • usando unity WWW, ma non corrisponde alle mie esigenze;
  • utilizzando alcuni pacchetti esterni da NuGet – Unity non li accetta 🙁

La maggior parte dei problemi riguardava il threading, non ho esperienza sufficiente in C #. L’editor di testo, io uso, è Intellij Rider.

L’API WWW dovrebbe essere eseguita, ma UnityWebRequest sostituita, quindi risponderò all’API più recente. È davvero semplice Devi usare coroutine per fare ciò con l’API di Unity altrimenti devi usare una delle API e thread di richiesta web standard di C #. Con coroutine puoi rendere la richiesta fino a quando non viene completata. Questo non bloccherà il thread principale o impedirà l’esecuzione di altri script.

Nota :

Per gli esempi seguenti, se si utilizza qualcosa sotto Unity 2017.2 , sostituire SendWebRequest() con Send() e quindi sostituire isNetworkError con isError . Questo funzionerà quindi con la versione inferiore di Unity. Inoltre, se è necessario accedere ai dati scaricati in un modulo binario, sostituire uwr.downloadHandler.text con uwr.downloadHandler.data . Infine, la funzione SetRequestHeader viene utilizzata per impostare l’intestazione della richiesta.

Richiedi :

 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); } } 

Richiesta POST con modulo :

 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); } } 

Richiesta POST con 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); } } 

Richiesta POST con Multipart FormData / Multipart Form File :

 void Start() { StartCoroutine(postRequest("http:///www.yoururl.com")); } IEnumerator PostRequest(string url) { List formData = new List(); 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); } } 

Richiesta 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); } } 

ELIMINA richiesta :

 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"); } } 

Usa HttpClient e qualcosa di simile:

 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 è un object da serializzare su json. Se tutte le richieste vanno nella stessa baseUrl, è ansible impostare HttpClient a livello globale e riutilizzarlo qui