Chciałbym wysłać zapytanie http do zdalnego serwera przy prawidłowej obsłudze ciasteczek (np. Przechowywanie ciasteczek wysyłanych przez serwer i wysyłanie tych ciasteczek przy kolejnych zapytaniach). Byłoby miło zachować wszystkie pliki cookie, ale tak naprawdę jedyne, na czym mi zależy, to sesyjne.
Wydaje się, że w przypadku java.net preferowanym sposobem jest użycie java.net.CookieHandler (abstrakcyjna klasa bazowa) i java.net.CookieManager (konkretna implementacja). Android ma java.net.CookieHandler, ale wygląda na to, że nie ma java.net.CookieManager.
Mógłbym to wszystko zakodować ręcznie, sprawdzając nagłówki http, ale wydaje się, że musi być prostszy sposób.
Jaki jest właściwy sposób wysyłania żądań http w systemie Android przy zachowaniu plików cookie?
java.net.CookieManager
jest teraz obsługiwany w Androidzie od wersji 2.3 (poziom API 9): developer.android.com/reference/java/net/CookieManager.htmlOdpowiedzi:
Okazuje się, że Google Android jest dostarczany z Apache HttpClient 4.0 i udało mi się dowiedzieć, jak to zrobić, korzystając z przykładu „Logowanie na podstawie formularza” w dokumentacji HttpClient :
https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
źródło
The method getCookieStore() is undefined for the type HttpClient
, czy muszę się zmienićList<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
? Bo jeśli tak, to działa.Plik cookie to po prostu kolejny nagłówek HTTP. Zawsze możesz to ustawić podczas wykonywania wywołania HTTP z biblioteką Apache lub HTTPUrlConnection. Tak czy inaczej, powinieneś być w stanie odczytywać i ustawiać pliki cookie HTTP w ten sposób.
Możesz przeczytać ten artykuł, aby uzyskać więcej informacji.
Mogę podzielić się swoim kodem, aby pokazać, jak łatwo możesz to zrobić.
źródło
Ponieważ biblioteka Apache jest przestarzała , dla tych, którzy chcą z niej korzystać
HttpURLConncetion
, napisałem tę klasę, aby wysyłać żądanie pobierania i wysyłania za pomocą tej odpowiedzi :źródło
Nie pracuję z Google Android, ale myślę, że nie jest to takie trudne. Jeśli przeczytasz odpowiedni fragment samouczka Java , zobaczysz, że zarejestrowany program obsługi plików cookie otrzymuje wywołania zwrotne z kodu HTTP.
Więc jeśli nie ma wartości domyślnej (czy sprawdziłeś, czy
CookieHandler.getDefault()
naprawdę jest null?), Możesz po prostu rozszerzyć CookieHandler, zaimplementować metodę put / get i sprawić, by działała prawie automatycznie. Pamiętaj, aby rozważyć jednoczesny dostęp i tym podobne, jeśli wybierzesz tę trasę.edycja: Oczywiście musiałbyś ustawić wystąpienie swojej niestandardowej implementacji jako domyślną procedurę obsługi,
CookieHandler.setDefault()
aby otrzymywać wywołania zwrotne. Zapomniałem o tym wspomnieć.źródło