Upload einer JSON Datei per "PUT" und auslesen der Rückgabe vom Server

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Upload einer JSON Datei per "PUT" und auslesen der Rückgabe vom Server

    Hallo Leute,

    ich habe so meine Probleme mit "PUT".
    Abfragen mit POST und GET hab ich schon hinbekommen, aber irgendwie mag das mit dem PUT nicht funktionieren.
    Ich bin mir sicher, es liegt an meinem Code der schlichtweg irgendwo einen groben Fehler hat.

    Könnt Ihr mal drüberschauen - Ihr Profis habt den Fehler garantiert in 10 Sekunden ermittelt.

    Die Funktion soll JSON Metadaten an einen Server schicken und eine JSON Antwort zurückerhalten.
    Ich bekomme aber immer nur eine leere Antwort zurück.
    Die "Baerer" Authentifizierung passt - die habe ich auch bei meinen anderen (funktionierenden) POST und GET Abfragen.

    VB.NET-Quellcode

    1. Public Function GetUploadURL() As String
    2. Dim UUID As String = System.Guid.NewGuid.ToString
    3. Dim JSONMetadaten As String = "[{
    4. 'ID' = '#UUID#',
    5. 'Type' = 'DocumentType',
    6. 'Version' = 1
    7. }]"
    8. JSONMetadaten = JSONMetadaten.Replace("#UUID#", UUID)
    9. '// nur zum Testen
    10. 'JSONMetadaten = JSONMetadaten.Replace("'", """")
    11. 'MessageBox.Show(JSONMetadaten) 'Zeigt die JSONMetadaten an (Kontrolle zur Entwicklungszeit)
    12. Dim encoding As New UTF8Encoding
    13. Dim byteData As Byte() = encoding.GetBytes(JSONMetadaten)
    14. Dim Response As String = ""
    15. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    16. Dim tempcookies As New CookieContainer
    17. Dim rM2Request As HttpWebRequest = DirectCast(HttpWebRequest.Create(STORAGE_REQUEST_URL), HttpWebRequest)
    18. rM2Request.Headers("Authorization") = "Bearer " & My.Settings.USER_TOKEN
    19. rM2Request.ContentLength = byteData.Length
    20. rM2Request.ContentType = "application/json"
    21. rM2Request.Method = "PUT"
    22. rM2Request.KeepAlive = True
    23. rM2Request.CookieContainer = tempcookies
    24. rM2Request.UserAgent = "freeremarkabletools.com"
    25. Using requestStream = rM2Request.GetRequestStream
    26. requestStream.Write(byteData, 0, byteData.Length)
    27. requestStream.Close()
    28. Using responseStream = rM2Request.GetResponse.GetResponseStream
    29. Using reader As New StreamReader(responseStream)
    30. Response = reader.ReadToEnd()
    31. End Using
    32. End Using
    33. End Using
    34. Return Response
    35. End Function


    Ich habe auch eine zweite Variante ausprobiert, da kommt aber auch nur ein Leerstring zurück:

    VB.NET-Quellcode

    1. Public Function GetUploadURL() As String
    2. Dim UUID As String = System.Guid.NewGuid.ToString
    3. Dim JSONMetadaten As String = "[{
    4. 'ID' = '#UUID#',
    5. 'Type' = 'DocumentType',
    6. 'Version' = 1
    7. }]"
    8. JSONMetadaten = JSONMetadaten.Replace("#UUID#", UUID)
    9. '// nur zum Testen
    10. JSONMetadaten = JSONMetadaten.Replace("'", """")
    11. JSONMetadaten = JSONMetadaten.Replace(" ", "")
    12. JSONMetadaten = JSONMetadaten.Replace(vbCrLf, "")
    13. 'MessageBox.Show(JSONMetadaten) 'Zeigt die JSONMetadaten an (Kontrolle zur Entwicklungszeit)
    14. Dim AEncoding As New UTF8Encoding
    15. Dim MybyteData As Byte() = AEncoding.GetBytes(JSONMetadaten)
    16. Using UploadWebClient As New Net.WebClient
    17. UploadWebClient.Headers.Add("Authorization", "Bearer " & My.Settings.USER_TOKEN)
    18. Dim responsebytes = UploadWebClient.UploadData(STORAGE_REQUEST_URL, "PUT", MybyteData)
    19. Dim responsebody As String = (New System.Text.UTF8Encoding).GetString(responsebytes)
    20. MessageBox.Show(responsebody)
    21. End Using
    22. Return ""
    23. End Function


    *Topic verschoben*
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hallo

    Was ist aber wenn alles passt, die Endstelle aber kein PUT Unterstützt? Ich kenne die Endstelle nicht aber schau mal welchen StatusCode du zurückbekommst.
    Frag mal den Response StatusCode ab. Ich mach API Abfragen übrigens gerne mit einem HttpClient aus dem namensraum System.Net.Http, der unterstützt alle Operationen Asyncron abzurufen.

    Per Default ist auf einem ISS Beispielsweise PUT und POST oft deaktiviert, da bin ich unlängst drübergestolpert.

    Grüße aus (auch) Wiener Neustadt
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    laut der API Anleitung auf Github muss es PUT sein. Aber vielleicht bin ich da ganz auf dem Holzweg mit meinem Code ;) ?

    github.com/splitbrain/ReMarkableAPI/wiki/Storage

    PHP-Mässig hat das jemand so programmiert (ich kenne mich aber mit PHP nicht wirklich aus):

    PHP-Quellcode

    1. /**
    2. * Creates a new Document Item ready to be uploaded
    3. *
    4. * @param string $id the new document ID
    5. * @return string the upload URL
    6. * @throws \Exception
    7. */
    8. protected function createUploadRequest($id)
    9. {
    10. $this->logger->info('Creating upload request');
    11. $stub = [
    12. 'ID' => $id,
    13. 'Type' => self::TYPE_DOCUMENT,
    14. 'Version' => 1
    15. ];
    16. $item = $this->storageRequest('PUT', 'upload/request', $stub);
    17. if (!isset($item['BlobURLPut'])) {
    18. throw new \Exception('No BlobURLPut in upload request response');
    19. }
    20. return $item['BlobURLPut'];
    21. }
    22. /**
    23. * Executes an authenticated request on the storage JSON API
    24. *
    25. * @param string $verb The wanted HTTP verb
    26. * @param string $base The basic endpoint to talk to
    27. * @param array $item The item data to send (will be JSON encoded)
    28. * @return array The result of the request
    29. * @throws \Exception
    30. */
    31. protected function storageRequest($verb, $base, $item)
    32. {
    33. $response = $this->client->requestJSON($verb, $this->STORAGE_API . '/document-storage/json/2/' . $base, [$item]);
    34. $item = (json_decode((string)$response->getBody(), true))[0];
    35. if (!$item['Success']) throw new \Exception($item['Message']);
    36. return $item;
    37. }

    Bilder
    • Anleitung.jpg

      465,76 kB, 958×1.069, 51 mal angesehen
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „dive26“ ()

    Hallo nochmal.

    Ich würde auf jeden Fall mal sicherstellen das das JSon auch valid ist und das per Newtonsoft.Json generieren lassen. Denn dein Json aus dem ersten Post sieht nicht valid aus wie ich gerade sehe. Das wird sicher nicht deine einzige und letzte Anfrage an den Server sein und zurück bekommst du ja auch ein JSon, das willst du ja sicher auch DeSerialisieren und nicht den String "zerpflücken".

    Installier mal das NuGet-Paket, das macht dir so vieles einfacher.
    Falls du Fragen bez. der Anwendung der Library hast kannst du ruig Fragen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    @Nofear23m

    Du bist der Beste.
    Ich dachte mir schon, dass es eine Kleinigkeit ist.

    Gerade bei der Sache wo ich dachte - die kann nur richtig sein - die war falsch.

    Beim JSON habe ich = statt : verwendet. Ich Idiot ;-).


    Hier der funktionierende Code:

    VB.NET-Quellcode

    1. Public Function GetUploadURL() As String
    2. ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    3. Dim JSONMetadaten As String = "[{
    4. 'ID' : '#UUID#',
    5. 'Type' : 'DocumentType',
    6. 'Version' : 1
    7. }]"
    8. JSONMetadaten = JSONMetadaten.Replace("#UUID#", System.Guid.NewGuid.ToString) '// Neue GUID in den Platzhalter einfügen
    9. JSONMetadaten = JSONMetadaten.Replace("'", """") '// Einfache Anführungszeichen durch Doppelte ersetzen
    10. Dim responsebody As String = ""
    11. Dim AEncoding As New UTF8Encoding
    12. Dim MybyteData As Byte() = AEncoding.GetBytes(JSONMetadaten)
    13. Using UploadWebClient As New Net.WebClient
    14. UploadWebClient.Headers.Add("Authorization", "Bearer " & My.Settings.USER_TOKEN)
    15. Dim responsebytes = UploadWebClient.UploadData(STORAGE_REQUEST_URL, "PUT", MybyteData)
    16. responsebody = (New System.Text.UTF8Encoding).GetString(responsebytes)
    17. End Using
    18. Return responsebody
    19. End Function
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Freut mich das es funktioniert. Ich lege dir dennoch die Bibliothek ans Herz, ohne der mach ich nix was mit JSon zu tun hat.
    Und da sie so super einfach anzuwenden ist kann ich sie nur Empfehlen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ch lege dir dennoch die Bibliothek ans Herz, ohne der mach ich nix was mit JSon zu tun hat.


    Werde ich mir beim nächsten Projekt mal näher ansehen.
    Dieses Projekt ist ja schon fast fertig und 95% der JSON Geschichten laufen schon seit November.
    Obwohl ich es anfangs nicht geplant hatte, baue ich jetzt noch einen Dokumentenupload ein (inkl. neuen Ordner erstellen).

    Danke für Deine Hilfe.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at