Hari ini saya ingin mem-porting applet check-in otomatis menggunakan HttpClient ke Android. Untungnya, Android SDK dilengkapi dengan paket HttpClient. Saat melihat dokumentasi Android, saya menemukan bahwa pejabat tersebut juga menyediakan AndroidHttpClient yang mengimplementasikan antarmuka HttpClient. Saya mencari secara online dan tidak menemukan artikel tentang AndroidHttpClient. Tentu saja, Anda dapat terus menggunakan DefaultHttpClient, tetapi tentu saja lebih baik menggunakan AndroidHttpClient yang disesuaikan untuk Android.
Di bawah ini adalah 2 HttpServlet untuk pengujian :
Copy kode kodenya sebagai berikut:
LogIn kelas publik meluas HttpServlet {
/**
* Memproses permintaan untuk kedua HTTP
* <code>DAPATKAN</code> dan
* Metode <code>POST</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
permintaan proses batal yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
respon.setContentType("teks/html;charset=UTF-8");
permintaan.setCharacterEncoding("utf-8");
PrintWriter keluar = respon.getWriter();
Sesi HttpSession=permintaan.getSession();
String info=permintaan.getParameter("info");
sesi.setAttribute("info",info);
mencoba {
/* TODO menampilkan halaman Anda di sini. Anda dapat menggunakan kode contoh berikut.
keluar.println("OK");
} Akhirnya {
keluar.tutup();
}
}
// <editor-fold defaultstate="collapsed" desc="Metode HttpServlet. Klik tanda + di sebelah kiri untuk mengedit kode.">
/**
* Menangani HTTP
* Metode <code>DAPATKAN</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
@Mengesampingkan
void doGet yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
processRequest(permintaan, tanggapan);
}
/**
* Menangani HTTP
* Metode <code>POST</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
@Mengesampingkan
void doPost yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
processRequest(permintaan, tanggapan);
}
/**
* Mengembalikan deskripsi singkat tentang servlet.
*
* @return sebuah String yang berisi deskripsi servlet
*/
@Mengesampingkan
String publik getServletInfo() {
kembalikan "Deskripsi singkat";
}// </editor-lipat>
}
Copy kode kodenya sebagai berikut:
Info kelas publik meluas HttpServlet {
/**
* Memproses permintaan untuk kedua HTTP
* <code>DAPATKAN</code> dan
* Metode <code>POST</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
permintaan proses batal yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
respon.setContentType("teks/html;charset=UTF-8");
PrintWriter keluar = respon.getWriter();
Sesi HttpSession=permintaan.getSession();
String info=(String)sesi.getAttribute("info");
mencoba {
/* TODO menampilkan halaman Anda di sini. Anda dapat menggunakan kode contoh berikut.
jika(info==batal)
keluar.print("null");
kalau tidak
keluar.cetak(info);
} Akhirnya {
keluar.tutup();
}
}
// <editor-fold defaultstate="collapsed" desc="Metode HttpServlet. Klik tanda + di sebelah kiri untuk mengedit kode.">
/**
* Menangani HTTP
* Metode <code>DAPATKAN</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
@Mengesampingkan
void doGet yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
processRequest(permintaan, tanggapan);
}
/**
* Menangani HTTP
* Metode <code>POST</code>.
*
* @param meminta permintaan servlet
* @param respons respons servlet
* @throws ServletException jika terjadi kesalahan khusus servlet
* @throws IOException jika terjadi kesalahan I/O
*/
@Mengesampingkan
void doPost yang dilindungi (permintaan HttpServletRequest, respons HttpServletResponse)
melempar ServletException, IOException {
processRequest(permintaan, tanggapan);
}
/**
* Mengembalikan deskripsi singkat tentang servlet.
*
* @return sebuah String yang berisi deskripsi servlet
*/
@Mengesampingkan
String publik getServletInfo() {
kembalikan "Deskripsi singkat";
}// </editor-lipat>
}
Kode utamanya ada di processRequest, tidak perlu melihat yang lain.
Saat mengakses LogIn, berikan nilai bernama info. Saat ini, browser akan mendapatkan cookie yang digunakan untuk menemukan sesi server. Kemudian kunjungi Info. Jika ada cookie, server dapat menemukan nilai yang baru saja Anda berikan dan mengembalikannya kepada Anda.
Kode sisi Android:
Copy kode kodenya sebagai berikut:
kelas publik MainActivity memperluas Aktivitas {
pribadi AndroidHttpClient mHttpclient=AndroidHttpClient.newInstance("");
@Mengesampingkan
public void onCreate(Paket yang disimpanInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(OnClickListener baru() {
@Mengesampingkan
public void onClick(Lihat v) {
// TODO Stub metode yang dibuat secara otomatis
Utas baru(rTest).start();
}
});
}
String pribadi toString(InputStream adalah) melempar IOException{
String ret="";
InputStreamReader isr=InputStreamReader baru(adalah);
BufferedReader br=BufferedReader baru(isr);
String tmp=br.readLine();
sementara(tmp!=batal){
ret+=tmp;
tmp=br.readLine();
}
br.close();
kembali mundur;
}
pribadi Runnable rTest=Runnable baru() {
@Mengesampingkan
menjalankan kekosongan publik() {
// TODO Stub metode yang dibuat secara otomatis
mencoba {
Konteks BasicHttpContext=BasicHttpContext baru();
konteks.setAttribute(ClientContext.COOKIE_STORE,BasicCookieStore());
HttpPost httppost = new HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
Daftar <NameValuePair> nvps = Daftar Array baru <NameValuePair>();
nvps.add(BasisNameValuePair baru("info", "Halo dunia!!"));
httppost.setEntity(UrlEncodedFormEntity baru(nvps,"utf-8"));
Respon HttpResponse=mHttpclient.execute(httppost,konteks);
Entitas HttpEntity = respon.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
entitas.consumeContent();
HttpGet httpget2 = HttpGet baru("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse respon2=mHttpclient.execute(httpget2,konteks);
HttpEntity entitas2 = respon2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
entitas2.consumeContent();
} tangkapan (IOException e) {
// TODO Blok tangkapan yang dibuat secara otomatis
e.printStackTrace();
}
}
};
}
Perbedaan antara AndroidHttpClient dan DefaultHttpClient :
AndroidHttpClient tidak dapat dijalankan di thread utama dan akan memunculkan pengecualian. AndroidHttpClient memperoleh instance melalui metode statis newInstance. Parameternya adalah proxy. Jika tidak ada proxy yang digunakan, isikan "". DefaultHttpClient mengaktifkan cookie secara default. AndroidHttpClient tidak mengaktifkan cookie secara default. Untuk menggunakannya, tambahkan parameter HttpContext dan tambahkan CookieStore setiap kali Anda menjalankannya. Jangan lupa untuk menutupnya setelah digunakan, jika tidak, Anda tidak akan dapat membuat instance baru.