Hoy quiero portar un subprograma de registro automático usando HttpClient a Android. Afortunadamente, el SDK de Android viene con el paquete HttpClient. Al revisar la documentación de Android, descubrí que el funcionario también proporciona un AndroidHttpClient que implementa la interfaz HttpClient. Busqué en línea y no encontré ningún artículo sobre AndroidHttpClient. Por supuesto, puede seguir usando DefaultHttpClient, pero naturalmente es mejor usar AndroidHttpClient personalizado para Android.
A continuación se muestran 2 HttpServlets para realizar pruebas :
Copie el código de código de la siguiente manera:
El inicio de sesión de clase pública extiende HttpServlet {
/**
* Procesa solicitudes tanto para HTTP
* <código>OBTENER</código> y
* Métodos <code>POST</code>.
*
* @param solicitud de servlet
* @param respuesta del servlet de respuesta
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
Solicitud de proceso vacía protegida (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
respuesta.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter fuera = respuesta.getWriter();
HttpSession sesión=request.getSession();
Cadena información=request.getParameter("información");
session.setAttribute("información", información);
intentar {
/* TODO genera su página aquí. Puede usar el siguiente código de muestra */.
out.println("OK");
} finalmente {
fuera.cerrar();
}
}
// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Haga clic en el signo + a la izquierda para editar el código.">
/**
* Maneja el HTTP
* Método <código>GET</código>.
*
* @param solicitud de servlet
* @param respuesta del servlet de respuesta
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
@Anular
doGet vacío protegido (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
procesoSolicitud(solicitud, respuesta);
}
/**
* Maneja el HTTP
* Método <código>POST</código>.
*
* @param solicitud de servlet
* Respuesta del servlet de respuesta @param
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
@Anular
Protegido void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
procesoSolicitud(solicitud, respuesta);
}
/**
* Devuelve una breve descripción del servlet.
*
* @return una cadena que contiene la descripción del servlet
*/
@Anular
cadena pública getServletInfo() {
devolver "Breve descripción";
}// </editor-fold>
}
Copie el código de código de la siguiente manera:
La información de clase pública extiende HttpServlet {
/**
* Procesa solicitudes tanto para HTTP
* <código>OBTENER</código> y
* Métodos <code>POST</code>.
*
* @param solicitud de servlet
* Respuesta del servlet de respuesta @param
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
Solicitud de proceso vacía protegida (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
respuesta.setContentType("text/html;charset=UTF-8");
PrintWriter fuera = respuesta.getWriter();
HttpSession sesión=request.getSession();
Información de cadena=(Cadena)session.getAttribute("información");
intentar {
/* TODO genera su página aquí. Puede usar el siguiente código de muestra */.
si(información==nulo)
out.print("nulo");
demás
salida.imprimir(información);
} finalmente {
fuera.cerrar();
}
}
// <editor-fold defaultstate="collapsed" desc="Métodos HttpServlet. Haga clic en el signo + a la izquierda para editar el código.">
/**
* Maneja el HTTP
* Método <código>GET</código>.
*
* @param solicitud de servlet
* @param respuesta del servlet de respuesta
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
@Anular
doGet vacío protegido (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
procesoSolicitud(solicitud, respuesta);
}
/**
* Maneja el HTTP
* Método <código>POST</código>.
*
* @param solicitud de servlet
* @param respuesta del servlet de respuesta
* @throws ServletException si ocurre un error específico del servlet
* @throws IOException si ocurre un error de E/S
*/
@Anular
Protegido void doPost (solicitud HttpServletRequest, respuesta HttpServletResponse)
lanza ServletException, IOException {
procesoSolicitud(solicitud, respuesta);
}
/**
* Devuelve una breve descripción del servlet.
*
* @return una cadena que contiene la descripción del servlet
*/
@Anular
cadena pública getServletInfo() {
devolver "Breve descripción";
}// </editor-fold>
}
El código principal está en proceso Solicitud, no es necesario mirar los demás.
Al acceder a Iniciar sesión, pase un valor llamado información. En este momento, el navegador utilizará una cookie para localizar la sesión del servidor. Luego visite Información. Si hay una cookie, el servidor puede encontrar el valor que acaba de pasar y devolvérselo. Si no hay ninguna cookie, no se puede encontrar.
Código lateral de Android:
Copie el código de código de la siguiente manera:
clase pública MainActivity extiende Actividad {
privado AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Anular
public void onCreate (paquete saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Anular
public void onClick (Ver v) {
// TODO Código auxiliar de método generado automáticamente
nuevo hilo(rTest).start();
}
});
}
cadena privada toString (InputStream es) lanza IOException {
Cadena ret="";
InputStreamReader isr=nuevo InputStreamReader(es);
BufferedReader br=nuevo BufferedReader(isr);
Cadena tmp=br.readLine();
mientras(tmp!=nulo){
ret+=tmp;
tmp=br.readLine();
}
br.cerrar();
volver atrás;
}
Ejecutable privado rTest=nuevo Ejecutable() {
@Anular
ejecución pública vacía() {
// TODO Código auxiliar de método generado automáticamente
intentar {
Contexto BasicHttpContext=nuevo BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = nuevo HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
Lista <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "¡¡Hola mundo!!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
HttpResponse respuesta=mHttpclient.execute(httppost,context);
entidad HttpEntity = respuesta.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
entidad.consumeContent();
HttpGet httpget2 = nuevo HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse respuesta2=mHttpclient.execute(httpget2,context);
HttpEntity entidad2 = respuesta2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
entidad2.consumeContent();
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
}
};
}
La diferencia entre AndroidHttpClient y DefaultHttpClient :
AndroidHttpClient no se puede ejecutar en el hilo principal y generará una excepción. AndroidHttpClient obtiene la instancia a través del método estático newInstance. El parámetro es el proxy. Si no se utiliza ningún proxy, complete "". DefaultHttpClient habilita las cookies de forma predeterminada. AndroidHttpClient no habilita las cookies de forma predeterminada. Para usarlo, agregue un parámetro HttpContext y agregue CookieStore cada vez que ejecute. No olvide cerrar después de su uso; de lo contrario, no podrá crear una nueva instancia.