虽然在登录系统中使用了
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());
}