Heute möchte ich ein automatisches Check-in-Applet mit HttpClient auf Android portieren. Glücklicherweise wird das Android SDK mit dem HttpClient-Paket geliefert. Beim Durchsehen der Android-Dokumentation habe ich festgestellt, dass der Beamte auch einen AndroidHttpClient bereitstellt, der die HttpClient-Schnittstelle implementiert. Ich habe online gesucht und keine Artikel über AndroidHttpClient gefunden. Natürlich können Sie weiterhin DefaultHttpClient verwenden, aber es ist natürlich besser, AndroidHttpClient zu verwenden, das für Android angepasst ist.
Unten sind 2 HttpServlets zum Testen :
Kopieren Sie den Codecode wie folgt:
Die öffentliche Klasse LogIn erweitert HttpServlet {
/**
* Verarbeitet Anfragen für beide HTTP
* <code>GET</code> und
* <code>POST</code>-Methoden.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
protected void ProcessRequest(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
Response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = Response.getWriter();
HttpSession session=request.getSession();
String info=request.getParameter("info");
session.setAttribute("info", info);
versuchen {
/* TODO geben Sie Ihre Seite hier aus.
out.println("OK");
} Endlich {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet-Methoden. Klicken Sie links auf das +-Zeichen, um den Code zu bearbeiten.">
/**
* Behandelt das HTTP
* <code>GET</code>-Methode.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
@Override
protected void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
ProcessRequest(Anfrage, Antwort);
}
/**
* Behandelt das HTTP
* <code>POST</code>-Methode.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
@Override
protected void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
ProcessRequest(Anfrage, Antwort);
}
/**
* Gibt eine kurze Beschreibung des Servlets zurück.
*
* @return einen String mit der Servlet-Beschreibung
*/
@Override
öffentlicher String getServletInfo() {
return „Kurzbeschreibung“;
}// </editor-fold>
}
Kopieren Sie den Codecode wie folgt:
öffentliche Klasseninfo erweitert HttpServlet {
/**
* Verarbeitet Anfragen für beide HTTP
* <code>GET</code> und
* <code>POST</code>-Methoden.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
protected void ProcessRequest(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
Response.setContentType("text/html;charset=UTF-8");
PrintWriter out = Response.getWriter();
HttpSession session=request.getSession();
String info=(String)session.getAttribute("info");
versuchen {
/* TODO geben Sie Ihre Seite hier aus.
if(info==null)
out.print("null");
anders
out.print(info);
} Endlich {
out.close();
}
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet-Methoden. Klicken Sie links auf das +-Zeichen, um den Code zu bearbeiten.">
/**
* Behandelt das HTTP
* <code>GET</code>-Methode.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
@Override
protected void doGet(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
ProcessRequest(Anfrage, Antwort);
}
/**
* Behandelt das HTTP
* <code>POST</code>-Methode.
*
* @param-Anfrage-Servlet-Anfrage
* @param Antwort-Servlet-Antwort
* @throws ServletException, wenn ein Servlet-spezifischer Fehler auftritt
* @throws IOException, wenn ein E/A-Fehler auftritt
*/
@Override
protected void doPost(HttpServletRequest-Anfrage, HttpServletResponse-Antwort)
wirft ServletException, IOException {
ProcessRequest(Anfrage, Antwort);
}
/**
* Gibt eine kurze Beschreibung des Servlets zurück.
*
* @return einen String mit der Servlet-Beschreibung
*/
@Override
öffentlicher String getServletInfo() {
return „Kurzbeschreibung“;
}// </editor-fold>
}
Der Hauptcode befindet sich in ProcessRequest, Sie müssen sich die anderen nicht ansehen.
Übergeben Sie beim Zugriff auf LogIn einen Wert mit dem Namen info. Zu diesem Zeitpunkt erhält der Browser ein Cookie, das zum Auffinden der Serversitzung verwendet wird. Besuchen Sie dann „Info“. Wenn ein Cookie vorhanden ist, kann der Server den gerade übergebenen Wert finden und an Sie zurücksenden. Wenn kein Cookie vorhanden ist, kann er nicht gefunden werden.
Android-Seitencode:
Kopieren Sie den Codecode wie folgt:
öffentliche Klasse MainActivity erweitert Aktivität {
privater AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Override
public void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Automatisch generierter Methoden-Stub
neuer Thread(rTest).start();
}
});
}
privater String toString(InputStream is) löst eine IOException{ aus
String ret="";
InputStreamReader isr=new InputStreamReader(is);
BufferedReader br=new BufferedReader(isr);
String tmp=br.readLine();
while(tmp!=null){
ret+=tmp;
tmp=br.readLine();
}
br.close();
return ret;
}
private Runnable rTest=new Runnable() {
@Override
public void run() {
// TODO Automatisch generierter Methoden-Stub
versuchen {
BasicHttpContext context=new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE,new BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
List <NameValuePair> nvps = new ArrayList <NameValuePair>();
nvps.add(new BasicNameValuePair("info", "Hallo Welt!!"));
httppost.setEntity(new UrlEncodedFormEntity(nvps,"utf-8"));
HttpResponse Response=mHttpclient.execute(httppost,context);
HttpEntity-Entity = Response.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
entity.consumeContent();
HttpGet httpget2 = new HttpGet("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse Response2=mHttpclient.execute(httpget2,context);
HttpEntity entity2 = Response2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
entity2.consumeContent();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
};
}
Der Unterschied zwischen AndroidHttpClient und DefaultHttpClient :
AndroidHttpClient kann nicht im Hauptthread ausgeführt werden und löst eine Ausnahme aus. AndroidHttpClient erhält die Instanz über die statische Methode newInstance. Der Parameter ist der Proxy. Wenn kein Proxy verwendet wird, geben Sie „“ ein. DefaultHttpClient aktiviert Cookies standardmäßig nicht. Um es zu verwenden, fügen Sie bei jeder Ausführung einen HttpContext-Parameter hinzu. Vergessen Sie nicht, nach der Verwendung zu schließen, da Sie sonst keine neue Instanz erstellen können.