วันนี้ฉันต้องการย้ายแอปเพล็ตเช็คอินอัตโนมัติโดยใช้ HttpClient ไปยัง Android โชคดีที่ Android SDK มาพร้อมกับแพ็คเกจ HttpClient เมื่อดูเอกสารของ Android ฉันพบว่าทางการยังมี AndroidHttpClient ที่ใช้อินเทอร์เฟซ HttpClient ฉันค้นหาทางออนไลน์และไม่พบบทความเกี่ยวกับ AndroidHttpClient แน่นอน คุณสามารถใช้ DefaultHttpClient ต่อไปได้ แต่โดยธรรมชาติแล้วจะดีกว่าถ้าใช้ AndroidHttpClient ที่ปรับแต่งสำหรับ Android
ด้านล่างนี้คือ 2 HttpServlets สำหรับการทดสอบ :
คัดลอกรหัสรหัส ดังต่อไปนี้:
LogIn ระดับสาธารณะขยาย HttpServlet {
-
* ประมวลผลคำขอสำหรับทั้ง HTTP
* <รหัส>รับ</รหัส> และ
* วิธีการ <code>POST</code>
-
* @param ร้องขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
คำขอกระบวนการโมฆะที่ได้รับการป้องกัน (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("utf-8");
PrintWriter ออก = response.getWriter();
เซสชัน HttpSession=request.getSession();
ข้อมูลสตริง=request.getParameter("ข้อมูล");
session.setAttribute("ข้อมูล", ข้อมูล);
พยายาม {
/* TODO ส่งออกหน้าของคุณที่นี่ คุณสามารถใช้โค้ดตัวอย่างต่อไปนี้ได้ */
out.println("ตกลง");
} ในที่สุด {
ออก.ปิด();
-
-
// <editor-fold defaultstate="collapsed" desc="วิธี HttpServlet. คลิกที่เครื่องหมาย + ทางด้านซ้ายเพื่อแก้ไขโค้ด">
-
* จัดการ HTTP
* วิธีการ <code>GET</code>
-
* @param ร้องขอคำขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
@แทนที่
โมฆะที่ได้รับการป้องกัน doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
processRequest (คำขอ, การตอบสนอง);
-
-
* จัดการ HTTP
* วิธีการ <code>POST</code>
-
* @param ร้องขอคำขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
@แทนที่
doPost เป็นโมฆะที่ได้รับการป้องกัน (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
processRequest (คำขอ, การตอบสนอง);
-
-
* ส่งกลับคำอธิบายสั้น ๆ ของเซิร์ฟเล็ต
-
* @return สตริงที่มีคำอธิบายเซิร์ฟเล็ต
-
@แทนที่
สตริงสาธารณะ getServletInfo() {
กลับ "คำอธิบายสั้น ๆ";
}// </editor-fold>
-
คัดลอกรหัสรหัส ดังต่อไปนี้:
ข้อมูลคลาสสาธารณะขยาย HttpServlet {
-
* ประมวลผลคำขอสำหรับทั้ง HTTP
* <รหัส>รับ</รหัส> และ
* วิธีการ <code>POST</code>
-
* @param ร้องขอคำขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
คำขอกระบวนการโมฆะที่ได้รับการป้องกัน (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter ออก = response.getWriter();
เซสชัน HttpSession=request.getSession();
ข้อมูลสตริง=(สตริง)session.getAttribute("ข้อมูล");
พยายาม {
/* TODO ส่งออกหน้าของคุณที่นี่ คุณสามารถใช้โค้ดตัวอย่างต่อไปนี้ได้ */
ถ้า(ข้อมูล==null)
out.print("null");
อื่น
out.print(ข้อมูล);
} ในที่สุด {
ออก.ปิด();
-
-
// <editor-fold defaultstate="collapsed" desc="วิธี HttpServlet คลิกที่เครื่องหมาย + ทางด้านซ้ายเพื่อแก้ไขโค้ด">
-
* จัดการ HTTP
* วิธีการ <code>GET</code>
-
* @param ร้องขอคำขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
@แทนที่
โมฆะที่ได้รับการป้องกัน doGet (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
processRequest (คำขอ, การตอบสนอง);
-
-
* จัดการ HTTP
* วิธีการ <code>POST</code>
-
* @param ร้องขอคำขอเซิร์ฟเล็ต
* การตอบสนองของเซิร์ฟเล็ต @param
* @throws ServletException หากเกิดข้อผิดพลาดเฉพาะเซิร์ฟเล็ต
* @throws IOException หากมีข้อผิดพลาด I/O เกิดขึ้น
-
@แทนที่
doPost เป็นโมฆะที่ได้รับการป้องกัน (คำขอ HttpServletRequest, การตอบสนอง HttpServletResponse)
พ่น ServletException, IOException {
processRequest (คำขอ, การตอบสนอง);
-
-
* ส่งกลับคำอธิบายสั้น ๆ ของเซิร์ฟเล็ต
-
* @return สตริงที่มีคำอธิบายเซิร์ฟเล็ต
-
@แทนที่
สตริงสาธารณะ getServletInfo() {
กลับ "คำอธิบายสั้น ๆ";
}// </editor-fold>
-
รหัสหลักอยู่ใน processRequest คุณไม่จำเป็นต้องดูรหัสอื่น
เมื่อเข้าถึง LogIn ให้ส่งค่าชื่อ info ในขณะนี้ เบราว์เซอร์จะได้รับคุกกี้ที่ใช้เพื่อค้นหาเซสชันของเซิร์ฟเวอร์ จากนั้นไปที่ข้อมูล หากมีคุกกี้ เซิร์ฟเวอร์สามารถค้นหาค่าที่คุณเพิ่งส่งผ่านและส่งคืนให้คุณ หากไม่มีคุกกี้ ก็จะไม่พบค่าดังกล่าว
รหัสด้าน Android:
คัดลอกรหัสรหัส ดังต่อไปนี้:
MainActivity ระดับสาธารณะขยายกิจกรรม {
AndroidHttpClient ส่วนตัว mHttpclient=AndroidHttpClient.newInstance("");
@แทนที่
โมฆะสาธารณะ onCreate (บันเดิลที่บันทึกไว้InstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button1).setOnClickListener(ใหม่ OnClickListener() {
@แทนที่
โมฆะสาธารณะ onClick (ดู v) {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
เธรดใหม่ (rTest).start();
-
-
-
สตริงส่วนตัว toString (InputStream คือ) พ่น IOException {
สตริง ret="";
InputStreamReader isr=ใหม่ InputStreamReader(คือ);
BufferedReader br=ใหม่ BufferedReader(isr);
สตริง tmp=br.readLine();
ในขณะที่(tmp!=null){
ret+=tmp;
tmp=br.readLine();
-
br.ปิด();
กลับมาอีกครั้ง;
-
Runnable ส่วนตัว rTest = Runnable ใหม่ () {
@แทนที่
โมฆะสาธารณะวิ่ง () {
// TODO ต้นขั้ววิธีการสร้างอัตโนมัติ
พยายาม {
บริบท BasicHttpContext=ใหม่ BasicHttpContext();
context.setAttribute (ClientContext.COOKIE_STORE, BasicCookieStore ใหม่ ());
HttpPost httppost = ใหม่ HttpPost("http://10.226.233.48:8080/WebApplication1/LogIn");
รายการ <NameValuePair> nvps = ArrayList ใหม่ <NameValuePair>();
nvps.add(BasicNameValuePair ใหม่("ข้อมูล", "สวัสดีชาวโลก!!"));
httppost.setEntity(UrlEncodedFormEntity ใหม่(nvps,"utf-8"));
การตอบสนอง HttpResponse = mHttpclient.execute (httppost, บริบท);
เอนทิตี HttpEntity = response.getEntity();
Log.i("kagami", MainActivity.this.toString(entity.getContent()));
เอนทิตี.consumeContent();
HttpGet httpget2 = HttpGet ใหม่ ("http://10.226.233.48:8080/WebApplication1/Info");
HttpResponse response2=mHttpclient.execute (httpget2, บริบท);
HttpEntity เอนทิตี2 = response2.getEntity();
Log.i("kagami", MainActivity.this.toString(entity2.getContent()));
เอนทิตี2.consumeContent();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
-
ความแตกต่างระหว่าง AndroidHttpClient และ DefaultHttpClient :
AndroidHttpClient ไม่สามารถดำเนินการในเธรดหลักได้ และจะส่งข้อยกเว้น AndroidHttpClient รับอินสแตนซ์ผ่านวิธีการคงที่ newInstance พารามิเตอร์คือพร็อกซี หากไม่มีการใช้พรอกซี ให้กรอก "" DefaultHttpClient เปิดใช้งานคุกกี้ตามค่าเริ่มต้น AndroidHttpClient จะไม่เปิดใช้งานคุกกี้ตามค่าเริ่มต้น หากต้องการใช้งาน ให้เพิ่มพารามิเตอร์ HttpContext และเพิ่ม CookieStore ทุกครั้งที่คุณดำเนินการ อย่าลืมปิดหลังใช้งาน ไม่เช่นนั้นคุณจะไม่สามารถสร้างอินสแตนซ์ใหม่ได้