Come posso inviare richieste HTTP GET e POST in C # con Unity?
Quello che voglio è:
Quello che ho provato:
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