Unity-Docking-Schnittstelle – einfacher Unterricht – UnityWebRequest

Vorwort

提示:大体介绍今日功能介绍
Stellen Sie die Art und Weise der Docking-Schnittstelle von UnityWebRequest vor. Der Blogger verwendet zu Beginn auch die Schnittstelle, die sehr detailliert ist.

Prozess nutzen

这里为内容大体走向介绍
In diesem Artikel wurden verschiedene Methoden ausprobiert, und für jede Änderung gibt es eine kleine Quittung. Ich hoffe, er kann allen helfen. Das
Ziel dieses Artikels ist es, den Effekt der Verwendung von Postman zu erzielen und die zurückgegebenen Daten abzurufen.
(Wie wir alle wissen, ist Postman eine sehr einfach zu bedienende Software zum Ausführen von Schnittstellen)

Postbotentest

  • In diesem Artikel wird zunächst versucht, Postman zu verwenden
  • Es ist sehr offensichtlich, dass unsere Postman-Nutzung zwei Schlüssel erfordert, einen für Bilddaten und einen für String-Daten
  • Unter anderem muss die Bilddatenschnittstelle Byte-Daten empfangen.
    Fügen Sie hier eine Bildbeschreibung ein* Es ist kein Problem, normal zu laufen (da unsere Schnittstelle es mir nicht erlaubt hat, beim Schreiben eines Blogs zu arbeiten, sodass es mir nicht gelungen ist, Screenshots zu machen).

Erster Test

  • Zuerst verwendet unser Code
 public void SendForm()
    {
    
    
        byte[] myData = System.Text.Encoding.UTF8.GetBytes("Sample Data");
        string myString = "Sample String";

        StartCoroutine(PostRequest("https://www.example.com/api/submitform", myData, myString));
    }

    IEnumerator PostRequest(string url, byte[] data, string formData)
    {
    
    
        UnityWebRequest www = new UnityWebRequest(url, "POST");
        UploadHandlerRaw uploadHandler = new UploadHandlerRaw(data);
        uploadHandler.contentType = "application/octet-stream";
        www.uploadHandler = uploadHandler;

        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Content-Type", "application/x-www-form-urlencoded");
        byte[] formBytes = System.Text.Encoding.UTF8.GetBytes(formData);
        www.uploadHandler.data = formBytes;
        www.SetRequestHeader("Content-Length", formBytes.Length.ToString());

        yield return www.SendWebRequest();

        if (www.isNetworkError || www.isHttpError)
        {
    
    
            Debug.Log(www.error);
        }
        else
        {
    
    
            Debug.Log(www.downloadHandler.text);
        }
    }
  • Diese Methode kann überhaupt nicht verwendet werden. Die vollständig geschriebene Methode eignet sich für unsere Schnittstelle, die nur zwei Daten empfängt und alle Daten schließlich im Byte-Modus gesendet werden. Natürlich ist diese Schnittstelle nicht vollständig Es kann nicht verwendet werden, Es ist einfach nicht für unsere Auswahl in diesem Artikel geeignet.

zweiter Test

  • Dieser Versuch führt eine direkte Umgestaltung der Verwendung durch
byte[] data1 = new byte[10];
byte[] data2 = new byte[20];

WWWForm form = new WWWForm();
form.AddField("stringKey1", "stringValue1");
form.AddBinaryData("byteArrayKey1", data1);
form.AddBinaryData("byteArrayKey2", data2);

UnityWebRequest request = UnityWebRequest.Post("your_url", form);
request.SetRequestHeader("Content-Type", "multipart/form-data");
request.SendWebRequest();
  • Dieser Artikel ist auch sehr einfach und eignet sich für viele Schnittstellen-Docking-Methoden
  • Eine Methode wie AddBinaryData kann einen Schlüssel und ein Byte an Wertdaten direkt übertragen
  • Eine andere AddField-Methode kann den KEK und den Wert, die früher zwei Zeichenfolgen waren, direkt übertragen
  • Obwohl es für unsere Verwendung sehr geeignet zu sein scheint, haben wir beim Debuggen der Schnittstelle immer noch ein Problem festgestellt: Content-Type konnte keinen Parameter namens Grenze finden
  • Lassen Sie mich diese Grenze erklären. Es handelt sich wahrscheinlich um ein Grenzzeichen, und die Daten werden zur Segmentierung verwendet

Dritter Test

byte[] data1 = new byte[10];
byte[] data2 = new byte[20];
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

WWWForm form = new WWWForm();
form.AddField("stringKey1", "stringValue1");
form.AddBinaryData("byteArrayKey1", data1);
form.AddBinaryData("byteArrayKey2", data2);

UnityWebRequest request = UnityWebRequest.Post("your_url", form);
request.SetRequestHeader("Content-Type", "multipart/form-data: boundary="+boundary);
request.SendWebRequest();
  • Wie im Code gezeigt, haben wir uns für das Hinzufügen einer Zeichenfolgengrenze entschieden und manuell eine erstellt
  • Fügen Sie dann die Grenze entsprechend dem Format hinzu, damit unsere Schnittstelle tatsächlich wie erwartet erhalten wird
  • Aber es gibt immer noch neue Probleme
  • Das ist richtig, die Grenze in unserem Inhaltstyp wird nicht wirklich verwendet
    Fügen Sie hier eine Bildbeschreibung ein

Vierter Test

  • In dem Artikel fiel mir nach langem Nachdenken ein Problem ein. Es könnte sein, dass wir die Grenze in der Post verschickt haben.
  • Ja, das stimmt. Wir haben einen Blick auf die API von Post geworfen und eine Methode gefunden, die uns zufriedenstellen kann.
    Fügen Sie hier eine Bildbeschreibung ein
  • Die Frage ist nun, wie wir unseren Wert an den List-Parameter übergeben
  • Unter anderem ist unser Parameter Imagebytes die Byte-Information unseres Bildes
  • Der Parameter AuqClass.imagename ist der Name unseres Bildes
List<IMultipartFormSection> multipartFormSections = new List<IMultipartFormSection>();
        multipartFormSections.Add(new MultipartFormFileSection("image", imagebytes, AuqClass.imagename,"image/png"));
        multipartFormSections.Add(new MultipartFormDataSection("module", "recognize"));
  • Sie können sehen, dass die API unserer Methodengruppe ein Name, ein Datenbyte, ein Dateiname und ein Inhaltstyp ist
    Fügen Sie hier eine Bildbeschreibung ein

  • .Achten Sie auf den Unterschied zwischen MultipartFormFileSection und MultipartFormDataSection. Am Anfang habe ich die Methode von MultipartFormDataSection verwendet. Jedes Mal, wenn ich Daten übertrage, empfängt die Schnittstelle String anstelle des Byte-Formats. Schließlich habe ich herausgefunden, dass eine andere Methode darin besteht, die Byte-Übertragung zu verwenden. von.

  • Das ist richtig, auf diese Weise können wir die Grenze vor dem Post hinzufügen

  • Unser Code vor dem Holz ist so

    public Void PostImageIE()
    {
    
    

        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] imagebytes = File.ReadAllBytes(AuqClass.imagepath);
        byte[] boundarybyte = System.Text.Encoding.UTF8.GetBytes(boundary);
        List<IMultipartFormSection> multipartFormSections = new List<IMultipartFormSection>();
        multipartFormSections.Add(new MultipartFormFileSection("image", imagebytes, AuqClass.imagename,"image/png"));
        multipartFormSections.Add(new MultipartFormDataSection("module", "recognize"));
        UnityWebRequest request = UnityWebRequest.Post(AuqClass.URl, multipartFormSections, boundarybyte);
        request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
        request.SendWebRequest();
       
    }

fünfter Test

  • Ein weiteres Problem besteht darin, dass wir die von unserer Schnittstelle zurückgegebenen Daten nicht erhalten haben
  • Zu diesem Zeitpunkt haben wir festgestellt, dass wir das Attribut downloadHandler verwenden können
 request.downloadHandler = new DownloadHandlerBuffer();
        if (request.isNetworkError || request.isHttpError)
        {
    
    
            Debug.Log(request.error);
        }
        else
        {
    
    
            string responseText = request.downloadHandler.text;
            byte[] responseData = request.downloadHandler.data;
            Debug.Log(responseText);
            //Debug.Log(responseData );

            
        }

Sechster Test

  • Die Daten des Rückrufs wurden behoben, aber wir sind einmal auf einen Fehler gestoßen
  • Das Problem bestand darin, dass die Daten nicht erfolgreich abgerufen werden konnten. Nach einer Untersuchung stellte sich heraus, dass wir nicht auf die Antwort gewartet und die Daten direkt debuggt hatten. Der Vorgang war zu schnell, das heißt, wir waren zu besorgt.
  • Diese Lösung ist sehr einfach: Wir verwenden direkt eine Coroutine, um eine Wartebedingung festzulegen
  • Am Ende unser Ergebnis:
public void PostImage()
    {
    
    
        StartCoroutine(PostImageIE());
    }
    IEnumerator  PostImageIE()
    {
    
    

        string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
        byte[] imagebytes = File.ReadAllBytes(AuqClass.imagepath);
        byte[] boundarybyte = System.Text.Encoding.UTF8.GetBytes(boundary);
        List<IMultipartFormSection> multipartFormSections = new List<IMultipartFormSection>();
        multipartFormSections.Add(new MultipartFormFileSection("image", imagebytes, AuqClass.imagename,"image/png"));
        multipartFormSections.Add(new MultipartFormDataSection("module", "recognize"));
        UnityWebRequest request = UnityWebRequest.Post(AuqClass.URl, multipartFormSections, boundarybyte);
        request.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + boundary);
        request.downloadHandler = new DownloadHandlerBuffer();
        yield return request.SendWebRequest();
        //request.SendWebRequest();
        if (request.isNetworkError || request.isHttpError)
        {
    
    
            Debug.Log(request.error);
        }
        else
        {
    
    
            string responseText = request.downloadHandler.text;
            byte[] responseData = request.downloadHandler.data;
            Debug.Log(responseText);
            
        }
    }

Zusammenfassen

Während des Lösungsprozesses hat mich jeder Link zusammengebrochen, und so habe ich mich schließlich für den Lösungsprozess entschieden, in der Hoffnung, für jeden eine bestimmte Rolle zu spielen. Auch wenn das Problem anders erscheint, kann man auch aus der darin enthaltenen Lösung lernen .

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42746271/article/details/129086051
conseillé
Classement