Desktop-Http-Seite laden

  • Antworten:7
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 79

10.05.2019, 20:45:16 via Website

Hallo zusammen,

ich baue mir gerade eine einfache App, die mithilfe einer URLConnection eine Internetseite lädt, damit ich dann denn Inhalt parsen kann.

So im Prinzip funktioniert das auch, nur dass mir aufgefallen ist, dass in meiner App dann manche Informationen fehlen, die ich aber sehen kann, wenn ich am PC denselben GET-Aufruf mit RESTClient mache.
Nach ein wenig ausprobieren ist mir klar geworden, dass das daran liegt, dass der Aufruf am PC die Desktop-Version der Internetseite bekommt, meine URLConnection in der App aber als Antwort die mobile Seite bekommt.

Deshalb meine Frage: Kann ich der URL oder der URLConnection irgendwie beibringen, so zu tun, als würde die Abfrage von einem Desktop-PC kommen? Woran erkennen Internetseiten überhaupt, was für eine Art Gerät die Anfrage schickt, wenn man über WLAN mit dem Internet verbunden ist und man keinen Browser benutzt, sondern direkt einen Http-Get-Aufruf schickt?

Diskutiere mit!
  • Forum-Beiträge: 3.240

10.05.2019, 21:09:05 via Website

Moin Robert ,

so was Ähnliches hatte ich auch mal .
Was sagt bei dir JSoup - auf die verlasse ich mittlerweile bei so etwas blind.

— geändert am 10.05.2019, 21:16:53

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 7

10.05.2019, 23:12:44 via Website

Mit JavaScript kann man in der Webseite die Größe des Browser-Screens abfragen: stackoverflow.com/questions/254197/how-can-i-get-the-active-screen-dimensions. Leider keine Ahnung wie man das verhindern oder verändern kann.

Viele Grüße
Koje

Hilfreich?
Diskutiere mit!
Gelöschter Account
  • Forum-Beiträge: 79

11.05.2019, 08:14:57 via Website

Hallo zusammen,

ich habe noch ein bisschen gegoogelt und bei StackOverflow einen einfachen Workaround gefunden, der bei mir Problemlos klappt.

Bevor man Connect ausführt kann man noch den "User-Agent" so festlegen, dass er aussieht, wie bei einem Desktop:

urlConnection.setRequestProperty(
   "User-Agent",
   "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4"
);
Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 3.240

11.05.2019, 08:43:57 via Website

Und wie parst du dann letztendlich ?

Liebe Grüße - Stefan
[ App - Entwicklung ]

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.276

11.05.2019, 09:34:55 via Website

Genau, der Ansatz mit dem UserAgent ist völlig korrekt und nicht mal ein Workaround :-)

Für simple Informationen, die man extrahieren möchte, reichen auch schon RegEx völlig aus.
Es ist in diesem Fall sogar effizienter.

Es gibt einen legendären Post bei StackOverflow, der dramatisch darauf hinweist, dass das einen Riss ins Raum-Zeit-Kontinuum reißt wenn man mit RegEx HTML parsed, aber der trifft nur zu, wenn man so einen VOLLSTÄNDIGEN und UNIVERSELLEN Parser bauen möchte.
Es ist schon rein von der Theorie nicht möglich, weil die Komplexitätsklassen der beiden Sprachen (Chomsky Hierarchie) das nicht erlauben.

Siehe: https://stackoverflow.com/a/1732454/6655472

Noch eine Notiz am Rande:
Ich würde unter Android nicht mit URLConnection arbeiten. Es gibt so schöne HTTP Frameworks, die einem unfassbar viel Arbeit abnehmen.
OkHttp3 z.B. oder sogar Retrofit, wenn man noch einen integrierten JSON<->Objekt-Modell Konverter haben möchte.

— geändert am 11.05.2019, 09:45:45

Hilfreich?
Diskutiere mit!
Gelöschter Account
  • Forum-Beiträge: 79

11.05.2019, 09:43:31 via Website

Ja, genau, ich hole mir einfach mit GetContent den Inhalt und mache den mit einem BufferedReader zum String. Den Rest mache ich mit ein paar Substring-Abfragen. Nichts aufregendes. ^^

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 2.276

11.05.2019, 10:37:32 via Website

Wie gesagt, schau dir dafür mal OkHttp3 an.

Damit sieht das ganze so aus:

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder().url("http://google.de").build();
Response response = client.newCall(request).execute();
String html = response.body().string();

Keine Reader, viel robuster gegen Verbingungsprobleme.
Unterstützt alle aktuellen Übertragungsstandards.
Wenn du statt execute() einfach enqueue() nimmst, läuft es asynchron.
und und und....

Hilfreich?
Diskutiere mit!