技术开发 频道

Apache HttpClient Android客户端编程

  创建Android客户端

  接下来,我们开始创建Android的客户端,通过Apache的HTTP CLIENT访问RESTful服务。步骤如下:

  1) 在Eclipse中,选择新建立一个Android Project,方法是在File->New菜单中,选择Android Project,点NEXT进入下一步。

  2) 在Android Project的相关设置中,按如下图进行设置:

创建Android客户端

  可以看到,我们选用的是Android 2.2的SDK,应用的名称为AndroidJAXRSClient,创建的Activity名为AndroidJAXRSClient。接下来,首先创建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>

  可以看到,在这个布局文件中,只是简单放置了一个textview 文本显示控件,这个控

  件是用来显示服务端返回的JAX-RS的RESTful的结果。

  为了能获得服务端返回的结果,需要Android使用网络访问权限功能,因此必须在配置文件AndroidManifest.xml中进行设置,添加如下这句话:

<uses-permission  android:name="android.permission.INTERNET"></uses-permission>
    并指定应用程序启动的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.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;

  下面直接给出客户端Android访问服务端JAX-RS服务的代码,再逐一解析:

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();

     }

}

  在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客户端

  可以看到,Android的客户端通过访问JAX-RS的RESTful web service,得到了返回的XML字符串。同样,如果将以下的代码分别注释,再运行,可以分别看到text/plain,text/html为资源类型返回的不同结果:

  request.addHeader("Accept", "text/plain");

  request.addHeader("Accept", "text/html");

  当然,在服务端的HelloWorldResource中,也要分别将之前注释掉的getHTMLMessage()方法和getClichedMessage()方法启用。它们的运行结果分别如下两图:

创建Android客户端

创建Android客户端

  小结

  本文介绍了如何通过Apache的开源HttpClient去访问一个符合JAX-RS标准的RESTful服务,其中jersey是目前JAX-RS RESTful标准的一个不错的开源实现。而由于RESTful的简单,开发快捷,运行速度快,因此很适合象Android等移动设备进行访问,给用户会有很好的运行体验。读者可以通过本文的例子,加以扩展,可以通过RESTful搭建不少web服务,然后通过Android客户端去访问。

0