Phát triển một client Apache HttpClient trên Android dùng cho JAX-RS Web service

Học cách tạo ra một client Apache HttpClient trên Android

Tạo Web service JAX-RS sử dụng thư viện Apache HttpClient. Jersey, một công cụ tham khảo dùng cho JAX-RS giúp đơn giản hóa việc phát triển các web service RESTful trong môi trường Java™. Android là một nền tảng di động phổ biến, bài này sẽ giới thiệu cho bạn cách tạo ra một trình client JAX-RS dùng cho Android. Bạn sẽ tạo ra một trình client sử dụng thư viện Apache HttpClient cho một web service JAX-RS.

Deepak Vohra, Nhà tư vấn, Independent

Deepak Vohra là một nhà lập trình Java và phát triển các thành phần Web có chứng chỉ của Sun. Deepak đã công bố bài báo khoa học trong Tạp chí của nhà phát triển Java và Tạp chí XML.



06 03 2013

Giới thiệu

Khám phá Spring Android

Một lựa chọn khác là sử dụng Spring Android. Bạn có thể tìm học cách truy cập vào một web service RESTful bằng trình client Spring Android REST , hãy xem bài viết sau của tác giả Deepak:

Phát triển một trình client Spring trên Android cho một web service JAX-RS

Kiến trúc phần mềm REST dựa trên việc truyển tải các đặc trưng của tài nguyên. Các web service RESTful đưa ra một số ưu điểm: Chúng đơn giản, nhẹ và nhanh. Một web service RESTful hiển thị một tập hợp các tài nguyên được nhận biết qua các URI. Các tài nguyên đáp ứng với các phương thức HTTP GET, POST, PUT và DELETE. Các tài nguyên có thể được truy cập theo các định dạng khác nhau, chẳng hạn như HTML, văn bản thuần, XML, PDF, JPEG hay JSON. API Java dùng cho các web service RESTful (JAX-RS - Java API for RESTful web services) được định nghĩa theo chuẩn JSR 311. Jersey là công cụ tham khảo cho JAX-RS để đơn giản hóa việc phát triển các web service RESTful bằng Java. (RESTful web services: là một phương pháp mới để tạo các web service đơn giản hơn so với các phương pháp tạo web service truyền thống).

Trong bài này, hãy sử dụng thư viện Apache HttpClient để tạo ra một trình client JAX-RS trên Android—nền tảng điện thoại di động thông minh phổ biến hiện nay. Bạn có thể tải về các mã ví dụ mẫu được sử dụng trong bài này.


Thiết lập môi trường

Các từ viết tắt thông dụng

  • API: Application programming interface (Giao diện lập trình ứng dụng)
  • HTML: HyperText Markup Language (Ngôn ngữ đánh dấu siêu văn bản)
  • HTTP: HyperText Transfer Protocol (Giao thức truyền siêu văn bản)
  • IDE: Integrated Development Environment (Môi trường phát triển tích hợp)
  • JSON: JavaScript Object Notation (Ký pháp đối tượng JavaScript)
  • MIME: Multipurpose Internet Mail Extensions (Các phần mở rộng thư điện tử đa năng)
  • POJO: Plain Old Java Object (Đối tượng Java cũ đơn giản)
  • REST: Representational State Transfer (Chuyển tải trạng thái đại diện)
  • SDK: Software Development Kit (Bộ công cụ phát triển phần mềm)
  • UI: User Interface (Giao diện người dùng)
  • URI: Uniform Resource Identifier (Mã định danh tài nguyên thống nhất)
  • URL: Uniform Resource Locator (Mã định vị tài nguyên thống nhất)
  • XML: Extensible Markup Language (Ngôn ngữ đánh dấu mở rộng)

Trước khi tạo một trình client cho một web service JAX-RS, bạn cần phải thiết lập môi trường phát triển. Xem phần Tài nguyên để biết các liên kết.

  1. Cài đặt Eclipse.
  2. Cài đặt thêm plug-in Android Development Tools (ADT) cho Eclipse, để cung cấp các phần mở rộng để phát triển các ứng dụng Android trong Eclipse.
  3. Cài đặt Platform SDK cho Android 2.2. SDK của Android cung cấp các công cụ để phát triển các ứng dụng Android.
  4. Tạo một Android Virtual Device (AVD - Máy ảo Android), là một bộ mô phỏng các thiết bị thật chạy Android, trong Eclipse.
  5. Tải về tệp lưu trữ Jersey, jersey-archive-1.4.zip, có chứa các tệp nén Java (JAR) của Jersey và các phụ thuộc cơ bản. Tải tệp JAR bó của Jersey là jersey-bundle-1.4.jar.

    Jersey được xây dựng bằng cách sử dụng JDK 6.0, vì thế bạn cũng cần cài đặt JDK 6.0.

  6. Cài đặt một máy chủ web như Tomcat hay một máy chủ ứng dụng như máy chủ WebSphere® hoặc máy chủ WebLogic. Thêm các tệp JAR Jersey trong Liệt kê 1 vào CLASSPATH của môi trường thời gian chạy trong máy chủ ứng dụng/máy chủ web.
    Liệt kê 1. Các tệp JAR Jersey
    C:\Jersey\jersey-bundle-1.4.jar;C:\Jersey\jersey-archive-1.4\lib\asm-3.1.jar;
    C:\Jersey\jersey-archive-1.4\lib\jsr311-api-1.1.1.jar

Tạo một dự án Eclipse

Trong phần này, bạn sẽ tạo một dự án web và thêm khía cạnh JAX-RS vào dự án đó. Sử dụng các bước sau để tạo ra một dự án Eclipse.

  1. Chọn File > New và trong cửa sổ New, chọn Web > Dynamic Web Project. Nhấn Next.
  2. Đặt tên cho Project (chẳng hạn là AndroidJAX-RS) và nhấn New Runtime, để cấu hình một môi trường runtime đích mới cho máy chủ WebSphere, máy chủ Tomcat hoặc máy chủ WebLogic. Hình 1 hiển thị cửa sổ dự án Web động hoàn chỉnh.
    Hình 1. Cấu hình một môi trường runtime mới
    Ảnh chụp màn hình về cách cấu hình và tạo một dự án môi trường thời gian chạy mới
  3. Trong cửa sổ New Server Runtime Environment, chọn một máy chủ, chẳng hạn như máy chủ Tomcat, máy chủ WebSphere hoặc máy chủ WebLogic. Nhấn Next, như trong Hình 2.
    Hình 2. Chọn một máy chủ ứng dụng hoặc máy chủ web
    Ảnh chụp màn hình về chọn một máy chủ ứng dụng hay máy chủ web
  4. Trong cửa sổ New IBM WebSphere v6.0 Runtime, cấu hình một JRE và IBM WebSphere Installation Directory. Nhấn Next trong hộp thoại Dynamic Web Project. Chọn các giá trị thiết lập Java mặc định cho thư mục Source và thư mục Output và nhấn Next.
  5. Chỉ rõ gốc Bối cảnh là AndroidJAX-RS, chọn Content Directory mặc định và nhấn Finish.

    Một Dự án Web động được tạo ra và được thêm vào Project Explorer. Nhấn chuột phải vào nút project và chọn Properties.

  6. Chọn Project Facets, rồi chọn project facet là JAX-RS (REST Web Services) 1.1. Nhấn vào Further configuration required, như trong Hình 3.
    Hình 3. Cấu hình Project Facet JAX-RS
    Ảnh chụp màn hình về cấu hình một khía cạnh JAX-RS
  7. Trong cửa sổ JAX-RS Capabilities, quy định một tên Servlet (JAX-RS Servlet) và cấu hình một thư viện JAX-RS Implementation. Chọn Type as User Library và nhấn Manage.
  8. Trong cửa sổ User Libraries, nhấn New. Trong hộp thoại New User Library, chỉ rõ một tên User library và nhấn OK.

    Một thư viện người dùng được thêm vào. Nhấn Add JARs để thêm các tệp JAR Jersey vào thư viện của người dùng. Như trong Hình 4, hãy thêm các tệp JAR Jersey sau đây:

    • jersey-bundle-1.4.jar
    • C:\Jersey\jersey-archive-1.4\lib\asm-3.1.jar
    • C:\Jersey\jersey-archive-1.4\lib\jsr311-api-1.1.1.jar
    Nhấn OK.
    Hình 4. Thêm các tệp JAR Jersey
    Ảnh chụp màn hình về thêm các tệp Jersey JAR vào đường dẫn xây dụng
  9. Trong cửa sổ JAX-RS Capabilities, chỉ rõ tên lớp servlet JAX-RS là com.sun.jersey.spi.container.servlet.ServletContainer, như trong Hình 5. Nhấn OK.
    Hình 5. Chỉ rõ lớp servlet JAX-RS
    Ảnh chụp màn hình về chỉ rõ tên lớp máy chủ JAX-RS
  10. Trong cửa sổ Project Facets, nhấn Apply như trong Hình 6, rồi nhấn OK.
    Hình 6. Đồng ý các thiết lập JAX-RS Project Facet
    Ảnh chụp màn hình về áp dụng Khía cạnh JAX-RS

Môi trường runtime đích được cấu hình với khía cạnh của dự án JAX-RS. Nhấn OK trong hộp thoại Properties.

Các thư viện Người dùng JAX-RS được bổ sung vào dự án và ánh xạ servlet JAX-RS và ánh xạ servlet được cấu hình trong tệp web.xml. Bạn cần phải thêm các phần tử init-param cho các tham số init (khởi tạo) com.sun.jersey.config.property.resourceConfigClasscom.sun.jersey.config.property.packages. Liệt kê 2 hiển thị tệp web.xml.

Liệt kê 2. Tệp web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/
xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>jaxrs</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

Tạo và chạy một lớp tài nguyên

Bước tiếp theo là tạo một tài nguyên web service RESTful bằng cách sử dụng một lớp tài nguyên gốc. Một lớp tài nguyên gốc là một POJO có chú giải với dấu chú giải @PATH. Nó bao gồm ít nhất là một phương thức có chú giải với dấu chú giải @PATH hoặc @GET, @PUT, @POST hoặc @DELETE.

  1. Chọn File > New > Other. Trong hộp thoại New, chọn Java > Class và nhấn Finish.
  2. Trong cửa sổ New Java Class, như trong Hình 7, chỉ rõ:
    • Thư mục Source: AndroidJAX-RS/src
    • Gói: jaxrs
    • Tên lớp: HelloWorldResource

    Nhấn Finish.

    Hình 7. Tạo lớp tài nguyên
    Ảnh chụp màn hình về tạo một lớp Resource

Hãy chú giải lớp Java bằng dấu chú giải @PATH. Mã trong Liệt kê 3 chỉ rõ đường dẫn URI trên đó lớp Java được lưu trữ trên máy chủ là /helloworld.

Liệt kê 3. Chú giải lớp tài nguyên bằng @Path
@Path("/helloworld")
public class HelloWorldResource {
...
}

Để thêm các phương thức tài nguyên để sản xuất ba kiểu MIME khác nhau, hãy thêm các phương thức getClichedMessage(), getXMLMessage()getHTMLMessage(). Hãy chú giải mỗi phương thức trên bằng @GET, để cho biết rằng các phương thức này sẽ xử lý các yêu cầu HTTP GET. Hãy chỉ rõ String làm kiểu trả về cho mỗi một trong các phương thức. Hãy chú giải mỗi phương thức bằng @PRODUCES và chỉ rõ một kiểu MIME khác nhau cho mỗi phương thức.

Bây giờ bạn muốn cung cấp phương thức "Hello JAX-RS" bằng cách sử dụng các kiểu MIME là text/plain, text/xmltext/html. Phương thức getXMLMessage được chú giải bằng @Produces ("text/xml") tạo ra một thông báo XML. Chỉ gỡ bỏ dấu chú thích cho một trong các phương thức đã chú giải bằng @GET. Nếu không chỉ rõ thành phần đường dẫn nào khác để phân biệt, thì yêu cầu @GET được chuyển đến phương thức có chú giải bằng @GET. Nếu có nhiều phương thức cùng khớp được với một URI yêu cầu, thì sử dụng thuật toán lựa chọn JAX-RS để chọn phương thức tài nguyên. Ví dụ, bạn có thể quy định nhiều phương thức có dấu chú giải @GET bằng cách sử dụng một id path (đường dẫn) khác nhau cho các phương thức có chú giải @GET. Liệt kê 4 cho thấy lớp tài nguyên gốc.

Liệt kê 4. Lớp tài nguyên gốc HelloWorldResource.java
package jaxrs;

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
import javax.ws.rs.core.MediaType;

// The Java class will be hosted at the URI path //"/helloworld"
@Path("/helloworld")
public class HelloWorldResource {

    // The Java method will process HTTP GET requests
     @GET
    // The Java method will produce content identified by the MIME Media
    // type "text/plain"
     @Produces("text/plain")
     public String getClichedMessage() {
    // Return some cliched textual content
     return "Hello Android";
     }

    // @GET
    // @Produces("text/xml")
    // public String getXMLMessage() {
    // return "<?xml version=\"1.0\"?>" + "<hello> Hello Android" + "</hello>";
    // }

//	@GET
    //@Produces("text/html")
    //public String getHTMLMessage() {
        //return "<html> " + "<title>" + "Hello Android" + "</title>"
            //	+ "<body><h1>" + "Hello Android" + "</body></h1>" + 
    "</html> ";
//	}

}

Chạy lớp tài nguyên để tạo ra các kiểu đầu ra khác nhau. Đánh dấu chú thích các phương thức không cần thử nghiệm và giữ lại một phương thức đã bỏ dấu chú thích cho mỗi lần chạy thử nghiệm. Đầu tiên, hãy kiểm tra kiểu MIME text/xml là kết quả đầu ra. Hãy khởi động máy chủ ứng dụng/máy chủ web nếu nó chưa được khởi động. Nhấn chuột phải vào lớp tài nguyên và chọn Run As > Run on Server (Chạy trên máy chủ), như trong Hình 8.

Hình 8. Chạy lớp tài nguyên
Ảnh chụp màn hình về một trình đơn bật lên cho ứng dụng JAX-RS với việc chọn Run As>Run on Server

Trên máy chủ, tham số init com.sun.jersey.config.property.resourceConfigClass được khởi tạo bằng com.sun.jersey.api.core.PackagesResourceConfig và tham số init com.sun.jersey.config.property.packages được khởi tạo bằng jaxrs, như đã quy định trong tệp web.xml. Lớp tài nguyên gốc jaxrs.HelloWorldResource được tìm thấy. Phiên bản 1.4 của ứng dụng Jersey được khởi tạo và mô đun AndroidJAX-RS triển khai trên máy chủ.


Tạo một dự án trình máy khách Android

Trong phần này, bạn sẽ tạo một dự án Android để tạo ra trình máy khách JAX-RS cho Android trong dự án đó.

  1. Trong IDE Eclipse, chọn File > New. Trong hộp thoại New, chọn Android > Android Project, rồi nhấn Next.
  2. Điền vào các trường trong cửa sổ New Project Android, như trong Hình 9.
    • Tên dự án: AndroidJAXRSClient
    • Build đích: Android Platform 2.2 API 8
    • Các thuộc tính: Tên ứng dụng là AndroidJAXRSClient và tên gói là androidjaxrs
    • Chọn Create Activity (Tạo hoạt động) và chỉ rõ lớp Activity là AndroidJAXRSClient.

      Một hoạt động đại diện cho một sự tương tác của người dùng và lớp mở rộng lớp Activity tạo ra một cửa sổ cho một giao diện người dùng (UI).

    • Phiên bản SDK tối thiểu: 8
    • Nhấn Next
    Hình 9. Tạo lớp trình máy khách JAX-RS
    Ảnh chụp màn hình về tạo một Dự án Android mới với trình hướng dẫn New Android Project

Các tệp trong dự án Android là:

  • Một lớp hoạt động (AndroidJAXRSClient), để mở rộng lớp Activity.
  • Tệp res/layout/main.xml để quy định cách bố trí của ứng dụng Android.
  • Tệp AndroidManifest.xml, để chứa thông tin cấu hình của ứng dụng như là tên gói, các thành phần ứng dụng, các quy trình, các quyền hạn và mức API tối thiểu cho hệ thống Android.

Trong tệp res/layout/main.xml file, hãy quy định cách bố trí của các thành phần giao diện người dùng Android. Hãy tạo một LinearLayout với android:orientation="vertical". Bạn sẽ tạo ra một giao diện người dùng để hiển thị các đáp ứng từ các web service dưới dạng một thông báo văn bản trong đó. Thêm một phần tử TextView có id là jaxrs để hiển thị đáp ứng web service JAX-WS cho một cuộc gọi phương thức đến một trong những phương thức get. Việc thực hiện phương thức sẽ lấy một thông báo Hello làm một phản hồi dưới dạng hoặc XML, HTML hoặc văn bản. Liệt kê 5 hiển thị tệp main.xml:

Liệt kê 5. Tệp main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical" android:layout_width="fill_parent"
     android:layout_height="fill_parent">
     <TextView android:id="@+id/jaxrs"
     android:layout_width="fill_parent" android:layout_height="wrap_content"
                />
</LinearLayout>

Để truy cập web service JAX-RS từ một thiết bị Android, hãy bật quyền hạn android.permission.INTERNET trong tệp AndroidManifest.xml lên, để cho phép các ứng dụng mở các socket mạng. Thêm phần tử uses-permission vào Liệt kê 6.

Liệt kê 6. Thiết lập quyền hạn INTERNET
<uses-permission  android:name="android.permission.INTERNET"></uses-permission>

Chỉ rõ phiên bản Android tối thiểu với phần tử uses-sdk. Hoạt động AndroidJAXRSClient, là intent-filteraction được quy định cụ thể với phần tử activity và các phần tử con. Liệt kê 7 hiển thị tệp AndroidManifest.xml.

Liệt kê 7. Tệp AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="android.jaxrs" android:versionCode="1" android:versionName="1.0">
     <uses-sdk android:minSdkVersion="8" />
     <application android:icon="@drawable/icon" android:label="@string/app_name">
       <activity android:name=".AndroidJAXRSClient" android:label="@string/app_name">
               <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
       </activity>
     </application>
     <uses-sdk android:minSdkVersion="8" />
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Android SDK gồm có thư viện Apache HttpClient. Hãy nhập khẩu các lớp trong Liệt kê 8 vào AndroidJAXRSClient.

Liệt kê 8. Thư viện Apache HttpClient
org.apache.http.HttpEntity;
org.apache.http.HttpResponse;
org.apache.http.client.ClientProtocolException;
org.apache.http.client.HttpClient;
org.apache.http.client.methods.HttpGet;
org.apache.http.impl.client.DefaultHttpClient;

Lớp AndroidJAXRSClient mở rộng lớp Activity. Phương thức onCreate(Bundle savedInstanceState) được gọi khi hoạt động này lần đầu tiên được gọi. Định nghĩa giao diện người dùng bằng cách sử dụng phương thức setContentView và tài nguyên bố cục, như trong Liệt kê 9.

Liệt kê 9. Định nghĩa giao diện người dùng
setContentView(R.layout.main);

Liệt kê 10 cho thấy cách tạo ra một đối tượng TextView của tiện ích (widget) Android, bằng cách sử dụng phương thức findViewById trên phần tử TextView có id là jaxrs đã được định nghĩa trong tệp main.xml.

Liệt kê 10. Tạo một widget Android
TextView jaxrs = (TextView) findViewById(R.id.jaxrs);

Cách thực hiện mặc định của HttpClientDefaultHttpClient. Hãy tạo một đối tượng DefaultHttpClient, như Liệt kê 11.

Liệt kê 11. Tạo một đối tượng HttpClient
HttpClient httpclient = new DefaultHttpClient();

Tạo một đối tượng HttpGet để lấy ra thông tin từ máy chủ, như trong Liệt kê 12. Hãy chỉ rõ URL đến tài nguyên đã lưu trữ trên máy chủ theo đường dẫn URI /helloworld. Hãy chỉ rõ địa chỉ IP cho máy chủ vật lý thay vì localhost. Trình máy khách chạy trên thiết bị Android và localhost cho thiết bị Android không phải là máy chủ vật lý để web service JAX-RS chạy trên đó (trừ khi các web service JAX-RS cũng được lưu trữ trên thiết bị Android, điều này không đúng trong ví dụ này).

Liệt kê 12. Tạo một đối tượng HttpGet
HttpGet request = new HttpGet("http://192.168.1.68:7001/AndroidJAX-RS/jaxrs/helloworld");

Hãy chỉ rõ các kiểu phương tiện truyền thông có thể chấp nhận được bằng cách sử dụng header Accept. Trong header Accept này, chỉ thiết lập một trong các kiểu phương tiện truyền thông, tương ứng với kiểu phương tiện truyền thông được tạo ra trong web service JAX-RS. Trong lần chạy đầu tiên, hãy thiết lập header Accepttext/xml để cung cấp đáp ứng text/xml, như trong Liệt kê 13.

Liệt kê 13. Thiết lập header Accept
request.addHeader("Accept", "text/xml");
//request.addHeader("Accept", "text/html");
//request.addHeader("Accept", "text/plain");

Hãy kiểm tra kết quả đầu ra của mỗi kiểu đáp ứng (văn bản thuần, html và XML). Kiểu đáp ứng được chấp nhận phải khớp với kiểu MIME được tạo ra trong lớp tài nguyên. Kiểu MIME được các lớp tài nguyên tạo ra phải khớp với một kiểu MIME được chấp nhận. Nếu kiểu MIME được tạo ra và kiểu MIME được chấp nhận không khớp nhau, thì sẽ tạo ra một lỗi ngoại lệ com.sun.jersey.api.client.UniformInterfaceException. Ví dụ, thiết lập kiểu MIME được chấp nhận là text/xml còn kiểu MIME được tạo ra là application/xml. Lỗi ngoại lệ UniformInterfaceException được tạo ra. Như trong Liệt kê 14, hãy gọi phương thức execute() của HttpClient, có phương thức HttpGet làm một đối số, để lấy ra đối tượng HttpResponse.

Liệt kê 14. Lấy đối tượng HttpResponse
HttpResponse response = httpclient.execute(request);

Từ đối tượng HttpResponse sẽ thu được HttpEntity bằng cách sử dụng phương thức getEntity (Liệt kê 15).

Liệt kê 15. Lấy HttpEntity
HttpEntity entity = response.getEntity();

Lấy nội dung là một InputStream từ HttpGet bằng cách sử dụng phương thức getContent() (Liệt kê 16).

Liệt kê 16. Tạo một InputStream từ HttpEntity
InputStream instream = entity.getContent();

Tạo một StringBuilder cho thông báo được web service JAX-RS trả về (Liệt kê 17).

Liệt kê 17. Tạo một StringBuilder
StringBuilder sb =  new StringBuilder();

Tạo một BufferedReader từ InputStream (Liệt kê 18).

Liệt kê 18. Tạo một BufferedReader
BufferedReader r = new BufferedReader(new InputStreamReader(instream));

Đọc từng dòng từ BufferedReader và thêm nó vào StringBuilder (Liệt kê 19).

Liệt kê 19. Đọc BufferedReader
for (String line = r.readLine(); line != null; line = r.readLine()) {
             sb.append(line);	
}

Nhận thông báo String từ StringBuilder và đóng InputStream (Liệt kê 20).

Liệt kê 20. Nhận thông báo StringBuilder
String jaxrsmessage = sb.toString();		
instream.close();

Thiết lập thông báo String trên thành phần giao diện người dùng TextView (Liệt kê 21).

Liệt kê 21. Thiết lập thông báo StringBuilder
jaxrs.setText(jaxrsmessage);

Liệt kê 22 cho thấy lớp AndroidJAXRSClient.

Liệt kê 22. AndroidJAXRSClient.java
package android.jaxrs;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

public class AndroidJAXRSClient extends Activity {
     /** Called when the activity is first created. */
     @Override
     public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);

          TextView jaxrs = (TextView) findViewById(R.id.jaxrs);
          try {
               HttpClient httpclient = new DefaultHttpClient();
               HttpGet request = new HttpGet(
                  "http://192.168.1.68:7001/AndroidJAX-RS/jaxrs/helloworld");

               //request.addHeader("Accept", "text/html");
          //	request.addHeader("Accept", "text/xml");
               request.addHeader("Accept", "text/plain");
               HttpResponse response = httpclient.execute(request);
               HttpEntity entity = response.getEntity();
               InputStream instream = entity.getContent();
               String jaxrsmessage = read(instream);
               jaxrs.setText(jaxrsmessage);
          } catch (ClientProtocolException e) {
               e.printStackTrace();
          } catch (IOException e) {
               e.printStackTrace();
          }

     }

     private static String read(InputStream instream) {
          StringBuilder sb = null;
          try {
               sb = new StringBuilder();
               BufferedReader r = new BufferedReader(new InputStreamReader(
                         instream));
          for (String line = r.readLine(); line != null; line = r.readLine()) {
               	sb.append(line);
			}

			instream.close();

          } catch (IOException e) {
          }
          return sb.toString();

     }

}

Hình 10 hiển thị cấu trúc thư mục của trình máy khách Android.

Hình 10. Cấu trúc thư mục của ứng dụng Android
Ảnh chụp màn hình về cấu trúc thư mục của ứng dụng Trình máy khách Android

Nhấp vào để xem ảnh lớn

Hình 10. Cấu trúc thư mục của ứng dụng Android

Ảnh chụp màn hình về cấu trúc thư mục của ứng dụng Trình máy khách Android

Chạy trình máy khách Android

Bây giờ bạn đã sẵn sàng để chạy trình máy khách Android để gọi web service JAX-RS và cung cấp thông báo XML. Nhấn phím chuột phải vào dự án AndroidJAXRSClient và chọn Run As > Android Application, như trong Hình 11.

Hình 11. Chạy trình máy khách JAX-RS Android
Ảnh chụp màn hình về Nhấn phím chuột phải lên Android Application và chọn Run As>Android Application

Thiết bị ảo (AVD) Android khởi động và trình máy khách JAX-RS sẽ được cài đặt trên thiết bị Android, như trong Hình 12.

Hình 12. Trình máy khách JAX-RS của Android đã cài đặt trên thiết bị Android
Ảnh chụp màn hình về cài đặt Android JAX-WS Client trên Android

Hoạt động AndroidJAXRSClient khởi động và cung cấp thông báo XML do tài nguyên web service JAX-RS tạo ra cho thiết bị Android, như trong Hình 13.

Hình 13. Cung cấp thông báo XML cho thiết bị Android
Ảnh chụp màn hình về cung cấp một thông báo XML tới một thiết bị Android

Tương tự như vậy, thông báo HTML là kết quả đầu ra nếu gỡ bỏ dấu chú thích trong lớp tài nguyên cho phương thức tạo ra kiểu phương tiện truyền thông text/html và thiết lập đầu trang Accept để nhận được kiểu phương tiện truyền thông tương tự. Ví dụ, trong lớp tài nguyên, hãy gỡ bỏ dấu ghi chú cho phương thức trong Liệt kê 23.

Liệt kê 23. Tạo ra HTML trong lớp tài nguyên
@GET
@Produces("text/html")
public String getHTMLMessage() {
          return "<html> " + "<title>" + "Hello Android" + "</title>"
     + "<body><h1>" + "Hello Android" + "</body></h1>" + "</html> ";
     }

Trong lớp của trình máy khách, hãy gỡ bỏ dấu chú thích trước việc thực hiện addHeader trong Liệt kê 24.

Liệt kê 24. Thiết lập kiểu phương tiện truyền thông cho
request.addHeader("Accept", "text/html");

Chạy lại ứng dụng AndroidJAXRSClient để nhận được phản hồi HTML, như trong Hình 14.

Hình 14. Kết quả HTML cho thiết bị Android
Ảnh chụp màn hình về cung cấp một Thông báo HTML tới một thiết bị Android

Để nhận được phản hồi dạng văn bản, hãy gỡ bỏ dấu chú thích trước phương thức trong lớp tài nguyên trong Liệt kê 25.

Liệt kê 25. Tạo ra kiểu phương tiện truyền thông văn bản trong lớp tài nguyên
@GET
@Produces("text/plain")
public String getClichedMessage() {
return "Hello Android";
 }

Trong lớp của trình máy khách, hãy bỏ dấu chú thích thiết lập kiểu phương tiện truyền thông của header Accept sau đây trong Liệt kê 26.

Liệt kê 26. Thiết lập header Accept
request.addHeader("Accept", "text/plain");

Chạy lại ứng dụng AndroidJAXRSClient để nhận được kết quả thông báo dạng văn bản, như trong Hình 15.

Hình 15. Cung cấp thông báo dạng văn bản cho thiết bị Android
Ảnh chụp màn hình về cung cấp một thông báo văn bản tới một thiết bị Android

Tóm tắt

Trong bài này, bạn đã học cách tạo ra một web service JAX-RS và gọi web service từ một trình máy khách Android. Bạn đã gửi kết quả XML, HTML và văn bản tới thiết bị Android.


Tải về

Mô tảTênKích thước
Sample code scripts from the articleandroid-jaxrs-sourcecode.zip852KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=SOA và dịch vụ Web
ArticleID=860580
ArticleTitle=Phát triển một client Apache HttpClient trên Android dùng cho JAX-RS Web service
publish-date=03062013