创建Android客户端
接下来,我们开始创建Android的客户端,通过Apache的HTTP CLIENT访问RESTful服务。步骤如下:
1) 在Eclipse中,选择新建立一个Android Project,方法是在File->New菜单中,选择Android Project,点NEXT进入下一步。
2) 在Android Project的相关设置中,按如下图进行设置:
▲
可以看到,我们选用的是Android 2.2的SDK,应用的名称为AndroidJAXRSClient,创建的Activity名为AndroidJAXRSClient。接下来,首先创建main.xml,代码如下:
<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>
可以看到,在这个布局文件中,只是简单放置了一个textview 文本显示控件,这个控
件是用来显示服务端返回的JAX-RS的RESTful的结果。
为了能获得服务端返回的结果,需要Android使用网络访问权限功能,因此必须在配置文件AndroidManifest.xml中进行设置,添加如下这句话:
并指定应用程序启动的Activity,整个完成的配置文件如下:
<?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>
接下来,我们可以使用Apache HttpClient的开源HTTP访问类库,去访问服务端的JAX-RS服务了。要注意的是,Android的SDK中已经内置了Apache HttpClient的相关类库了,可以直接引入,即:
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;
下面直接给出客户端Android访问服务端JAX-RS服务的代码,再逐一解析:
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();
}
}
在oncreate()方法中,首先通过
HttpClient httpclient = new DefaultHttpClient();
建立了httpclient类的的一个实例,然后创建一个http get的请求,如下:
HttpGet request = new HttpGet("http://192.168.1.68:7001/AndroidJAX-RS/jaxrs/helloworld");
在请求的URL中,指定了服务端JAX-RS的URL,注意一定要加上/helloworld,不要漏掉。然后再指定发送到服务端JAX-RS的HTTP的HEADER的类型,即:
request.addHeader("Accept", "text/xml");
//request.addHeader("Accept", "text/html");
//request.addHeader("Accept", "text/plain");
可以分别指定三种不同的header,然后通过httpclient的execute方法,执行向服务端发送请求,并获得返回的内容的实例response,如下:
HttpResponse response = httpclient.execute(request);
Response是HttpResonse的实例,代表服务端返回的内容,而为了更好地得到返回的内容,调用response.getEntity()得到HttpEntity实例,如下:
HttpEntity entity = response.getEntity();
再通过entity的getContent方法获得返回结果的一个字节输入流,即:
InputStream instream = entity.getContent();
接下来,在read的静态方法中,读入这个instream,注意将其解析构造成一个StringBuffer,最后再转换为字符串,并通过Android的jaxrs.setText(jaxrsmessage)显示出来。
最后,运行Android应用程序,在手机模拟器中可以得到如下结果:
▲
可以看到,Android的客户端通过访问JAX-RS的RESTful web service,得到了返回的XML字符串。同样,如果将以下的代码分别注释,再运行,可以分别看到text/plain,text/html为资源类型返回的不同结果:
request.addHeader("Accept", "text/plain");
request.addHeader("Accept", "text/html");
当然,在服务端的HelloWorldResource中,也要分别将之前注释掉的getHTMLMessage()方法和getClichedMessage()方法启用。它们的运行结果分别如下两图:
小结
本文介绍了如何通过Apache的开源HttpClient去访问一个符合JAX-RS标准的RESTful服务,其中jersey是目前JAX-RS RESTful标准的一个不错的开源实现。而由于RESTful的简单,开发快捷,运行速度快,因此很适合象Android等移动设备进行访问,给用户会有很好的运行体验。读者可以通过本文的例子,加以扩展,可以通过RESTful搭建不少web服务,然后通过Android客户端去访问。