采用HttpClient的POST方式、GET方式分别实现登陆案例

1.简介

HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

2.功能介绍

    以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。

(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等
3.处理步骤

1.创建 HttpClient 的实例
2. 创建某种连接方法的实例,比如:HttpGet。在 HttpGet 的构造函数中传入待连接的地址
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
4. 读 response
5. 释放连接。无论执行方法是否成功,都必须释放连接

6. 对得到后的内容进行处理

4.具体案例说明

1.继续采用03_android入门_采用RelativeLayout实现登陆界面为该案例的布局文件 

2.服务器端的代码采用04_android入门_采用HttpURLConnection的GET方式实现登陆案例中的服务器代码片段(5.关于服务器中我仅写一个Servlet进行处理相应的请求处理)

3.我对服务器端,返回的流对象的处理,写了一个工具类(StreamTools) 代码如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package www.csdn.net.util;  
  2.   
  3. import java.io.ByteArrayOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6.   
  7. public class StreamTools {  
  8.   
  9.     /** 
  10.      * 把流对象转换成字符串对象 
  11.      *  
  12.      * @param is 
  13.      * @return 
  14.      */  
  15.     public static String streamToStr(InputStream is) {  
  16.         try {  
  17.             // 定义字节数组输出流对象  
  18.             ByteArrayOutputStream os = new ByteArrayOutputStream();  
  19.             // 定义读取的长度  
  20.             int len = 0;  
  21.             // 定义读取的缓冲区  
  22.             byte buffer[] = new byte[1024];  
  23.             // 按照定义的缓冲区进行循环读取,直到读取完毕为止  
  24.             while ((len = is.read(buffer)) != -1) {  
  25.                 // 根据读取的长度写入到字节数组输出流对象中  
  26.                 os.write(buffer, 0, len);  
  27.             }  
  28.             // 关闭流  
  29.             is.close();  
  30.             os.close();  
  31.             // 把读取的字节数组输出流对象转换成字节数组  
  32.             byte data[] = os.toByteArray();  
  33.             // 按照指定的编码进行转换成字符串(此编码要与服务端的编码一致就不会出现乱码问题了,android默认的编码为UTF-8)  
  34.             return new String(data, "UTF-8");  
  35.         } catch (IOException e) {  
  36.             e.printStackTrace();  
  37.             return null;  
  38.         }  
  39.     }  
  40. }  

4.LoginActivity的代码(代码中详细加了注释,请仔细阅读)

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package www.csdn.net.lesson03;  
  2.   
  3.   
  4. import java.io.InputStream;  
  5.   
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8.   
  9. import org.apache.http.HttpEntity;  
  10. import org.apache.http.HttpResponse;  
  11. import org.apache.http.NameValuePair;  
  12. import org.apache.http.client.HttpClient;  
  13. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  14. import org.apache.http.client.methods.HttpGet;  
  15. import org.apache.http.client.methods.HttpPost;  
  16. import org.apache.http.impl.client.DefaultHttpClient;  
  17. import org.apache.http.message.BasicNameValuePair;  
  18.   
  19. import www.csdn.net.util.StreamTools;  
  20. import android.app.Activity;  
  21. import android.os.Bundle;  
  22. import android.text.TextUtils;  
  23. import android.view.View;  
  24. import android.widget.EditText;  
  25. import android.widget.TextView;  
  26. import android.widget.Toast;  
  27.   
  28. public class LoginActivity extends Activity {  
  29.   
  30.     // 声明控件  
  31.     private EditText et_name, et_pass;  
  32.     private TextView tv_result;  
  33.   
  34.     @Override  
  35.     protected void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.activity_login);  
  38.         // 获取控件对象  
  39.         et_name = (EditText) findViewById(R.id.et_name); //用户名控件  
  40.         et_pass = (EditText) findViewById(R.id.et_pass);//密码控件  
  41.         tv_result = (TextView) findViewById(R.id.tv_result);//服务器端返回数据显示的控件  
  42.     }  
  43.   
  44.     /** 
  45.      * 按钮点击事件处理 
  46.      * @param v 
  47.      */  
  48.     public void login(View v) {  
  49.         //获取控件id  
  50.         int id = v.getId();  
  51.   
  52.         switch (id) {  
  53.         case R.id.btn_login:  
  54.             // 获取控件的文本内容  
  55.             final String userName = et_name.getText().toString();// 用户名  
  56.             final String userPass = et_pass.getText().toString();// 用户密码  
  57.             //判断用户名和密码是否为空  
  58.             if (TextUtils.isEmpty(userName.trim())  
  59.                     || TextUtils.isEmpty(userPass.trim())) {  
  60.                 Toast.makeText(this"用户名或者密码不能为空", Toast.LENGTH_LONG).show();  
  61.             } else {  
  62.                 // 开启线程处理  
  63.                 new Thread(new Runnable() {  
  64.                     @Override  
  65.                     public void run() {  
  66.                         //调用:loginByHttpClientGet(userName, userPass);  
  67.                         //调用:loginByHttpClientPost(userName, userPass);  
  68.                         loginByHttpClientGet(userName, userPass);//测试  
  69.                     }  
  70.                 }).start();  
  71.             }  
  72.             break;  
  73.   
  74.         default:  
  75.             break;  
  76.         }  
  77.     }  
  78.       
  79.       
  80.       
  81.     /** 
  82.      * HttpClient中POST方式的处理 
  83.      * @param userName 
  84.      * @param userPass 
  85.      */  
  86.     public void loginByHttpClientPost(String userName, String userPass) {  
  87.         //1.创建 HttpClient 的实例  
  88.         HttpClient client = new DefaultHttpClient();  
  89.         //2. 创建某种连接方法的实例,在这里是HttpPost。在 HttpPost 的构造函数中传入待连接的地址  
  90.         String uri="http://172.16.237.200:8080/video/login.do";  
  91.         HttpPost httpPost = new HttpPost(uri);  
  92.         try {  
  93.             //封装传递参数的集合  
  94.             List<NameValuePair> parameters = new ArrayList<NameValuePair>();  
  95.             //往这个集合中添加你要传递的参数  
  96.             parameters.add(new BasicNameValuePair("username", userName));  
  97.             parameters.add(new BasicNameValuePair("userpass", userPass));  
  98.             //创建传递参数封装 实体对象  
  99.             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "UTF-8");//设置传递参数的编码  
  100.             //把实体对象存入到httpPost对象中  
  101.             httpPost.setEntity(entity);  
  102.             //3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例  
  103.             HttpResponse response = client.execute(httpPost); //HttpUriRequest的后代对象 //在浏览器中敲一下回车  
  104.             //4. 读 response  
  105.             if(response.getStatusLine().getStatusCode()==200){//判断状态码  
  106.                 InputStream is = response.getEntity().getContent();//获取内容  
  107.                 final String result = StreamTools.streamToStr(is); // 通过工具类转换文本  
  108.                 LoginActivity.this.runOnUiThread(new Runnable() {   //通过runOnUiThread方法处理  
  109.                     @Override  
  110.                     public void run() {  
  111.                         //设置控件的内容(此内容是从服务器端获取的)  
  112.                         tv_result.setText(result);  
  113.                     }  
  114.                 });  
  115.             }  
  116.         } catch (Exception e) {  
  117.             // TODO Auto-generated catch block  
  118.             e.printStackTrace();  
  119.         }finally{  
  120.             //6. 释放连接。无论执行方法是否成功,都必须释放连接  
  121.             client.getConnectionManager().shutdown();  
  122.         }         
  123.     }  
  124.       
  125.     /** 
  126.      * 通过httpClient中的GET方式处理的 
  127.      * @param userName 
  128.      * @param userPass 
  129.      */  
  130.     public void loginByHttpClientGet(String userName,String userPass){  
  131.         // HttpClient 发请求 GET方式处理  
  132.         // 1.创建 HttpClient 的实例 打开一个浏览器  
  133.         HttpClient client = new DefaultHttpClient(); // DefaultHttpClient extends AbstractHttpClient  
  134.         try {  
  135.   
  136.             // 2. 创建某种连接方法的实例,在这里是HttpGet。在 HttpGet  
  137.             // 的构造函数中传入待连接的地址     
  138.             String uri = "http://172.16.237.200:8080/video/login.do?username="  
  139.                     + userName + "&userpass=" + userPass;  
  140.             //强调 地址不能够出现 localhost:操作  
  141.             HttpGet httpGet = new HttpGet(uri);  
  142.             // 3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例  
  143.             HttpResponse response = client.execute(httpGet); // 在浏览器中敲了一下回车  
  144.             // 4. 读 response  
  145.             int statusCode = response.getStatusLine()  
  146.                     .getStatusCode();// 读取状态行中的状态码  
  147.             if (statusCode == 200) { //如果等于200 一切ok  
  148.                 HttpEntity entity = response.getEntity();// 返回实体对象  
  149.                 InputStream is = entity.getContent(); // 读取实体中内容  
  150.                 final String result = StreamTools.streamToStr(is); // 通过工具类转换文本  
  151.                 LoginActivity.this.runOnUiThread(new Runnable() {   //通过runOnUiThread方法处理  
  152.                     @Override  
  153.                     public void run() {  
  154.                         //设置控件的内容(此内容是从服务器端获取的)  
  155.                         tv_result.setText(result);  
  156.                     }  
  157.                 });  
  158.             }  
  159.   
  160.         } catch (Exception e) {  
  161.             e.printStackTrace();  
  162.         } finally {  
  163.             // 5.释放连接。无论执行方法是否成功,都必须释放连接  
  164.             client.getConnectionManager().shutdown();// 释放链接  
  165.         }  
  166.     }  
  167. }  

5.运行效果如下图



4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值