webentwicklung-frage-antwort-db.com.de

Senden von http-Anforderungen in C # mit Unity

Wie kann ich in C # HTTP GET- und POST -Anfragen mit Unity senden?

Was ich will ist:

  • senden Sie Json-Daten in Postanforderung (Ich verwende Unity-Serializer, also keine Notwendigkeit inNeu, ich möchte nur Zeichenfolge in Postdaten übergeben und habe die Möglichkeit, ContentType auf application/json zu setzen);
  • antwortcode und Body ohne Probleme bekommen;
  • tun Sie alles asynchron, ohne das Rendering der Benutzeroberfläche zu blockieren.

Was ich probiert habe:

  • implementierung mit HttpWebRequest/HttpWebResponse, aber es ist zu hart und zu schwach (wenn ich nichts Besseres finde, muss ich es verwenden);
  • mit Unity WWW, aber es entspricht nicht meinen Anforderungen;
  • verwenden einiger externer Pakete von NuGet - Unity akzeptiert sie nicht :(

Die meisten Probleme waren beim Threading, ich habe nicht genug Erfahrung damit in C # .. _. Der Texteditor, den ich verwende, ist Intellij Rider.

16
Kamo Spertsian

Die WWW-API sollte dies erledigen, wurde jedoch durch UnityWebRequest ersetzt, sodass ich die neuere API beantworten werde. Es ist wirklich einfach Sie müssen coroutine verwenden, um dies mit der Unity-API zu tun. Andernfalls müssen Sie eine C # -Standardanforderung für Webanfragen und einen Thread verwenden. Mit Coroutine können Sie die Anfrage bis zum Ende erledigen. Dadurch wird der Haupt-Thread nicht blockiert oder die Ausführung anderer Skripts verhindert.

Hinweis :

Wenn Sie in den folgenden Beispielen etwas unter Unity 2017.2 verwenden, ersetzen Sie SendWebRequest() durch Send() und ersetzen Sie dann isNetworkError durch isError. Dies funktioniert dann für die niedrigere Version von Unity. Wenn Sie stattdessen auf die heruntergeladenen Daten in binärer Form zugreifen müssen, ersetzen Sie uwr.downloadHandler.text durch uwr.downloadHandler.data. Schließlich wird die SetRequestHeader-Funktion verwendet, um den Header der Anforderung festzulegen.

GET-Anfrage :

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 Anfrage mit Formular :

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 Anfrage mit 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 - Anforderung mit Multipart-FormData/Multipart-Formulardatei

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

PUT-Anfrage

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

DELETE-Anfrage

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

Verwenden Sie HttpClient und so etwas wie:

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 ist ein Objekt, das mit Json serialisiert werden soll. Wenn alle Anforderungen an dieselbe baseUrl gehen, können Sie HttpClient global einrichten und hier wieder verwenden

0
Jonathan