Ich möchte eine http-Anfrage an einen Remote-Server senden, während Cookies ordnungsgemäß verarbeitet werden (z. B. Speichern von vom Server gesendeten Cookies und Senden dieser Cookies, wenn ich nachfolgende Anfragen stelle). Es wäre schön, alle Cookies aufzubewahren, aber das einzige, was mich interessiert, ist das Sitzungscookie.
Bei java.net scheint die bevorzugte Methode die Verwendung von java.net.CookieHandler (abstrakte Basisklasse) und java.net.CookieManager (konkrete Implementierung) zu sein. Android hat java.net.CookieHandler, aber es scheint nicht java.net.CookieManager zu haben.
Ich könnte alles von Hand codieren, indem ich http-Header inspiziere, aber es scheint, dass es einen einfacheren Weg geben muss.
Was ist der richtige Weg, um http-Anfragen unter Android zu stellen und gleichzeitig Cookies zu erhalten?
java.net.CookieManager
Antworten:
Es stellt sich heraus, dass Google Android mit Apache HttpClient 4.0 ausgeliefert wird, und ich konnte anhand des Beispiels "Formularbasierte Anmeldung" in den HttpClient-Dokumenten herausfinden, wie dies funktioniert :
https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
quelle
The method getCookieStore() is undefined for the type HttpClient
, muss ich wechseln zuList<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
? Denn wenn ich es tue, funktioniert es.Ein Cookie ist nur ein weiterer HTTP-Header. Sie können es jederzeit festlegen, während Sie einen HTTP-Aufruf mit der Apache-Bibliothek oder mit HTTPUrlConnection tätigen. In beiden Fällen sollten Sie in der Lage sein, HTTP-Cookies auf diese Weise zu lesen und zu setzen.
Sie können diesen Artikel für weitere Informationen lesen .
Ich kann meinen Code-Frieden teilen, um zu demonstrieren, wie einfach Sie es machen können.
quelle
Da die Apache-Bibliothek für diejenigen, die sie verwenden möchten, veraltet ist
HttpURLConncetion
, habe ich diese Klasse geschrieben, um mithilfe dieser Antwort eine Get- und Post-Anfrage zu senden :quelle
Ich arbeite nicht mit Google Android, aber ich denke, Sie werden feststellen, dass es nicht so schwer ist, dies zum Laufen zu bringen. Wenn Sie das entsprechende Bit des Java-Tutorials lesen, werden Sie feststellen, dass ein registrierter Cookie-Handler Rückrufe vom HTTP-Code erhält.
Wenn es also keine Standardeinstellung gibt (haben Sie überprüft, ob sie
CookieHandler.getDefault()
wirklich null ist?), Können Sie einfach CookieHandler erweitern, put / get implementieren und es so gut wie automatisch zum Laufen bringen. Berücksichtigen Sie den gleichzeitigen Zugriff und dergleichen, wenn Sie diesen Weg gehen.Bearbeiten: Natürlich müssten Sie eine Instanz Ihrer benutzerdefinierten Implementierung als Standardhandler festlegen
CookieHandler.setDefault()
, um die Rückrufe zu erhalten. Ich habe vergessen, das zu erwähnen.quelle