1.简单介绍

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

2.功能介绍

    下面列出的是 HttpClient 提供的基本的功能,要知道很多其它具体的功能能够參见 HttpClient 的主页。

(1)实现了全部 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自己主动转向
(3)支持 HTTPS 协议
(4)支持代理server等

3.处理步骤

1.创建 HttpClient 的实例
2. 创建某种连接方法的实例,比方:HttpGet。

在 HttpGet 的构造函数中传入待连接的地址
3. 调用第一步中创建好的实例的 execute 方法来运行第二步中创建好的 method 实例
4. 读 response
5. 释放连接。不管运行方法是否成功。都必须释放连接

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

4.具体案例说明

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

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

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

  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的代码(代码中具体加了凝视,请细致阅读)

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

5.运行效果例如以下图

希望能对你有所帮助!

07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例的更多相关文章

  1. 09_android入门_採用android-async-http开源项目的GET方式或POST方式实现登陆案例

    依据08_android入门_android-async-http开源项目介绍及用法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习an ...

  2. 09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例

    根据08_android入门_android-async-http开源项目介绍及使用方法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习 ...

  3. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  4. 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总

    当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2  任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...

  5. SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)

    SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...

  6. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  7. 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和

    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...

  8. 042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用——循环输出英文字母

    042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用--循环输出英文字母 本文知识点:案例演示while循环的使用2 ...

  9. 041 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 03 案例演示while循环的使用——求1到5的累加和

    041 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 03 案例演示while循环的使用--求1到5的累加和 本文知识点:案例演示while循环的使用1 ...

随机推荐

  1. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...

  2. Impala性能优化

    不多说,直接上干货! • 执行计划 – 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案 – 命令:explain sql.profile 要点: • 1.SQL优化,使用 ...

  3. Kinect 开发 —— 手势识别(下)

    基本手势追踪 手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的.在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发.这个手部追踪类库包 ...

  4. Centos7.0 Vmware10.0.3 网络桥接配置

    首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd  /etc/sysconfig/network-scripts/  #进入网络配置 ...

  5. matplotlib散点图笔记

    定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import ...

  6. 【Codeforces Round #456 (Div. 2) B】New Year's Eve

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然10000..取到之后 再取一个01111..就能异或成最大的数字了. [代码] /* 1.Shoud it use long ...

  7. WPF通用框架 数据库结构

    前言 由於技術轉型, 目前大部分工作都是WPF為主, 但是趨於如今想在網絡上找一套能夠滿意的WPF權限管理框架太難, 因為WinForm那時候是有一套改寫過的權限框架, 所以數據庫設計這塊已經有了一個 ...

  8. 洛谷——P2093 零件分组

    https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...

  9. error c2572重定义默认參数

    因为想省事.在声明过函数之后直接复制粘贴去实现,结果出现error c2572重定义默认參数 顾名思义.该默认參数被定义多次.在一个文件(或一个作用域)中,仅仅能为形參指定默认 实參一次.在编译的时候 ...

  10. 4.使用fastjson进行json字符串和List的转换

    转自:https://blog.csdn.net/lipr86/article/details/80833952 使用fastjson进行自定义类的列表和字符串转换 1.环境 jdk1.8,fastj ...