02.HTTP协议之客户端实现(POST请求)

转载请标明出处:http://blog.csdn.net/u012637501
1.客户端功能
    客户端程序模拟App用户注册过程:
        用户点击注册按钮后,客户端会通过HTTP协议向服务器发送POST请求/GET请求并传送数据,服务器获得数据后进行相关数据库处理,然后服务器再将处理的结果作为响应返回给客户端,客户端根据获得的响应信息继续处理业务逻辑。
技术分享
技术分享
2.源码结构
(1)LoginActivity.java:客户端界面(UI),在子线程内通过消息机制完成向服务器发送请求,接收并处理响应信息;
(2)personalActivity.java:用户界面(UI),当用户注册成功后(即HTTP通信成功),客户端跳转至该界面;
(3)LoginToSever.java:客户端与服务器通信的实际实现类,包括发送请求、获取响应信息;
技术分享
技术分享
3.源码实现
(1)LoginActivity.java:客户端界面,在子线程内通过消息机制完成向服务器发送请求,接收并处理响应信息;
  1. package com.example.http_client;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12.   
  13. /*通过子进程、消息传递机制,完成HTTP网络通信*/  
  14. public class LoginActivity extends Activity {  
  15.     private EditText userName;  
  16.     private EditText password;  
  17.     private EditText confirmPsd;  
  18.     private Button registerBtn;  
  19.     private Button resetBtn;  
  20.     private void init()  
  21.     {  
  22.         userName = (EditText)findViewById(R.id.uername);  
  23.         password= (EditText)findViewById(R.id.password);  
  24.         confirmPsd=(EditText)findViewById(R.id.confirm);  
  25.         registerBtn= (Button)findViewById(R.id.register);  
  26.         resetBtn=(Button)findViewById(R.id.reset);  
  27.     }  
  28.     @Override  
  29.     protected void onCreate(Bundle savedInstanceState) {  
  30.         super.onCreate(savedInstanceState);  
  31.         setContentView(R.layout.main);  
  32.         init();     //初始化控件  
  33.         this.registerBtn.setOnClickListener(new OnClickListener() {  
  34.             public void onClick(View v) {  
  35.                   //1.创建一个Handler类对象,并重写handleMessage()方法  
  36.                 final Handler myHandler=new Handler(){  
  37.                     public void handleMessage(Message msg) {  
  38.                         String response=(String)msg.obj;                //读取obj发送过来的消息                
  39.                         if("true".equals(response))  
  40.                         {  
  41.                             Intent intent=new Intent();  
  42.                             intent.setClass(LoginActivity.this, personalActivity.class);  
  43.                             startActivity(intent);  
  44.                         }  
  45.                         else  
  46.                         {  
  47.                             Toast.makeText(LoginActivity.this"用户名与密码不对!",Toast.LENGTH_SHORT).show();  
  48.                         }  
  49.                     }  
  50.                 };  
  51.                 //2.创建一个子线程  
  52.                 new Thread(new Runnable(){  
  53.                     public void run() {  
  54.                         LoginToServer login = new LoginToServer();  
  55.                         String result=login.doPost(userName.getText().toString(), password.getText().toString());  
  56.                           
  57.                         System.out.println(result); //调试:打印服务器返回的结果,测试是否通信成功      
  58.                           
  59.                         Message msg=new Message();  
  60.                         msg.obj=result; //将响应信息保存到obj中  
  61.                         myHandler.sendMessage(msg);  
  62.                     }             
  63.                 }).start();  
  64.             }  
  65.         });  
  66.     }  
  67. }  
(2)personalActivity.java:用户界面(UI),当用户注册成功后(即HTTP通信成功),客户端跳转至该界面;
  1. package com.example.http_client;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class personalActivity extends Activity {  
  7.   
  8.     @Override  
  9.     protected void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.personal);  
  12.     }  
  13.       
(3)LoginToSever.java:(POST请求)客户端与服务器通信的实际实现类,包括发送请求、获取响应信息;
  1. package com.example.http_client;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.io.UnsupportedEncodingException;  
  7. import java.util.ArrayList;  
  8. import java.util.List;    
  9. import org.apache.http.HttpEntity;  
  10. import org.apache.http.HttpResponse;  
  11. import org.apache.http.HttpStatus;  
  12. import org.apache.http.NameValuePair;  
  13. import org.apache.http.client.ClientProtocolException;  
  14. import org.apache.http.client.HttpClient;  
  15. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  16. import org.apache.http.client.methods.HttpPost;  
  17. import org.apache.http.impl.client.DefaultHttpClient;  
  18. import org.apache.http.message.BasicNameValuePair;  
  19.   
  20. public class LoginToServer {  
  21.     private String url="http://10.0.2.2:8080/login/LoginServlet";    //访问服务器资源的URL地址  
  22. //  private String url="http://localhost:8080/login/LoginServlet";  
  23.     String result="";         
  24.       
  25.     /*doPost方法: 
  26.      *  作用:实现客户端向服务器发送POST请求*/  
  27.     public String doPost(String name,String psd)    
  28.     {  
  29.         HttpClient hc=new DefaultHttpClient();                      //a.创建HttpClient对象  
  30.         HttpPost httpPost=new HttpPost(url);                                //b.根据URL地址创建HttpPost对象  
  31.         NameValuePair param1= new BasicNameValuePair("username",name);  
  32.         NameValuePair param2=new BasicNameValuePair("psd",psd);  
  33.     //  System.out.println("username="+name+"psd="+psd);  
  34.         List<NameValuePair> params = new ArrayList<NameValuePair>();      
  35.         params.add(param1);  
  36.         params.add(param2); //c.创建参数列表,每个参数以键值对的形式且保存在NameValuePair中              
  37.         HttpEntity  he;  
  38.       try {  
  39.             he = new UrlEncodedFormEntity(params,"GBK");   //d.根据参数创建HttpEntity对象  
  40.             httpPost.setEntity(he);                        //e.将HttpEntity对象赋给HttpPost对象  
  41.             HttpResponse response = hc.execute(httpPost);  //f.执行HttpClient的execute()方法获取HttpResponse对象          
  42.             if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
  43.             {  
  44.                     HttpEntity het = response.getEntity(); //g.执行HttpResponse的getEntity方法,获取HttpEntity对象  
  45.                     InputStream is= het.getContent(); //h.执行HttpEntity的getContent方法,获取对应的输入流  
  46.                     BufferedReader br = new BufferedReader(new InputStreamReader(is));
  47.                                                     //i.读取输入流中的内容,并以字符串的形式返回        
  48.                     String readLine = null;  
  49.                     while((readLine = br.readLine()) != null )  
  50.                     {  
  51.                             result=result+readLine;  
  52.                     }  
  53.                     is.close();  
  54.             }  
  55.             else  
  56.             {  
  57.                 result="error";  
  58.             }  
  59.         } catch (IOException e) {  
  60.             e.printStackTrace();  
  61.     //      System.out.println(e.getMessage()); //调试:打印异常日志  
  62.             result="Exception";  
  63.         }  
  64.   
  65.         return result;//返回服务器响应传递回来的结果  
  66.     }  
  67. }  
(4)AndroidMainfest.xml:修改配置清单文件
    ◆添加网络访问权限(重要): <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
    ◆注册personActivity组件:<activity    android:name=".personalActivity" > 
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.http_client"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
  7.     <uses-sdk  
  8.         android:minSdkVersion="8"  
  9.         android:targetSdkVersion="21" />  
  10.   
  11.     <application  
  12.         android:allowBackup="true"  
  13.         android:icon="@drawable/ic_launcher"  
  14.         android:label="@string/app_name"  
  15.         android:theme="@style/AppTheme" >  
  16.         <activity  
  17.             android:name=".LoginActivity"  
  18.             android:label="@string/app_name" >  
  19.             <intent-filter>  
  20.                 <action android:name="android.intent.action.MAIN" />  
  21.   
  22.                 <category android:name="android.intent.category.LAUNCHER" />  
  23.             </intent-filter>  
  24.         </activity>  
  25.           
  26.         <activity    android:name=".personalActivity" >  
  27.         </activity>  
  28.     </application>  
  29.   
  30. </manifest> 

4.注意事项
(1)Tomcat已启动,并且Java Web程序已部署到Tomcat服务器中;    
(2)客户端访问服务端的URL要正确,在此为http://10.0.2.2:8080/login/LoginServlet而不是Java Web中的http://localhost:8080/login/LoginServlet。因为模拟机通过127.0.0.1访问的是模拟器本身。在模拟器上访问安装模拟器的电脑,需要使用android内置的IP:10.0.2.2。10.0.2.2 是模拟器设置的特定ip,是你的电脑的别名,如果是网络服务器,可直接写相应的IP或网址;      
(3)需要在清单文件中添加访问网络的权限;   
     <uses-permission android:name="android.permission.INTERNET"></uses-permission>  
(4)不能直接访问网络,需进行相应处理,建议采用消息传递机制;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。