Hoje quero portar um miniaplicativo de check-in automático usando HttpClient para Android. Felizmente, o Android SDK vem com o pacote HttpClient. Ao examinar a documentação do Android, descobri que o oficial também fornece um AndroidHttpClient que implementa a interface HttpClient. Pesquisei online e não encontrei nenhum artigo sobre AndroidHttpClient. Claro, você pode continuar usando DefaultHttpClient, mas é naturalmente melhor usar AndroidHttpClient personalizado para Android.
Abaixo estão 2 HttpServlets para teste :
Copie o código do código da seguinte forma:
classe pública LogIn estende HttpServlet {
/**
* Processa solicitações para HTTP
* <code>GET</code> e
* Métodos <code>POST</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
protegido void processRequest (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
resposta.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = resposta.getWriter();
HttpSession session=request.getSession();
String info=request.getParameter("info");
session.setAttribute("informações", informações);
tentar {
/* TODO exibe sua página aqui. Você pode usar o seguinte código de exemplo */.
out.println("OK");
} finalmente {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal + à esquerda para editar o código.">
/**
* Lida com o HTTP
* Método <code>GET</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
@Substituir
protegido void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
processRequest(solicitação, resposta);
}
/**
* Lida com HTTP
* Método <code>POST</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
@Substituir
protegido void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
processRequest(solicitação, resposta);
}
/**
* Retorna uma breve descrição do servlet.
*
* @return uma String contendo a descrição do servlet
*/
@Substituir
public String getServletInfo() {
retornar "Breve descrição";
}// </editor-fold>
}
Copie o código do código da seguinte forma:
classe pública Info estende HttpServlet {
/**
* Processa solicitações para HTTP
* <code>GET</code> e
* Métodos <code>POST</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
protegido void processRequest (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
resposta.setContentType("text/html;charset=UTF-8");
PrintWriter out = resposta.getWriter();
HttpSession session=request.getSession();
String info=(String)session.getAttribute("info");
tentar {
/* TODO exibe sua página aqui. Você pode usar o seguinte código de exemplo */.
if(info==nulo)
out.print("nulo");
outro
saída.print(info);
} finalmente {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Clique no sinal + à esquerda para editar o código.">
/**
* Lida com HTTP
* Método <code>GET</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
@Substituir
protegido void doGet (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
processRequest(solicitação, resposta);
}
/**
* Lida com o HTTP
* Método <code>POST</code>.
*
* @param request solicitação de servlet
* @param resposta resposta do servlet
* @throws ServletException se ocorrer um erro específico do servlet
* @throws IOException se ocorrer um erro de E/S
*/
@Substituir
protegido void doPost (solicitação HttpServletRequest, resposta HttpServletResponse)
lança ServletException, IOException {
processRequest(solicitação, resposta);
}
/**
* Retorna uma breve descrição do servlet.
*
* @return uma String contendo a descrição do servlet
*/
@Substituir
public String getServletInfo() {
retornar "Breve descrição";
}// </editor-fold>
}
O código principal está em processRequest, você não precisa olhar os outros.
Ao acessar o LogIn, passe um valor chamado info. Neste momento o navegador receberá um cookie utilizado para localizar a sessão do servidor. Em seguida, visite Info. Se houver um cookie, o servidor poderá encontrar o valor que você acabou de passar e devolvê-lo para você. Se não houver cookie, ele não poderá ser encontrado.
Código lateral do Android:
Copie o código do código da seguinte forma:
classe pública MainActivity estende atividade {
private AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Substituir
public void onCreate(pacote salvoInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Substituir
public void onClick(Visualizar v) {
// TODO stub de método gerado automaticamente
new Thread(rTest).start();
}
});
}
private String toString(InputStream is) lança IOException{
String ret="";
InputStreamReader isr = novo InputStreamReader (é);
BufferedReader br=novo BufferedReader(isr);
String tmp=br.readLine();
enquanto(tmp!=nulo){
ret+=tmp;
tmp=br.readLine();
}
close();
retorno ret;
}
private Executável rTest=new Runnable() {
@Substituir
execução nula pública() {
// TODO stub de método gerado automaticamente
tentar {
Contexto BasicHttpContext=new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
Lista <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "Olá mundo!!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
Resposta HttpResponse=mHttpclient.execute(httppost,context);
Entidade HttpEntity = resposta.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
entidade.consumeContent();
HttpGet httpget2 = novo HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse resposta2=mHttpclient.execute(httpget2,context);
HttpEntity entidade2 = resposta2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
entidade2.consumeContent();
} catch (IOException e) {
// TODO Bloco catch gerado automaticamente
e.printStackTrace();
}
}
};
}
A diferença entre AndroidHttpClient e DefaultHttpClient :
AndroidHttpClient não pode ser executado no thread principal e lançará uma exceção. AndroidHttpClient obtém a instância através do método estático newInstance O parâmetro é o proxy. Se nenhum proxy for usado, preencha "". DefaultHttpClient habilita cookies por padrão. AndroidHttpClient não habilita cookies por padrão. Para usá-lo, adicione um parâmetro HttpContext e adicione CookieStore sempre que executar. Não se esqueça de fechar após o uso, caso contrário não será possível criar uma nova instância.