为了实现Android客户端和服务端的通信,Android SDK为我们提供了Apache的HttpClient来方便我们使用各种HTTP服务。可以把HttpClient看成一个浏览器,通过它可以方便地发出GET请求和POST请求来获得服务端响应。
下面我们先来实现一个GET请求:
// 服务端负责处理请求页面的URL,这里你自己根据你的IP地址及文件目录进行填写
String baseURL = "http://10.15.67.10:8080/phptest1/index.php";
// ?后面跟要传送的键值对,多个键值对之间用&连接。这里第一个键值对的键名为name,键值为输入的值;第二个键名为password,键值为输入值。
String URL = baseURL+"?name="+editText1.getText().toString()+"&password="+editText2.getText().toString();
try{
HttpGet httpGet = new HttpGet(URL);
HttpParams params = new BasicHttpParams();
// 采用UTF-8编码格式
params.setParameter("charset", HTTP.UTF_8);
// 设置连接超时时间为8秒
HttpConnectionParams.setConnectionTimeout(params, 8 * 1000);
// 设置数据请求时间为8秒
HttpConnectionParams.setSoTimeout(params, 8 * 1000);
// 新建一个Http客户端对象
HttpClient httpClient = new DefaultHttpClient(params);
// 用该对象发送GET请求,返回一个Http响应
HttpResponse httpResponse = httpClient.execute(httpGet);
// 判断是否获得正确的响应,然后执行相应的操作
if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
// 这里要注意一下返回的结果用UTF-8编码,否则当返回结果有中文时可能会出现乱码。最好所有的地方都统一编码
String strResult = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
if(strResult.equals("loginsuccess")){
// 登录成功 ToDO
Log.d("debug", strResult);
}
else {
// 登录失败 ToDo
Log.d("debug", strResult);
}
}
}
catch(Exception e){
Log.d("debug", "GETFAILED:"+e.toString());
}
接下来是POST请求:
String username = editText1.getText().toString();
String userpassword = editText2.getText().toString();
// 新建名值对,用于存储要传送的数据
NameValuePair nameValuePair1 = new BasicNameValuePair("name", username);
NameValuePair nameValuePair2 = new BasicNameValuePair("password", userpassword);
// 将创建好的名值对加入到list中
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(nameValuePair1);
nameValuePairs.add(nameValuePair2);
try{
// 用刚才的list填充一个http请求实体,并采用UTF-8编码
HttpEntity requesteEntity = new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8);
// 第一个POST请求
HttpPost httpPost = new HttpPost(baseURL);
// 设置POST请求的数据实体
httpPost.setEntity(requesteEntity);
HttpParams parms = new BasicHttpParams();
// 设置超时时间和请求时间
HttpConnectionParams.setConnectionTimeout(parms, 8 * 1000);
HttpConnectionParams.setSoTimeout(parms, 8 * 1000);
// 新建一个http客户端对象
HttpClient httpClient = new DefaultHttpClient(parms);
// 发送POST请求,返回一个http响应
HttpResponse httpResponse = httpClient.execute(httpPost);
if(httpResponse.getStatusLine().getStatusCode() == 200){
// 返回响应的结果
String strResult = EntityUtils.toString(httpResponse.getEntity(),"UTF-8");
if(strResult.equals("loginsuccess")){
// 登录成功 ToDO
Log.d("debug", strResult);
}
else {
// 登录失败 ToDo
Log.d("debug", strResult);
}
}
else{
Log.d("debug", "Error Response:"+httpResponse.getStatusLine().toString());
}
}
catch(Exception e){
Log.d("debug", e.toString());
}
http://10.15.67.10:8080/phptest1/index.php
<?php
//判断全局变量GET和POST对应的键名是否被赋值
if(isset($_GET["name"])&&isset($_GET["password"])){
$name = $_GET["name"];
$password = $_GET["password"];
}
if(isset($_POST["name"])&&isset($_POST["password"])){
$name = $_POST["name"];
$password = $_POST["password"];
}
//如果客户端输入的用户名为admin,密码为111111则登录成功。在实际项目中当然是查询数据库进行判断啦。。
if($name == 'admin'&&$password == '111111'){
echo "loginsuccess";
}
else{
echo "loginfailed";
}
当然,不要忘了在Androidmanifest文件中加上访问网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
还有一点要值得注意的是,Android不准在主线程中执行网络操作,所以在执行上述操作的时候要在一个子线程中完成,然后可以用handler异步更行UI。