XML HTTP post funktioniert nicht

  • Hallo zusammen,


    Ich bin dabei eine kleine App zu entwickeln um meine Heizung zu steuern. Dafür möchte ich die von Hersteller entwickelte API benutzen. Hier ist eine Anleitung der API. Bis jetzt kann ich die Daten der Heizung von aus einer XML Datei unter einer URL auslesen. Nun muss ich aber auch die Daten unter der UML ändern können. Dafür versuche ich also ein HTTP Post auszuführen. Mein aktueller Code dafür sieht so aus:




    Im LogCat wird "Success, ..." ausgegeben deshalb gehe ich davon aus, dass der Code eigentlich stimmen sollt. Jedoch werden, wie ich in der XML Datei unter der Url ablesen kann, die Daten (In diesen Fall die Solltemperatur) nicht geändert. Ich habe leider keine Ahnung woran das liegt, da ich ja keine Exception geworfen bekomme. Liegt es vielleicht an der API, dass diese nicht richtig funktioniert? Wenn Ich die Adresse zu der ich meine Daten senden soll im Firefox öffnen möchte bekomme ich nur eine Fehlermeldung.


    Ich freue mich über jede Meinung/Hilfe!


    Liebe Grüße,


    Jonas

  • Danke für die Antwort. Ich habe jetzt mal auf Grund des Artikels folgende Zeilen Code geändert:



    Code
    //OutputStream output = new BufferedOutputStream(conn.getOutputStream());
                //output.write(body.getBytes());
                //output.flush();
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(conn.getOutputStream());
                outputStreamWriter.write(body);
                outputStreamWriter.flush();

    Leider scheint es immer noch nicht zu funktionieren. So langsam denke ich echt, dass es wohl an der API liegen muss, nichts was ich versuche funktioniert. Werde dann erstmal den Hersteller anschreiben.

  • Die API wird gehen teste es mit deinem Browser sowie in dem PDF File, oder nutze das win Programm . Ich denke es wird gehen. Es liegt mit sicherheit an der Übertragung zu dem Server vom Handy. An der API kann und will ich nicht glauben das wird der Hersteller getestet haben.
    Denke du musst dich noch etwas mit dem http Protokoll und der httpconnect beschäftigen.


    In deinem Code hast du es auch nicht so gemacht wie in dem Beispiel.

  • Bin mir auch ziemlich sicher das es in dem String mit "\n" nicht geht .
    Denn das ist eigentlich eine formatanweisung für eine neue zeile die Übersetzt werden muss. Mit sicherheit wird genau "\n" in deinen String und somit auch in deiner übertragennen Datei stehen. Und nicht z.B. ASCII 0x0A oder 0x0C für LF CR.
    Wenn dann Formatiere deinen String mit "format" ,und mit URLEncoder.encode wird er auch in den richtigen Zeichensatz konvertiert.

  • So also den zwischenschrit mit String.format( ...) brauchst du nicht .
    Die übersetzung mit URLEntcoder ja.
    Ob wirklich der UTF-8 Zeichensatz verwendet werden muss oder ein anderer weiss ich nicht genau dazu müsste ich mir nochmal deine API anschauen.



    String data = URLEncoder.encode(postString, "UTF-8");
    OutputStreamWriter output = new OutputStreamWriter(conn.getOutputStream());
    output.write(data);
    output.flush() ;

  • Du hast recht, mit dem Testprogramm funktioniert es also liegt es wohl doch an meinem Code. Habe mal ein Bild mit der XML Datei angehangen, die das Testprogramm benutzt.


    Ich habe jetzt mal in meinem String "\n" raus gelöscht. Das Problem ist, dass ich version=\"1.0\" mit \ schreiben muss da es sind mit den "-Zeichen Syntaxfehler gibt. Weißt du wie ich das lösen könnte?


    String data = URLEncoder.encode(postString, "UTF-8"); habe ich versucht aber das scheint auch nicht zu klappen, außerdem wird mit im LogCat für data folgendes ausgegeben: +%3CDevices%3E+%3CDevice%3E+%3CID%3EEZR0114AF%3C%2FID%3E+%3CHEATAREA+nr%3D%224%22%3E+%3CT_TARGET%3E18.0%3C%2FT_TARGET%3E+%3C%2FHEATAREA%3E+%3C%2FDevice%3E+%3C%2FDevices%3E


    Das kann ja eigentlich auch nicht richtig sein.


    Denkst du es liegt wirklich an meinem String oder kann es auch trotzdem noch an anderen Stellen in meinem Code liegen.

  • Hi dein String so wie er am Anfang war ist schon richtig auch die Zeilenumbrüche "/n" (UTF-8 %0A) stimmen.
    Nur hast du ihn nicht in den Zeichensatz UTF-8 Konvertiert das macht URLEntcoder.
    Dein String vom Anfang sieht bei mir so aus.

    Code
    %3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A+%3CDevices%3E%0A+%3CDevice%3E%0A+%3CID%3EEZR0114AF%3C%2FID%3E%0A+%3CHEATAREA+nr%3D%224%22%3E%0A+%3CT_TARGET%3E18.7%3C%2FT_TARGET%3E%0A+%3C%2FHEATAREA%3E%0A+%3C%2FDevice%3E%0A+%3C%2FDevices%3E

    in welchen Zeichensatz deine Steuerung es haben will weiss ich nicht.


    Zitat

    im LogCat für data folgendes ausgegeben:
    +%3CDevices%3E+%3CDevice%3E+%3CID%3EEZR0114AF%3C%2FID%3E+%3CHEATAREA+nr%3D%224%22%3E+%3CT_TARGET%3E18.0%3C%2FT_TARGET%3E+%3C%2FHEATAREA%3E+%3C%2FDevice%3E+%3C%2FDevices%3E
    Das kann ja eigentlich auch nicht richtig

    ist schon richtig nur fehlt bei dir die erste Zeile und der Zeilenumbruch.
    Die erste Zeile <?xml version=\"1.0\" encoding=\"UTF-8\"?> wird aber die API brauchen.
    Ein in UTF-8 Kodirter Text sieht nun mal so aus mit den Prozent Zeichen. Schaue dir die Zeichensätze im Internet mal an.
    ASCII hatte immer nur ein Byte pro Zeichen somit sind max 256 Zeichen (Druckbar oder auch nicht Druckbare Zeichen wie 0A 0C) möglich das reichte nicht für alle möglichen Zeichen und Sprachen( Chinesische Schriftzeichen) aus, also erfand man den Unicode der 32 Bit breit ist . Um Speicherplatz und Bandbreite zu sparen wurde der UTF-8 erfunden.



    Der meist für Http benutz wird.


    auch könnte es sinvoll sein die parameter in der URLConnection zu setzen


    con.setRequestProperty( "Content-Type","application/x-www-form-urlencoded" );
    con.setRequestProperty( "charset", "utf-8");
    con.setRequestProperty( "Content-Length", String.valueOf(data.getBytes().length) );


    Mal eine andere Frage die Premission hast du gesetzt oder?

  • hier noch ein recht sinvolles Video

    Externer Inhalt www.youtube.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Danke für deine Hilfe!


    Also das ist mein Code zum aktuellen stand:



    Habe mir das Video angeguckt aber außer der Fähigkeit die Antwort zu erhalten habe ich nicht viel verändert. Ich bekomme jetzt auch den gleichen String wie du ausgegeben:



    Code
    %3C%3Fxml+version%3D%221.0%22+encoding%3D%22UTF-8%22%3F%3E%0A+%3CDevices%3E%0A+%3CDevice%3E%0A+%3CID%3EEZR0114AF%3C%2FID%3E%0A+%3CHEATAREA+nr%3D%224%22%3E%0A+%3CT_TARGET%3E18.7%3C%2FT_TARGET%3E%0A+%3C%2FHEATAREA%3E%0A+%3C%2FDevice%3E%0A+%3C%2FDevices%3E


    Funktionieren tut es leider immer noch nicht.


    Mit Permission meinst du die Internet Berechtigung im manifest?



    Code
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

    Die habe ich natürlich gegeben.

  • Was steht denn im Antwortstring?
    Wird überhaupt eine Verbindung zum Server Steuerung aufgebaut.
    Versuche mal eine Datei vom Server zu lesen.
    Notfalls richte dir einen Server ein auf den du mit dem win Programm Daten sendest als ob es deine Steuerung wäre. Dann kannst du sehen was da geschickt wird.
    Und was dein Handy schickt.


    Ps. Könntest auch einen Http Sniffer benutzen und die Verbindung zum Server Steuerung mit dem Windows Programm aufzeichnen.
    z.B. HTTPNetworkSniffer

  • Wieso konnte man das nicht einfach leichter machen und JSON als API nehmen :D
    Wenn wirklich kannst du dir ja Postman holen und damit probieren. So mache ich das bei meinen API's. Damit kannst du GET/POST.... und so weiter an den Server schicken und mal schauen was er so antwortet.

  • Andy61 wenn du den Artikel vom Anfang an list würst du sehen, das er eine handelsübliche Heizungs Steuerung hat die eben genau diese XML basierende API anbietet. Und die will er benutzen. Was man ihr schicken und was sie antwortet steht eigentlich recht gut beschrieben in der Doku die er im ersten Post zur Verfügung gestellt hat.
    Verbesserungsvorschläge wie Json satt XML kannst du ja mal an den Hersteller schicken.
    Die Steuerung bietet auch ein Web Interface und eine XML API über den Browser. Ebenfalls gibt es eine app. Er hat es sich eben in den kopf gesetz es selber zu machen.
    Scheint aber ein par Schwierigkeiten beim Umgang mit http in Java zu haben.
    Dabei wollte ich ihn helfen.


    Leider hat er noch nicht auf meine Fragen wie was im antwortstring steht geantwortet.
    Denn wenn er eine Antwort bekommt heißt das das zu mindestens erstmal eine Verbindung mit der Steuerung vorhanden ist. Die Fehler Codes kann man auch beim Hersteller im Internet nachschauen.

  • Andy61 Postman ist keine schlechte Idee, aber das geht glaube ich nur im Browser. Berichtige mich wenn ich falsch liege.
    Da es ein Win Programm (exe) ist und nicht im Browser läuft habe ich einen Sniffer benutzt um zu sehen was das Prog an die Steuerung schickt.


    Bei der Kommunikation über den Browser, wird bestimmt erst eine "Get" Request an den Server geschickt. Denn
    der Brauser schickt ohne extra angaben immer einen Get Request. ( "http://ip/data/changes.xml" ).
    Daraufhin wird der Server eine Html Seite mit einem Formular schicken, wo mann die mit "Post" zusendende Befehlsdatei auswählen und senden kann.
    Bei dieser Kommunikation würde Postman helfen. Da alles im Browser abläuft.


    Wie gesagt will er gleich ein "Post" an den Server schicken so wie es das Windows Programm oder die App auch macht.


    Wie die Komunikation im Browser genau abläuft hat er uns leider noch nicht geschildert.
    Ist aber für sein Vorhaben auch nicht so wichtig.

  • So habe deinen Code angepasst. Die Übersetzung in den UTF-8 Code braucht man scheinbar nicht.

    Im Anhang zwei Bilder mit dem Http Frame von dem WinProgramm Alpha2 und von dem was das Handy erzeugt.
    Sind in den wichtigsten sachen gleich. Die IP und ID musst du anpassen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!