• Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)


    1.Apache -Httpclient

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

    代码模拟浏览器的行为
                 (1)打开浏览器
                 (2)输入数据
                 (3)敲回车
     
    2.Httpclient使用GET方式提交数据
    在GET方式下使用HttpClient需要几个最基本步骤。

    (1)构造HttpClient的实例。

    (2)创建连接方法的实例,这里是HttpGet,在HttpGet的构造方法里面传入待连接的路径。

    (3)请求HttpClient,调用execute传入HttPGet取得HttpResponse。

    (4)读HttpResponse ,在读之前判断连接状态是否等于HttpStatus.SC_OK(200)。

    (5)对读取的内容进行处理。

     
    其中MainActivity.java:
      1 package com.himi.post;
      2 import java.io.BufferedReader;
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileOutputStream;
      6 import java.io.InputStream;
      7 import java.io.InputStreamReader;
      8 import org.apache.http.HttpResponse;
      9 import org.apache.http.client.HttpClient;
     10 import org.apache.http.client.methods.HttpGet;
     11 import org.apache.http.impl.client.DefaultHttpClient;
     12 import android.app.Activity;
     13 import android.os.Bundle;
     14 import android.text.TextUtils;
     15 import android.util.Log;
     16 import android.view.View;
     17 import android.widget.CheckBox;
     18 import android.widget.EditText;
     19 import android.widget.Toast;
     20 public class MainActivity extends Activity {
     21     private static final String Tag = "MainActivity";
     22     private EditText et_qq;
     23     private EditText et_pwd;
     24     private CheckBox cb_remember;
     25     @Override
     26     protected void onCreate(Bundle savedInstanceState) {
     27         super.onCreate(savedInstanceState);
     28         setContentView(R.layout.activity_main);
     29         //查询关心的控件
     30         et_qq = (EditText) findViewById(R.id.et_qq);
     31         et_pwd = (EditText) findViewById(R.id.et_pwd);
     32         cb_remember = (CheckBox) findViewById(R.id.cb_remember);
     33         Log.i(Tag,"oncreate 被调用");
     34         //完成数据的回显。
     35         readSavedData();
     36     }
     37     //读取保存的数据
     38     private void readSavedData() {
     39         // getFilesDir() == /data/data/包名/files/  获取文件的路径 一般系统是不会清理的。 用户手工清理,系统会有提示。
     40         // getCacheDir()==  /data/data/包名/cache/ 缓存文件的路径 当系统内存严重不足的时候 系统会自动的清除缓存 用户手工清理系统没有提示
     41         File file = new File(getFilesDir(),"info.txt");
     42         if(file.exists()&&file.length()>0){
     43             try {
     44                 //FileInputStream fis = new FileInputStream(file);
     45                 FileInputStream fis =this.openFileInput("info.txt");
     46                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
     47                 //214342###abcdef
     48                 String info = br.readLine();
     49                 String qq = info.split("###")[0];
     50                 String pwd = info.split("###")[1];
     51                 et_qq.setText(qq);
     52                 et_pwd.setText(pwd);
     53                 fis.close();
     54             } catch (Exception e) {
     55                 e.printStackTrace();
     56             }
     57         }
     58     }
     59     /**
     60      * 登陆按钮的点击事件,在点击事件里面获取数据
     61      * @param view
     62      */
     63     public void login(View view){
     64         final String qq = et_qq.getText().toString().trim();
     65         final String pwd = et_pwd.getText().toString().trim();
     66         if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){
     67             Toast.makeText(this, "qq号码或者密码不能为空", 0).show();
     68             return;
     69         }
     70         //判断用户是否勾选记住密码。
     71         if(cb_remember.isChecked()){
     72             //保存密码
     73             Log.i(Tag,"保存密码");
     74             try {
     75 //                File file = new File(getFilesDir(),"info.txt");
     76 //                FileOutputStream fos = new FileOutputStream(file);
     77                 FileOutputStream fos = this.openFileOutput("info.txt", 0);
     78                 //214342###abcdef
     79                 fos.write((qq+"###"+pwd).getBytes());
     80                 fos.close();
     81                 Toast.makeText(this, "保存成功", 0).show();
     82             } catch (Exception e) {
     83                 e.printStackTrace();
     84                 Toast.makeText(this, "保存失败", 0).show();
     85             }
     86         }else{
     87             //无需保存密码
     88             Log.i(Tag,"无需保存密码");
     89         }
     90         
     91         //登录的操作,网络的请求
     92         new Thread() {
     93             public void run() {
     94                 //String path = "http://localhost:8080/web/LoginServlet";这里不能写成localhost
     95                 try {
     96                     //httpclient get请求提交数据
     97                     String path = getString(R.string.serverip)+"?qq="+qq+"&password="+pwd;
     98                     //1.打开浏览器
     99                     HttpClient client = new DefaultHttpClient();
    100                     //2.输入地址
    101                     HttpGet httpGet = new HttpGet(path);
    102                     //3.敲回车
    103                     HttpResponse response = client.execute(httpGet);
    104                     int code = response.getStatusLine().getStatusCode();
    105                     if(code == 200) {
    106                         InputStream is = response.getEntity().getContent();
    107                         String result = StreamTools.readStream(is);
    108                         showToastInAnyThread(result);
    109                     }else {
    110                         showToastInAnyThread("请求失败,返回码是:"+code);
    111                     }
    112                     
    113                     
    114                 } catch (Exception e) {
    115                     e.printStackTrace();
    116                     showToastInAnyThread("请求失败");
    117                 }
    118             };
    119         }.start();
    120         
    121     }
    122     
    123     /**
    124      * 显示土司 在主线程更新UI
    125      * @param text
    126      */
    127     public void showToastInAnyThread(final String text) {
    128         runOnUiThread(new Runnable() {
    129             
    130             public void run() {
    131                 Toast.makeText(MainActivity.this, text, 0).show();
    132                 
    133             }
    134         });
    135     }
    136 }

    这里的工具类StreamTools和前面一样的,布局文件也是和前面一样的;这里的效果演示和之前的笔记209和笔记210是一样,这里不再重复。

    3.Httpclient使用POST方式提交数据

    在POST方式下使用HttpClient需要几个最基本步骤。

    (1)构造HttpClient的实例。

    (2)创建连接方法的实例,这里是HttpPost,在HttpPost的构造方法里面传入待连接的路径。

    (3)请求HttpClient,调用execute传入HttPGet取得HttpResponse。

    (4)读HttpResponse ,在读之前判断连接状态是否等于HttpStatus.SC_OK(200)。

    (5)对读取的内容进行处理。

    其中MainActivity.java:

      1 package com.himi.post;
      2 import java.io.BufferedReader;
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileOutputStream;
      6 import java.io.InputStream;
      7 import java.io.InputStreamReader;
      8 import java.util.ArrayList;
      9 import java.util.List;
     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.HttpPost;
     15 import org.apache.http.impl.client.DefaultHttpClient;
     16 import org.apache.http.message.BasicNameValuePair;
     17 import android.app.Activity;
     18 import android.os.Bundle;
     19 import android.text.TextUtils;
     20 import android.util.Log;
     21 import android.view.View;
     22 import android.widget.CheckBox;
     23 import android.widget.EditText;
     24 import android.widget.Toast;
     25 public class MainActivity extends Activity {
     26     private static final String Tag = "MainActivity";
     27     private EditText et_qq;
     28     private EditText et_pwd;
     29     private CheckBox cb_remember;
     30     @Override
     31     protected void onCreate(Bundle savedInstanceState) {
     32         super.onCreate(savedInstanceState);
     33         setContentView(R.layout.activity_main);
     34         //查询关心的控件
     35         et_qq = (EditText) findViewById(R.id.et_qq);
     36         et_pwd = (EditText) findViewById(R.id.et_pwd);
     37         cb_remember = (CheckBox) findViewById(R.id.cb_remember);
     38         Log.i(Tag,"oncreate 被调用");
     39         //完成数据的回显。
     40         readSavedData();
     41     }
     42     //读取保存的数据
     43     private void readSavedData() {
     44         // getFilesDir() == /data/data/包名/files/  获取文件的路径 一般系统是不会清理的。 用户手工清理,系统会有提示。
     45         // getCacheDir()==  /data/data/包名/cache/ 缓存文件的路径 当系统内存严重不足的时候 系统会自动的清除缓存 用户手工清理系统没有提示
     46         File file = new File(getFilesDir(),"info.txt");
     47         if(file.exists()&&file.length()>0){
     48             try {
     49                 //FileInputStream fis = new FileInputStream(file);
     50                 FileInputStream fis =this.openFileInput("info.txt");
     51                 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
     52                 //214342###abcdef
     53                 String info = br.readLine();
     54                 String qq = info.split("###")[0];
     55                 String pwd = info.split("###")[1];
     56                 et_qq.setText(qq);
     57                 et_pwd.setText(pwd);
     58                 fis.close();
     59             } catch (Exception e) {
     60                 e.printStackTrace();
     61             }
     62         }
     63     }
     64     /**
     65      * 登陆按钮的点击事件,在点击事件里面获取数据
     66      * @param view
     67      */
     68     public void login(View view){
     69         final String qq = et_qq.getText().toString().trim();
     70         final String pwd = et_pwd.getText().toString().trim();
     71         if(TextUtils.isEmpty(qq)||TextUtils.isEmpty(pwd)){
     72             Toast.makeText(this, "qq号码或者密码不能为空", 0).show();
     73             return;
     74         }
     75         //判断用户是否勾选记住密码。
     76         if(cb_remember.isChecked()){
     77             //保存密码
     78             Log.i(Tag,"保存密码");
     79             try {
     80 //                File file = new File(getFilesDir(),"info.txt");
     81 //                FileOutputStream fos = new FileOutputStream(file);
     82                 FileOutputStream fos = this.openFileOutput("info.txt", 0);
     83                 //214342###abcdef
     84                 fos.write((qq+"###"+pwd).getBytes());
     85                 fos.close();
     86                 Toast.makeText(this, "保存成功", 0).show();
     87             } catch (Exception e) {
     88                 e.printStackTrace();
     89                 Toast.makeText(this, "保存失败", 0).show();
     90             }
     91         }else{
     92             //无需保存密码
     93             Log.i(Tag,"无需保存密码");
     94         }
     95         
     96         //登录的操作,网络的请求
     97         new Thread() {
     98             public void run() {
     99                 //post请求提交数据
    100                 //String path = "http://localhost:8080/web/LoginServlet";这里不能写成localhost
    101                 try {
    102                     String path = getString(R.string.serverip);
    103                     //1.打开浏览器
    104                     HttpClient client = new DefaultHttpClient();
    105                     //2.输入地址
    106                     HttpPost httpPost = new HttpPost(path);
    107                     //设置一个url的表单的数据
    108                     List<NameValuePair> paramters = new ArrayList<NameValuePair>();
    109                     paramters.add(new BasicNameValuePair("qq", qq));
    110                     paramters.add(new BasicNameValuePair("password", pwd));
    111                     httpPost.setEntity(new UrlEncodedFormEntity(paramters));
    112                     //3.敲回车
    113                     HttpResponse response = client.execute(httpPost);
    114                     int code = response.getStatusLine().getStatusCode();
    115                     if(code == 200) {
    116                         InputStream is = response.getEntity().getContent();
    117                         String result = StreamTools.readStream(is);
    118                         showToastInAnyThread(result);
    119                     }else {
    120                         showToastInAnyThread("请求失败,返回码是:"+code);
    121                     }
    122                     
    123                 } catch (Exception e) {
    124                     e.printStackTrace();
    125                     showToastInAnyThread("请求失败");
    126                 }
    127             };
    128         }.start();
    129         
    130     }
    131     
    132     /**
    133      * 显示土司 在主线程更新UI
    134      * @param text
    135      */
    136     public void showToastInAnyThread(final String text) {
    137         runOnUiThread(new Runnable() {
    138             
    139             public void run() {
    140                 Toast.makeText(MainActivity.this, text, 0).show();
    141                 
    142             }
    143         });
    144     }
    145 }

    这里的工具类StreamTools和前面一样的,布局文件也是和前面一样的;这里的效果演示和之前的笔记209和笔记210是一样,这里不再重复。

  • 相关阅读:
    mysql那些事(1)手机号与座机号码如何存储
    分享一个PHP调用RestFul接口的函数
    php sprintf用法
    HTTP状态码详解
    PHP随机生成中国人姓名的类
    PHP计算两组经纬度坐标之间的距离
    PHP根据经纬度获取在范围坐标的数据
    PHP 利用QQ邮箱发送邮件「PHPMailer」
    PHP中利用PHPMailer配合QQ邮箱实现发邮件
    修改PHP上传文件大小限制
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4784470.html
Copyright © 2020-2023  润新知