07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例
1.简单介绍
HttpClient 是 Apache Jakarta Common 下的子项目,能够用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,而且它支持
HTTP 协议最新的版本号和建议。
2.功能介绍
下面列出的是 HttpClient 提供的基本的功能,要知道很多其它具体的功能能够參见 HttpClient 的主页。
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) 代码例如以下:
- package www.csdn.net.util;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- public class StreamTools {
- /**
- * 把流对象转换成字符串对象
- *
- * @param is
- * @return
- */
- public static String streamToStr(InputStream is) {
- try {
- // 定义字节数组输出流对象
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- // 定义读取的长度
- int len = 0;
- // 定义读取的缓冲区
- byte buffer[] = new byte[1024];
- // 依照定义的缓冲区进行循环读取。直到读取完成为止
- while ((len = is.read(buffer)) != -1) {
- // 依据读取的长度写入到字节数组输出流对象中
- os.write(buffer, 0, len);
- }
- // 关闭流
- is.close();
- os.close();
- // 把读取的字节数组输出流对象转换成字节数组
- byte data[] = os.toByteArray();
- // 依照指定的编码进行转换成字符串(此编码要与服务端的编码一致就不会出现乱码问题了。android默认的编码为UTF-8)
- return new String(data, "UTF-8");
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
- }
4.LoginActivity的代码(代码中具体加了凝视,请细致阅读)
- package www.csdn.net.lesson03;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.DefaultHttpClient;
- import org.apache.http.message.BasicNameValuePair;
- import www.csdn.net.util.StreamTools;
- import android.app.Activity;
- import android.os.Bundle;
- import android.text.TextUtils;
- import android.view.View;
- import android.widget.EditText;
- import android.widget.TextView;
- import android.widget.Toast;
- public class LoginActivity extends Activity {
- // 声明控件
- private EditText et_name, et_pass;
- private TextView tv_result;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_login);
- // 获取控件对象
- et_name = (EditText) findViewById(R.id.et_name); //username控件
- et_pass = (EditText) findViewById(R.id.et_pass);//password控件
- tv_result = (TextView) findViewById(R.id.tv_result);//server端返回数据显示的控件
- }
- /**
- * button点击事件处理
- * @param v
- */
- public void login(View v) {
- //获取控件id
- int id = v.getId();
- switch (id) {
- case R.id.btn_login:
- // 获取控件的文本内容
- final String userName = et_name.getText().toString();// username
- final String userPass = et_pass.getText().toString();// 用户password
- //推断username和password是否为空
- if (TextUtils.isEmpty(userName.trim())
- || TextUtils.isEmpty(userPass.trim())) {
- Toast.makeText(this, "username或者password不能为空", Toast.LENGTH_LONG).show();
- } else {
- // 开启线程处理
- new Thread(new Runnable() {
- @Override
- public void run() {
- //调用:loginByHttpClientGet(userName, userPass);
- //调用:loginByHttpClientPost(userName, userPass);
- loginByHttpClientGet(userName, userPass);//測试
- }
- }).start();
- }
- break;
- default:
- break;
- }
- }
- /**
- * HttpClient中POST方式的处理
- * @param userName
- * @param userPass
- */
- public void loginByHttpClientPost(String userName, String userPass) {
- //1.创建 HttpClient 的实例
- HttpClient client = new DefaultHttpClient();
- //2. 创建某种连接方法的实例。在这里是HttpPost。在 HttpPost 的构造函数中传入待连接的地址
- String uri="http://172.16.237.200:8080/video/login.do";
- HttpPost httpPost = new HttpPost(uri);
- try {
- //封装传递參数的集合
- List<NameValuePair> parameters = new ArrayList<NameValuePair>();
- //往这个集合中加入你要传递的參数
- parameters.add(new BasicNameValuePair("username", userName));
- parameters.add(new BasicNameValuePair("userpass", userPass));
- //创建传递參数封装 实体对象
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, "UTF-8");//设置传递參数的编码
- //把实体对象存入到httpPost对象中
- httpPost.setEntity(entity);
- //3. 调用第一步中创建好的实例的 execute 方法来运行第二步中创建好的 method 实例
- HttpResponse response = client.execute(httpPost); //HttpUriRequest的后代对象 //在浏览器中敲一下回车
- //4. 读 response
- if(response.getStatusLine().getStatusCode()==200){//推断状态码
- InputStream is = response.getEntity().getContent();//获取内容
- final String result = StreamTools.streamToStr(is); // 通过工具类转换文本
- LoginActivity.this.runOnUiThread(new Runnable() { //通过runOnUiThread方法处理
- @Override
- public void run() {
- //设置控件的内容(此内容是从server端获取的)
- tv_result.setText(result);
- }
- });
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }finally{
- //6. 释放连接。不管运行方法是否成功,都必须释放连接
- client.getConnectionManager().shutdown();
- }
- }
- /**
- * 通过httpClient中的GET方式处理的
- * @param userName
- * @param userPass
- */
- public void loginByHttpClientGet(String userName,String userPass){
- // HttpClient 发请求 GET方式处理
- // 1.创建 HttpClient 的实例 打开一个浏览器
- HttpClient client = new DefaultHttpClient(); // DefaultHttpClient extends AbstractHttpClient
- try {
- // 2. 创建某种连接方法的实例。在这里是HttpGet。在 HttpGet
- // 的构造函数中传入待连接的地址
- String uri = "http://172.16.237.200:8080/video/login.do?
- username="
- + userName + "&userpass=" + userPass;
- //强调 地址不能够出现 localhost:操作
- HttpGet httpGet = new HttpGet(uri);
- // 3. 调用第一步中创建好的实例的 execute 方法来运行第二步中创建好的 method 实例
- HttpResponse response = client.execute(httpGet); // 在浏览器中敲了一下回车
- // 4. 读 response
- int statusCode = response.getStatusLine()
- .getStatusCode();// 读取状态行中的状态码
- if (statusCode == 200) { //假设等于200 一切ok
- HttpEntity entity = response.getEntity();// 返回实体对象
- InputStream is = entity.getContent(); // 读取实体中内容
- final String result = StreamTools.streamToStr(is); // 通过工具类转换文本
- LoginActivity.this.runOnUiThread(new Runnable() { //通过runOnUiThread方法处理
- @Override
- public void run() {
- //设置控件的内容(此内容是从server端获取的)
- tv_result.setText(result);
- }
- });
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- // 5.释放连接。不管运行方法是否成功,都必须释放连接
- client.getConnectionManager().shutdown();// 释放链接
- }
- }
- }
5.运行效果例如以下图
希望能对你有所帮助!
07_android入门_採用HttpClient的POST方式、GET方式分别实现登陆案例的更多相关文章
- 09_android入门_採用android-async-http开源项目的GET方式或POST方式实现登陆案例
依据08_android入门_android-async-http开源项目介绍及用法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习an ...
- 09_android入门_采用android-async-http开源项目的GET方式或POST方式实现登陆案例
根据08_android入门_android-async-http开源项目介绍及使用方法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习 ...
- Spring_MVC_教程_快速入门_深入分析
Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...
- 【笔记目录2】【jessetalk 】ASP.NET Core快速入门_学习笔记汇总
当前标签: ASP.NET Core快速入门 共2页: 上一页 1 2 任务27:Middleware管道介绍 GASA 2019-02-12 20:07 阅读:15 评论:0 任务26:dotne ...
- SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)
SQL Server 表的管理_关于数据增删查改的操作的详解(案例代码)-DML 1.SQL INSERT INTO 语句(在表中插入) INSERT INTO 语句用于向表中插入新记录. SQL I ...
- Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)
本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...
- 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和
048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...
- 042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用——循环输出英文字母
042 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 04 案例演示while循环的使用--循环输出英文字母 本文知识点:案例演示while循环的使用2 ...
- 041 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 03 案例演示while循环的使用——求1到5的累加和
041 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 03 案例演示while循环的使用--求1到5的累加和 本文知识点:案例演示while循环的使用1 ...
随机推荐
- javascript进阶教程第一章案例实战
javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...
- Impala性能优化
不多说,直接上干货! • 执行计划 – 查询sql执行之前,先对该sql做一个分析,列出需要完成这一项查询的详细方案 – 命令:explain sql.profile 要点: • 1.SQL优化,使用 ...
- Kinect 开发 —— 手势识别(下)
基本手势追踪 手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的.在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发.这个手部追踪类库包 ...
- Centos7.0 Vmware10.0.3 网络桥接配置
首先要将Vmware10.0.3设置为桥接模式. CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sysconfig/network-scripts/ #进入网络配置 ...
- matplotlib散点图笔记
定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import ...
- 【Codeforces Round #456 (Div. 2) B】New Year's Eve
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然10000..取到之后 再取一个01111..就能异或成最大的数字了. [代码] /* 1.Shoud it use long ...
- WPF通用框架 数据库结构
前言 由於技術轉型, 目前大部分工作都是WPF為主, 但是趨於如今想在網絡上找一套能夠滿意的WPF權限管理框架太難, 因為WinForm那時候是有一套改寫過的權限框架, 所以數據庫設計這塊已經有了一個 ...
- 洛谷——P2093 零件分组
https://www.luogu.org/problem/show?pid=2093 题目描述 某工厂生产一批棍状零件,每个零件都有一定的长度(Li)和重量(Wi).现在为了加工需要,要将它们分成若 ...
- error c2572重定义默认參数
因为想省事.在声明过函数之后直接复制粘贴去实现,结果出现error c2572重定义默认參数 顾名思义.该默认參数被定义多次.在一个文件(或一个作用域)中,仅仅能为形參指定默认 实參一次.在编译的时候 ...
- 4.使用fastjson进行json字符串和List的转换
转自:https://blog.csdn.net/lipr86/article/details/80833952 使用fastjson进行自定义类的列表和字符串转换 1.环境 jdk1.8,fastj ...