PDFs und POST Parameter. Hilfe, ich bin verzweifelt

  • Antworten:13
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 13:44:23 via Website

Hallo Freunde,
Seit Tagen mache ich eine Webview App für einen Kunden und stoße immer wieder auf das gleiche Problem.
Beim Start der App wird eine Webseite aufgerufen, wo ich mich als Benutzer anmelden soll.
Nach dem Anmelden werde ich auf die folgenden Seiten geleitet. Irgendwo auf der Webseite gibt es Link zu den PDFs der Firma. In meinem Programm gibt es eine Methode, die die PDFs erkennt, runterlädt und anzeigt. Wenn ich die PDFS der Firma runterladen möchte, passiert Folgendes:
Ordner zum Abspeichern der PDFs wird am Smartphone erstellt.
Datei mit dem korrekten Namen wird in dem Ordner erstellt.
Die Auswahl der Programme zum Öffnen der runtergeladenen PDF wird dargestellt.
Beim Öffnen der PDF werde ich mit der Meldung: „die Datei kann nicht geöffnet werden, da es sich um kein gültiges PDF handelt“ benachrichtigt. Ich habe die Datei mit Visual Studio geöffnet und habe gesehen, dass mein Handy einfach ein HTML Code in die Datei reingeschrieben hat.
Grund dafür ist laut dem Kunden folgender: da fehlen die POST Parameter. Dh das Programm denkt, dass ich mich nicht autorisiert habe, deswegen schickt es mir kein PDF, sondern HTML Code welcher mir sagt, dass ich mich autorisieren soll. Dh ich muss wie auch immer die POST Parameter rauskriegen.
Da ich schon mehrfach nach der Lösung gegooglt habe und leider nicht findig geworden bin, wollte ich mal fragen ob das bei Android überhaupt möglich ist? Vlt kämpfe ich da mit dem Problem, welches sich gar nicht realisieren lässt.
Wenn es eine Lösung gibt, wie konnte man das am besten machen ?
Hilfe Leute, ich bin verzweifelt.
Mit freundlichen Grüßen.

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.08.2012, 13:48:05 via Website

Installier dir das Plugin Firebug für den Firefox.
Das hat einen Netzwerk Monitor, der dir alle Requests in allen Details anzeigt.
Dort kannst Du die übertragenen POST Parameter beim PDF Download einsehen und sie anschließend in deiner App mit dem HttpClient nachbauen.
Zum HttpClient gibt es ja jede Menge Tutorials bei Google.

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.08.2012, 13:53:14 via Website

Hallo und herzlich willkommen bei AndroidPIT sergej,

vermutlich wirst Du im HttpHeader die korrekte Session ID oder was immer da als Authentication Token verwendet wird, mit übertragen müssen. In so einem Falle geschieht das meist durch Übermittlung der korrekten SeesionID im Header.

lg Voss

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 15:40:52 via Website

Das Problem ist, dass in der Webapp ein Webservice aufgerufen wird, welcher Anhang eines Formulars die Logindaten erhält und daraufhin eine pdf zurückgibt.
Jetzt muss ich die Daten ( headen parameter ) aus dem Formular auslesen, um entsprechenden Aufruf an den Webservice senden zu können.

— geändert am 15.08.2012, 15:43:31

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 18:06:54 via Website

die Daten sind wie ich es erfahren habe dynamisch und nicht statisch.

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

15.08.2012, 18:37:49 via App

Dynamisch oder statisch? Das macht nichts. Die Website selbst muss dies ebenfalls leisten - deshalb wird es auch für Dich immer funktionieren.

Das Entscheidende für Dich ist nun, wie bereits von anderen ausgeführt, das Muster im erzeugten HTML Code zu erkennen. Welche Post Parameter, ggfs. in welcher Reihefolge, musst Du übermitteln und welche dieser Parameter musst Du aus dem dynamisch erzeugten HTML-Dokument rausschneiden und unmodifiziert oder gar verändert weiterleiten.

Das kann schon mal etwas dauern klappt aber immer.

Hier ist REGEX, zum Beispiel in Form eines Patern/Matcher, wie von RafaelK genannt, absolut erste Wahl.

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 19:56:48 via Website

Hallo und danke für die ersten Hinweise.

Die Seite enthält 0 - n mögliche Formulare, die gleichzeitig auf der Seite zu finden sind und alle haben unterschiedliche POST Parameter.

Wie bekomme ich denn von einer aktuell im WebView geladen Seite den Quellcode?

Des Weiteren verstehe noch nicht ganz, wie ich die mit Regex eingelesenen Formulare bei einer Aktion (Klick auf einen Submit Knopf) im WebView zuordnen soll.


Gruß

Sergej

Antworten
Gelöschter Account
  • Forum-Beiträge: 5.136

15.08.2012, 20:10:26 via Website

Hast Du Dir denn wie von Rafael vorgeschlagen das ganze mal mit Firebug angeschaut? Das liefert Dir alle Informationen die Du benötigst!

lg Voss

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 20:38:57 via Website

Ich benötige die aktuellen Daten zu Laufzeit der App.

Es bringt mir leider nichts sie vorher mit Firebug auszulesen.

Gruß

Sergej

Antworten
Markus B.
  • Forum-Beiträge: 636

15.08.2012, 20:43:24 via Website

sergej
Ich benötige die aktuellen Daten zu Laufzeit der App.

Es bringt mir leider nichts sie vorher mit Firebug auszulesen.

Gruß

Sergej

Es geht ja auch darum, dir mit Firebug anzuschauen, wie die Kommunikation mit dem Web-Server abläuft. Dann kannst du das Verhalt in deiner App implementieren. Genau dafür ist Firebug einfach perfekt.

Gruß,
Markus

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

15.08.2012, 21:23:56 via App

Mit Firebug findest Du heraus wie die Post Parameter aufgebaut werden müssen, mit dem Quellcode der Seite (mit jedem Browser zu machen) findest Du heraus wie Du an die Daten für diese Parameter kommst.

Das Wissen über beides verwendest Du dann in Deiner App um die dynamisch aufgebauten HTML-Seiten durchsuchen und die benötigten Daten für die Requests rausschneiden zu können.

Das geht m.W. nicht mit WebView. Requests gehen z.B. über HTTPGet/HTTPPost. Das Ausschneiden der Daten für die Parameter mit Javas Pattern/Matcher.

Markus B.

Antworten
Gelöschter Account
  • Forum-Beiträge: 35

15.08.2012, 22:28:48 via Website

Hallo,

ich finde es echt klasse wie ihr bemüht seid bei meinem Problem zu helfen, aber mich beschleicht der Verdacht, dass unsere Konversation etwas aneinander vorbei geht.

In meinem ersten Post war ich vielleicht etwas ungenau, deshalb versuche ich den Prozess nochmal genauer zu skizzieren.

Der Kunde hat eine Webapp, welche den Benutzern unterschiedliche Dienste zur Verfügung stellt. Einer der Dienste ermöglicht dem Benutzer Zugriff auf ein proprietäres CMS. Der Dienst zeigt dem Benutzer an auf welche Dateien er zugreifen kann. Im handelsüblichen Browser kann der Benutzer nun auf einen Link (Submit-Button) klicken und darauf hin wird der Download der Datei gestartet.

Der Kunde möchte, dass eine Android App entwickelt wird, welche aus einem WebView besteht und einem Menü in dem man ein paar Einstellungen des WebViews aktivieren, oder deaktivieren kann. In dem WebView soll nun die Startseite der Webapp angezeigt werden. Die Navigation soll ausschließlich über den WebView erfolgen. Wenn der Benutzer jetzt den auf einen Link (Submit-Button) des CMS Dienstes klickt soll der Download gestartet werden und die Datei mit einem geeignetem Programm geöffnet werden.

Im Beispiel eines DownloadListeners erhalte ich immer nur die URL des Aufrufs, aber um den Download erfolgreich zu initiieren brauche ich die zugehörigen POST Parameter.

Fällt euch für diese Problemstellung eine Lösung ein?


Ich hoffe ich konnte hiermit zum besseren Verständnis des Problems beitragen.

Gruß

Sergej

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

15.08.2012, 22:53:00 via Website

OK der Nebel lichtet sich :)

Ich hab jetzt auf Anhieb keinen Weg gesehen POSTs beim WebView abzufangen.
Mir fallen da jetzt spontan nur 2 Sachen ein:

1) Den WebView alles handlen lassen
Downloads iniziert der ja auch von allein. Die Dokumente werden dann nur evtl. nicht automatisch geöffnet

2) Die Daten zur Anzeige im WebView im Hintergrund laden und vorverarbeiten
Dafür gibt es die Methode loadDataWithBaseUrl()
Damit kannst Du den HTML Code als String übergeben und z.B. so vorverarbeiten, dass die enthaltenen Formulare on-the-fly von POST in GET umgebaut werden.
Dann hast Du nämlich die Parameter direkt in der URL und kannst sie im Listener des WebView auslesen.
Dem Webserver ist es idR egal wie er primitive Parameter bekommt. POST/GET wird meist gleich behandelt.

Antworten