Aujourd'hui, je souhaite porter une applet d'enregistrement automatique à l'aide de HttpClient sur Android. Heureusement, le SDK Android est fourni avec le package HttpClient. En parcourant la documentation Android, j'ai découvert que le responsable fournissait également un AndroidHttpClient qui implémentait l'interface HttpClient. J'ai effectué une recherche en ligne et n'ai trouvé aucun article sur AndroidHttpClient. Bien sûr, vous pouvez continuer à utiliser DefaultHttpClient, mais il est naturellement préférable d'utiliser AndroidHttpClient personnalisé pour Android.
Vous trouverez ci-dessous 2 HttpServlets à tester :
Copiez le code comme suit :
La connexion de classe publique étend HttpServlet {
/**
* Traite les requêtes pour HTTP
* <code>GET</code> et
* Méthodes <code>POST</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
protected void processRequest (requête HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
réponse.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = réponse.getWriter();
HttpSession session=request.getSession();
String info=request.getParameter("info");
session.setAttribute("info", info);
essayer {
/* TODO affiche votre page ici. Vous pouvez utiliser l'exemple de code suivant */.
out.println("OK");
} enfin {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="Méthodes HttpServlet. Cliquez sur le signe + à gauche pour modifier le code.">
/**
* Gère le HTTP
* Méthode <code>GET</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
@Outrepasser
protected void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
processRequest (demande, réponse);
}
/**
* Gère le HTTP
* Méthode <code>POST</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
@Outrepasser
protected void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
processRequest (demande, réponse);
}
/**
* Renvoie une brève description du servlet.
*
* @renvoie une chaîne contenant la description du servlet
*/
@Outrepasser
chaîne publique getServletInfo() {
renvoyer « Brève description » ;
}// </editor-fold>
}
Copiez le code comme suit :
public class Info étend HttpServlet {
/**
* Traite les requêtes pour HTTP
* <code>GET</code> et
* Méthodes <code>POST</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
protected void processRequest (requête HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
réponse.setContentType("text/html;charset=UTF-8");
PrintWriter out = réponse.getWriter();
HttpSession session=request.getSession();
String info=(String)session.getAttribute("info");
essayer {
/* TODO affiche votre page ici. Vous pouvez utiliser l'exemple de code suivant */.
si(info==null)
out.print("null");
autre
out.print(info);
} enfin {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="Méthodes HttpServlet. Cliquez sur le signe + à gauche pour modifier le code.">
/**
* Gère le HTTP
* Méthode <code>GET</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
@Outrepasser
protected void doGet (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
processRequest (demande, réponse);
}
/**
* Gère le HTTP
* Méthode <code>POST</code>.
*
* @param demande une demande de servlet
* Réponse du servlet @param
* @throws ServletException si une erreur spécifique au servlet se produit
* @throws IOException si une erreur d'E/S se produit
*/
@Outrepasser
protected void doPost (demande HttpServletRequest, réponse HttpServletResponse)
lance ServletException, IOException {
processRequest (demande, réponse);
}
/**
* Renvoie une brève description du servlet.
*
* @renvoie une chaîne contenant la description du servlet
*/
@Outrepasser
chaîne publique getServletInfo() {
renvoyer « Brève description » ;
}// </editor-fold>
}
Le code principal est dans processRequest, vous n’avez pas besoin de regarder les autres.
Lors de l'accès à LogIn, transmettez une valeur nommée info. À ce moment, le navigateur recevra un cookie utilisé pour localiser la session du serveur. Visitez ensuite Info. S'il y a un cookie, le serveur peut trouver la valeur que vous venez de transmettre et vous la renvoyer. S'il n'y a pas de cookie, il est introuvable.
Code côté Android :
Copiez le code comme suit :
la classe publique MainActivity étend l'activité {
private AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Outrepasser
public void onCreate (Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Outrepasser
public void onClick (Afficher v) {
// TODO Stub de méthode généré automatiquement
new Thread(rTest).start();
}
});
}
private String toString (InputStream is) lance IOException {
Chaîne ret="";
InputStreamReader isr=nouveau InputStreamReader(est);
BufferedReader br=nouveau BufferedReader(isr);
String tmp=br.readLine();
pendant que(tmp!=null){
ret+=tmp;
tmp=br.readLine();
}
br.close();
retour à la retraite;
}
privé Runnable rTest=nouveau Runnable() {
@Outrepasser
public void run() {
// TODO Stub de méthode généré automatiquement
essayer {
BasicHttpContext context=new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
Liste <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "Bonjour tout le monde !!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
HttpResponse réponse=mHttpclient.execute(httppost,context);
Entité HttpEntity = réponse.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
entité.consumeContent();
HttpGet httpget2 = new HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse réponse2=mHttpclient.execute(httpget2,context);
HttpEntity entité2 = réponse2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
Entité2.consumeContent();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
} ;
}
La différence entre AndroidHttpClient et DefaultHttpClient :
AndroidHttpClient ne peut pas être exécuté dans le thread principal et lèvera une exception. AndroidHttpClient obtient l'instance via la méthode statique newInstance. Le paramètre est le proxy Si aucun proxy n'est utilisé, remplissez "". DefaultHttpClient active les cookies par défaut. AndroidHttpClient n'active pas les cookies par défaut. Pour l'utiliser, ajoutez un paramètre HttpContext et ajoutez CookieStore à chaque exécution. N'oubliez pas de fermer après utilisation, sinon vous ne pourrez pas créer de nouvelle instance.