Android(java)学习笔记154:采用HttpClient提交数据(qq登录案例)
1.Apache -Httpclient
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。(类比推理MySQL数据库客户端)
(1)构造HttpClient的实例。
(2)创建连接方法的实例,这里是HttpGet,在HttpGet的构造方法里面传入待连接的路径。
(3)请求HttpClient,调用execute传入HttPGet取得HttpResponse。
(4)读HttpResponse ,在读之前判断连接状态是否等于HttpStatus.SC_OK(200)。
(5)对读取的内容进行处理。
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方式提交数据:
(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是一样,这里不再重复。