Eu gostaria de fazer uma solicitação http para um servidor remoto enquanto manipulava adequadamente os cookies (por exemplo, armazenando cookies enviados pelo servidor e enviando esses cookies quando eu fizer solicitações subsequentes). Seria bom preservar todos e quaisquer cookies, mas realmente o único que me interessa é o cookie de sessão.
Com o java.net, parece que a maneira preferida de fazer isso é usar java.net.CookieHandler (classe base abstrata) e java.net.CookieManager (implementação concreta). O Android tem o java.net.CookieHandler, mas parece não ter o java.net.CookieManager.
Eu poderia codificar tudo manualmente inspecionando os cabeçalhos http, mas parece que deve haver uma maneira mais fácil.
Qual é a maneira correta de fazer solicitações de HTTP no Android e preservar os cookies?
java.net.CookieManager
agora é suportado no Android desde (nível API 9) versão 2.3: developer.android.com/reference/java/net/CookieManager.htmlRespostas:
Acontece que o Google Android é fornecido com o Apache HttpClient 4.0, e eu pude descobrir como fazer isso usando o exemplo "Logon baseado em formulário" nos documentos do HttpClient :
https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientFormLogin.java
fonte
The method getCookieStore() is undefined for the type HttpClient
, eu tenho que mudar paraList<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();
? Porque se eu fizer, funciona.Um cookie é apenas outro cabeçalho HTTP. Você sempre pode configurá-lo ao fazer uma chamada HTTP com a biblioteca apache ou com HTTPUrlConnection. De qualquer maneira, você poderá ler e definir cookies HTTP dessa maneira.
Você pode ler este artigo para obter mais informações.
Posso compartilhar minha paz de código para demonstrar como você pode facilitar.
fonte
Como a biblioteca Apache está obsoleta , para aqueles que desejam usar
HttpURLConncetion
, escrevi esta classe para enviar Solicitações de Recebimento e Postagem com a ajuda desta resposta :fonte
Eu não trabalho com o google android, mas acho que você descobrirá que não é tão difícil fazer isso funcionar. Se você ler a parte relevante do tutorial sobre Java, verá que um manipulador de cookies registrado recebe retornos de chamada do código HTTP.
Portanto, se não houver um padrão (você verificou se
CookieHandler.getDefault()
realmente é nulo?), Pode simplesmente estender o CookieHandler, implementar put / get e fazê-lo funcionar praticamente automaticamente. Certifique-se de considerar o acesso simultâneo e similares se você seguir esse caminho.editar: obviamente, você teria que definir uma instância da sua implementação personalizada como o manipulador padrão
CookieHandler.setDefault()
para receber os retornos de chamada. Esqueci de mencionar isso.fonte