虽然在登录系统中使用了 Web Service 与服务端进行交互。但是在传递大量的数量时, Web Service 显得有些笨拙。在本节将介绍移动电子相册中使用的另外一种与数据库交互的方法。直接发送 HTTP GET 或 POST 请求。这就要用到 HttpGet 、 HttpPost 以及 HttpURLConnection 这些类。
15.3.1 HttpGet 类和 HttpPost 类
本节将介绍 Android SDK 集成的 Apache HttpClient 模块。要注意的是,这里的 Apache HttpClient 模块是 HttpClient 4.0 ( org.apache.http.* ),而不是 Jakarta Commons HttpClient 3.x ( org.apache.commons.httpclient.* )。
在 HttpClient 模块中用到了两个重要的类: HttpGet 和 HttpPost 。这两个类分别用来提交 HTTP GET 和 HTTP POST 请求。为了测试本节的例子,需要先编写一个 Servlet 程序,用来接收 HTTP GET 和 HTTP POST 请求。读者也可以使用其他服务端的资源来测试本节的例子。
假设 192.168.17.81 是本机的 IP ,客户端可以通过如下的 URL 来访问服务端的资源:
http://192.168.17.81:8080/querybooks/QueryServlet?bookname = 开发
在这里 bookname 是 QueryServlet 的请求参数,表示图书名,通过该参数来查询图书信息。
现在我们要通过 HttpGet 和 HttpPost 类向 QueryServlet 提交请求信息,并将返回结果显示在 TextView 组件中。
无论是使用 HttpGet ,还是使用 HttpPost ,都必须通过如下 3 步来访问 HTTP 资源。
1. 创建 HttpGet 或 HttpPost 对象,将要请求的 URL 通过构造方法传入 HttpGet 或 HttpPost 对象。
2. 使用 DefaultHttpClient 类的 execute 方法发送 HTTP GET 或 HTTP POST 请求,并返回 HttpResponse 对象。
3. 通过 HttpResponse 接口的 getEntity 方法返回响应信息,并进行相应的处理。
如果使用 HttpPost 方法提交 HTTP POST 请求,还需要使用 HttpPost 类的 setEntity 方法设置请求参数。
本例使用了两个按钮来分别提交 HTTP GET 和 HTTP POST 请求,并从 EditText 组件中获得请求参数( bookname )值,最后将返回结果显示在 TextView 组件中。两个按钮共用一个 onClick 事件方法,代码如下:
public void onClick(View view)
{
// 读者需要将本例中的 IP 换成自己机器的 IP
String url = "http://192.168.17.81:8080/querybooks/QueryServlet" ;
TextView tvQueryResult = (TextView) findViewById(R.id.tvQueryResult);
EditText etBookName = (EditText) findViewById(R.id.etBookName);
HttpResponse httpResponse = null ;
try
{
switch (view.getId())
{
// 提交 HTTP GET 请求
case R.id.btnGetQuery:
// 向 url 添加请求参数
url += "? bookname =" + etBookName.getText().toString();
// 第 1 步:创建 HttpGet 对象
HttpGet httpGet = new HttpGet(url);
// 第 2 步:使用 execute 方法发送 HTTP GET 请求,并返回 HttpResponse 对象
httpResponse = new DefaultHttpClient().execute(httpGet);
// 判断请求响应状态码,状态码为 200 表 示服务端成功响应了客户端的请求
if (httpResponse.getStatusLine(). getStatusCode() == 200)
{
// 第 3 步:使用 getEntity 方法获得返回结果
String result = EntityUtils . toString(httpResponse.getEntity());
// 去掉返回结果中的 "\r" 字符, 否则会在结果字符串后面显示一个小方格
tvQueryResult.setText(result.replaceAll("\r", ""));
}
break;
// 提交 HTTP POST 请求
case R.id.btnPostQuery:
// 第 1 步:创建 HttpPost 对象
HttpPost httpPost = new HttpPost(url);
// 设置 HTTP POST 请求参数必须用 NameValuePair 对象
List <NameValuePair> params = new ArrayList <NameValuePair> ();
params.add(new BasicNameValuePair ("bookname", etBookName.getText(). toString()));
// 设置 HTTP POST 请求参数
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
// 第 2 步:使用 execute 方法发送 HTTP POST 请求,并返回 HttpResponse 对象
httpResponse = new DefaultHttpClient(). execute(httpPost);
if (httpResponse.getStatusLine(). getStatusCode() == 200)
{
// 第 3 步:使用 getEntity 方法获得返回结果
String result = EntityUtils .toString (httpResponse.getEntity());
// 去掉返回结果中的 "\r" 字符, 否则会在结果字符串后面显示一个小方格
tvQueryResult.setText(result.replaceAll("\r", ""));
}
break;
}
}
catch (Exception e)
{
tvQueryResult.setText(e.getMessage());
}