JSON Daten dekodieren



  • Hallo zusammen,

    ich habe einen eigenen Webserver für die Maschinen Steuerung hergelitten,
    und sende über meine http Seite mittels JSON (ajax) ein WebFormular

    Da sende ich via http request ein Formular

    var formdata = new FormData();
    var ajax = new XMLHttpRequest();
    ajax.open("POST", "http://pi-cam:8080");
    

    Auf meinen Server erhalte ich dann eine Meldung mit folgendem Inhalt:

    boundary=----WebKitFormBoundaryUkCpwUNa7uvwWgCA

    Die benötigte Information : UkCpwUNa7uvwWgCA habe ich extrahiert und nun
    möchte ich das dekodieren, so das ich die Formdaten weiter verarbeiten kann.

    Ich finde leider keine passenden Hinweise wie man den Salat dekodiert ,
    allerdings verfüge ich unter Windows ein sog. base64 dekodier verfahren, das
    hat aber viel quellen Text und ich muss es auf Linux kompilieren.

    Frage :
    a) Gibt es Hinweise wie man entweder JSON dazu bringt im Klartext zu senden ?
    b) Oder kennt jemand ein dekodier verfahren das man einfach implementieren könnte ?

    Vielen Dank für Hinweise
    Grüße aus Berlin Karsten.



  • Du meinst wohl JSON?

    Du hast anscheinend einen "multipart/form-data" Request versendet.
    Dieser besteht aus mehreren mit jeweils einem Boundary-Marker (üblicherweise ---...) getrennten Zeilen (bzw. auf Webkit basierenden Browsern mit -----WebKitFormBoundary...) , die Zeilen dazwischen sind die eigentlichen Daten, s.a. Multipart formposts sowie Uploads, multipart/form-data & UploadedFile: multipart/form-data.



  • Hallo th69,
    danke für die schnelle Antwort, ja genau den Datastring erhalte ich auch, jedoch immer kodiert, und base64 kann man es nicht auspacken, jedoch habe ich eine primitive Option gefunden Klartext zu senden, ich packe meine paar Daten einfach in das Header, und da kommen sie auch an meinem Server an
    wie bei einem form submit nur ohne Seiten reload, was den ganzen Zirkus erst nötig machte :

    ajax.open("POST", "http://pi-cam:8080");
    ajax.setRequestHeader("Content-Type", "text/camctrl" + " rcLeft="+ rcLeft + "rcTop=" + rcTop + " rcWidth=" + rcWidth + " rcHeight=" + rcHeight);
    ajax.send();
    


  • @Achromat sagte in JSON Daten dekodieren:

    boundary=----WebKitFormBoundaryUkCpwUNa7uvwWgCA

    Der String ist nicht alles was zurück kommt. Wie Th69 schon geschrieben hat werden die daten wohl als multipart/form-data zurückgeschickt.
    Und du musst auf deiner seite diese multipart erstmal zusammensetzen um an die eigendlichen Daten ran zu kommen



  • @firefly sagte in JSON Daten dekodieren:

    seite

    Ich bin ja an den Daten dran, ist ja mein eignes geschriebener Web -Server. Die Daten lauten wie folgt:
    boundary=----WebKitFormBoundaryUkCpwUNa7uvwWgCA

    Der Datenteil endet nach den strichen "UkCpwUNa7uvwWgCA" Das kann ich nicht dekodieren.
    Also sende ich aus der Not geboren meine Daten im Header der zumindest im Klartext übertragen wird.

    ajax.setRequestHeader("hallo Welt");
    

    ajax.send("Wird nicht gesendet") verschlüsselt alles, das möchte man aber gern schon beim Senden abschalten, wie es geht weiß man nicht.

    Auch das sendet entweder keine Daten (Nur Header) Oder Verschlüsselt:

    ajax.send(JSON.stringify({ "Hello": "World" }));   //or JSON.stringify("HALLO = WELT"));
    

    Danke für deine Antwort
    Schöne Grüße aus Berlin 25C°



  • @Achromat sagte in JSON Daten dekodieren:

    Der Datenteil endet nach den strichen "UkCpwUNa7uvwWgCA" Das kann ich nicht dekodieren.

    Nein das sind nicht die daten. Sondern bestandteil des boundary "strings" für einen multipart form element.

    Hast du mal versucht den request in einem browser zu starten und dir dann mit hilfe der Developer tools angeschaut wie der komplette response aussieht?



  • @firefly sagte in JSON Daten dekodieren:

    sucht den request in

    Du meinst die einlaufenden Daten sind mit Nullen terminiert ?

    Die Daten Ändern sich je nach Eingabe und sehen nach gleicher Eingabe auch gleich aus : UkCpwUNa7uvwWgCA

    Es sind lediglich 4 Einzelzahlen als String via Form übertragen worden

    Beispiel:

                 
                var formdata = new FormData();
                formdata.append('A0', rcLeft)
                formdata.append('A1', rcTop)
                formdata.append('A2', rcWidth)
                formdata.append('A3', rcHeight)
    
                ajax.setRequestHeader("Accept", "application/json");
    

    Um an klartext Daten zu kommen manipuliere ich aus der Not geboren den Header so :

    ajax.open("POST", "http://pi-cam:8080");
    ajax.setRequestHeader("Content-Type", "text/camctrl" + " rcLeft="+ rcLeft + " rcTop=" + rcTop + " rcWidth=" + rcWidth + " rcHeight=" + rcHeight);
    ajax.send();// JSON.stringify({ "Hello": "World" }));// JSON.stringify("HALLO = WELT"));
    

    Danke für deinen Hinweis !
    Gruß Karsten



  • Ich bin verwirrt....
    wolltest du das ggf. in Webzeugs posten? oder welcher teil davon ist cpp?

    via fetch api:

    const data = {
        rcLeft: rcLeft,
        rcTop: rcTop,
        rcWidth: rcWidth,
        rcHeight: rcHeight,
     };
    
    fetch("http://pi-cam:8080", {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    })
      .then((response) => response.json())
      .then((data) => {
        console.log('Success:', data);
      })
      .catch((error) => {
        console.error('Error:', error);
      });
    


  • Hallo Cardiac,

    das sieht gut aus, ich habe schon einige versuche mit fetch getätigt, alle kamen
    am server verschlüsselt oder gar nicht an, eine normale submit Aktion übergibt doch die Parameter eines form
    über html ?wert&nächsterwert&"usw"

    Wenn man einfach bei open(url) dem Server die Parameter dran hängt werden diese wie ein normales submit form params übertragen. anach send(null) hat man einen nicht unterscheidbaren Form Request gesendet.
    Die Verbindung wird getrennt, und der Server hat die Daten über die URL erhalten, anhand der Inhalte kann
    der Server sich sparen die Original Seite zu laden, die alten Variablen auszutauschen, die Datei wieder zurück schreiben,
    und die ganze Seite zurück zum Browser Clienten zu senden.

    Der Client wird also nicht nachgeladen, kein reload der Seite nach Form Übertragung das war nun das Ziel.

    var formstr = ""; $.each($('form').serializeArray(), function () { formstr += this.name + "=" + this.value + "&"; });
    var ajax = new XMLHttpRequest();
    ajax.open("GET", "http://pi-cam:8080//?" + formstr);
    ajax.send(null);
    

    Danke deinen Code sendet den Header, aber die daten nicht. Funktioniert nun alles easy, wie oben danke für deine Hilfe,
    gruß aus Berlin
    k.



  • Das ganze musste ich mal verfilmen https://www.twitch.tv/videos/1637985813



  • @Achromat sagte in JSON Daten dekodieren:

    eine normale submit Aktion übergibt doch die Parameter eines form
    über html ?wert&nächsterwert&"usw"

    url encode wird nur verwendet, wenn die form method="POST" gesetzt hat.

    @Achromat sagte in JSON Daten dekodieren:

    anhand der Inhalte kann
    der Server sich sparen die Original Seite zu laden

    nein. form submit impliziert einen hard refresh, jedenfalls wenn html forms benutzt werden.

    Grundlegend ist es muessig sich hier ueber client code zu unterhalten. fetch und XMLHttpRequest sind beide RFC compliant, also ist es voellig offensichtlich dass dein servercode nicht das tut, was du von ihm erwartest. Insofern wuerde ich empfehlen mal teile davon zu posten, als nen twitch stream, denn ich fuer meinen teil habe besseres zutun als hier 30min rumzuhocken, und jemandem beim schwafeln zuzuhoeren.

    Edit: Pi's sind heutzutage recht powerful, insofern kann ich nicht unbedingt nachvollziehen warum man sich selbst genug hasst, um nen eigenen webserver zu basteln, wenn small footprint alternativen wie lighttpd existieren. selbst nginx wuerde ich als lightweight bezeichnen, wenn man den kram selbst baut und einiges beim compile rauswirft.



  • @Cardiac sagte in JSON Daten dekodieren:

    u von ihm erwartest

    Es ist ein Server für die Maschinensteuerung, es werden arm7 Broadcom -chip -encoder verwendet um die
    Broadcom -camera -interfaces mit dem web-Requests zu koppeln.

    Es gibt jetzt keine Probleme mehr. Die Aussendung mittels Fetch und benutzter definierter Daten request's
    habe ich nicht mehr für das Projekt so nötig.

    Die Param's übertrage ich somit klassisch als form über die URL.

    Vielen Dank für deine Hinweise!

    Dann bastle ich mal weiter an meinem bastel Zeugs ^^

    Viele Grüße aus Berlin
    Karsten


Anmelden zum Antworten