Android http请求代码

前言,Android的网络通信的方式有两种:使用Socket或者HTTP,今天这一篇我们详细讲解使用HTTP实现的网络通信,HTTP又包括两种方式编程方式:
(1)HttpUrlConnection;
(2)HttpClient;
   好了,我们直接进行讲解,当然之前也会有一部分有关Android网络通信的其他知识,我们也应该了解。


一.获取网络状态的方法
(1)MainActivity.java中的关键代码


//网络管理类,可以判断是否能上网,以及网络类型
       
[java] view plain copy
  1. ConnectivityManager cm=(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);  
  2.        NetworkInfo info=cm.getActiveNetworkInfo();  
  3.        if(info!=null){  
  4.            Toast.makeText(MainActivity.this"连网正常"+info.getTypeName(), Toast.LENGTH_SHORT).show();  
  5.        }else{  
  6.            Toast.makeText(MainActivity.this"未连网", Toast.LENGTH_SHORT).show();  
  7.        }  

(2)注意:一定要在主配置文件中增加这个权限
   它是application的兄弟标签:

[java] view plain copy
  1. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  

(3)OK,我们看一下我们的设备的上网状态和类型吧:
Android http请求代码_第1张图片

二.使用URL访问网页源码
(1)MainActivity.java:

[java] view plain copy
  1. package com.example.l0903_urldata;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import android.app.Activity;  
  9. import android.os.Bundle;  
  10. /** 
  11.  * 访问网页源码 
  12.  * @author asus 
  13.  * 
  14.  */  
  15. public class MainActivity extends Activity {  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.activity_main);  
  20.         try {  
  21.             //访问百度的html文件的源码  
  22.             InputStream is=new URL("http://www.baidu.com").openStream();  
  23.             //读取数据的包装流  
  24.             BufferedReader br=new BufferedReader(new InputStreamReader(is));  
  25.             //str用于读取一行数据  
  26.             String str=null;  
  27.             //StringBuffer用于存储所欲数据  
  28.             StringBuffer sb=new StringBuffer();  
  29.             while((str=br.readLine())!=null){  
  30.                 sb.append(str);  
  31.             }  
  32.             System.out.println(sb.toString());  
  33.         } catch (MalformedURLException e) {  
  34.             e.printStackTrace();  
  35.         } catch (IOException e) {  
  36.             e.printStackTrace();  
  37.         }  
  38.     }  
  39. }  


(2)注意:有关网络的操作都需要在主配置文件里添加下面这个权限:

[java] view plain copy
  1. <uses-permission android:name="android.permission.INTERNET"/>  

三.WebView 控件的简单使用

[java] view plain copy
  1. package com.example.l0903_webview;  
  2. import android.app.Activity;  
  3. import android.os.Bundle;  
  4. import android.webkit.WebView;  
  5. /** 
  6.  * 就是一个浏览器控件 
  7.  * 其实没什么用 
  8.  * @author asus 
  9.  * 
  10.  */  
  11. public class MainActivity extends Activity {  
  12.     private WebView wv;  
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.activity_main);  
  17.         wv=(WebView) findViewById(R.id.webView1);  
  18.         //WebView控件的方法,loadUrl用于加载指定的网络地址  
  19.         wv.loadUrl("http://www.baidu.com");  
  20.     }  
  21. }  


   运行效果:
Android http请求代码_第2张图片



四.使用HttpUrlConnection的编写方式实现Android的网络通信
1.首先,自己先搭建一个服务器:
Android http请求代码_第3张图片
http://img1.51cto.com/attachment/201309/192401808.jpg


2.下面是客户端的事了:
(1)通过get方式:
   MainActivity.java:

[java] view plain copy
  1. package com.example.l0903_httpurlcnectionget;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.MalformedURLException;  
  8. import java.net.URL;  
  9. import android.app.Activity;  
  10. import android.os.Bundle;  
  11. import android.view.View;  
  12. import android.view.View.OnClickListener;  
  13. import android.widget.EditText;  
  14. import android.widget.TextView;  
  15. /** 
  16.  * 通过Get方法获取服务器的数据 
  17.  * 直接在地址中用"?+键值+value"的方式来使用 
  18.  * 所以传递的参数直接显示出来,不安全 
  19.  * @author asus 
  20.  * 
  21.  */  
  22. public class MainActivity extends Activity {  
  23.     private HttpURLConnection conn;  
  24.     private URL url;  
  25.     private InputStream is;  
  26.     private TextView tv;  
  27.     private EditText et;  
  28.     private String name;  
  29.     @Override  
  30.     protected void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         tv=(TextView) findViewById(R.id.textView1);  
  34.         et=(EditText) findViewById(R.id.editText1);  
  35.         findViewById(R.id.button1).setOnClickListener(new OnClickListener() {  
  36.                                                                                                                                                 
  37.             @Override  
  38.             public void onClick(View v) {  
  39.                 name=et.getText().toString();  
  40.                 //定义访问的服务器地址,10.0.2.2是Android的访问的本地服务器地址  
  41.                 String urlDate="http://10.0.2.2:8080/My_Service/webdate.jsp?name="+name;  
  42.                 try {  
  43.                     //封装访问服务器的地址  
  44.                     url=new URL(urlDate);  
  45.                     try {  
  46.                         //打开对服务器的连接  
  47.                         conn=(HttpURLConnection) url.openConnection();  
  48.                         //连接服务器  
  49.                         conn.connect();  
  50.                         /**读入服务器数据的过程**/  
  51.                         //得到输入流  
  52.                         is=conn.getInputStream();  
  53.                         //创建包装流  
  54.                         BufferedReader br=new BufferedReader(new InputStreamReader(is));  
  55.                         //定义String类型用于储存单行数据  
  56.                         String line=null;  
  57.                         //创建StringBuffer对象用于存储所有数据  
  58.                         StringBuffer sb=new StringBuffer();  
  59.                         while((line=br.readLine())!=null){  
  60.                             sb.append(line);  
  61.                         }  
  62.                         //用TextView显示接收的服务器数据  
  63.                         tv.setText(sb.toString());  
  64.                         System.out.println(sb.toString());  
  65.                     } catch (IOException e) {  
  66.                         e.printStackTrace();  
  67.                     }  
  68.                 } catch (MalformedURLException e) {  
  69.                     e.printStackTrace();  
  70.                 }  
  71.             }  
  72.         });  
  73.     }  
  74. }  


   权限(同上面第二个,所有与网络有关的操作都需要添加,下面的就不再赘述了)
   运行效果:
Android http请求代码_第4张图片



(2)通过post方式(安全)
MainActivity.java

[java] view plain copy
  1. package com.example.l0903_httpurlconectionpost;  
  2. import java.io.BufferedReader;  
  3. import java.io.DataOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.io.OutputStream;  
  8. import java.net.HttpURLConnection;  
  9. import java.net.MalformedURLException;  
  10. import java.net.URL;  
  11. import java.net.URLEncoder;  
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14. import android.view.View;  
  15. import android.view.View.OnClickListener;  
  16. import android.widget.EditText;  
  17. import android.widget.TextView;  
  18. /** 
  19.  * 通过Post方法传递参数 
  20.  * 安全 
  21.  * @author asus 
  22.  * 
  23.  */  
  24. public class MainActivity extends Activity {  
  25.     private HttpURLConnection conn;  
  26.     private URL url;  
  27.     private InputStream is;  
  28.     private OutputStream os;  
  29.     private EditText et;  
  30.     private TextView tv;  
  31.     @Override  
  32.     protected void onCreate(Bundle savedInstanceState) {  
  33.         super.onCreate(savedInstanceState);  
  34.         setContentView(R.layout.activity_main);  
  35.         et=(EditText) findViewById(R.id.editText1);  
  36.         tv=(TextView) findViewById(R.id.tv);  
  37.         findViewById(R.id.button1).setOnClickListener(new OnClickListener() {  
  38.                                                                                      
  39.             @Override  
  40.             public void onClick(View v) {  
  41.                 // TODO Auto-generated method stub  
  42.                 String urlDate="http://10.0.2.2:8080/My_Service/webdate.jsp";  
  43.                 try {  
  44.                     url=new URL(urlDate);  
  45.                     try {  
  46.                         //打开服务器  
  47.                         conn=(HttpURLConnection) url.openConnection();  
  48.                         //设置输入输出流  
  49.                         conn.setDoOutput(true);  
  50.                         conn.setDoInput(true);  
  51.                         //设置请求的方法为Post  
  52.                         conn.setRequestMethod("POST");  
  53.                         //Post方式不能缓存数据,则需要手动设置使用缓存的值为false  
  54.                         conn.setUseCaches(false);  
  55.                         //连接数据库  
  56.                         conn.connect();  
  57.                         /**写入参数**/  
  58.                         os=conn.getOutputStream();  
  59.                         //封装写给服务器的数据(这里是要传递的参数)  
  60.                         DataOutputStream dos=new DataOutputStream(os);  
  61.                         //写方法:name是key值不能变,编码方式使用UTF-8可以用中文  
  62.                         dos.writeBytes("name="+URLEncoder.encode(et.getText().toString(), "UTF-8"));  
  63.                         //关闭外包装流  
  64.                         dos.close();  
  65.                         /**读服务器数据**/  
  66.                         is=conn.getInputStream();  
  67.                         BufferedReader br=new BufferedReader(new InputStreamReader(is));  
  68.                         String line=null;  
  69.                         StringBuffer sb=new StringBuffer();  
  70.                         while((line=br.readLine())!=null){  
  71.                             sb.append(line);  
  72.                         }  
  73.                         tv.setText(sb.toString());  
  74.                         System.out.println(sb.toString());  
  75.                     } catch (IOException e) {  
  76.                         e.printStackTrace();  
  77.                     }  
  78.                 } catch (MalformedURLException e) {  
  79.                     e.printStackTrace();  
  80.                 }  
  81.             }  
  82.         });  
  83.                                                                              
  84.     }  
  85. }  


五.使用HttpClient的编写方式实现Android的网络通信
1.服务器同上;
2.使用get的方式:

[java] view plain copy
  1. package com.example.l0903_http_get;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import org.apache.http.HttpEntity;  
  7. import org.apache.http.HttpResponse;  
  8. import org.apache.http.client.ClientProtocolException;  
  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. public class MainActivity extends Activity {  
  15.     private HttpGet get;  
  16.     private HttpClient cliet;  
  17.     private HttpResponse response;  
  18.     private HttpEntity entity;  
  19.     private InputStream is;  
  20.     @Override  
  21.     protected void onCreate(Bundle savedInstanceState) {  
  22.         super.onCreate(savedInstanceState);  
  23.         setContentView(R.layout.activity_main);  
  24.         get=new HttpGet("http://10.0.2.2:8080/My_Service/webdate.jsp?name=ooooooo");  
  25.         cliet=new DefaultHttpClient();  
  26.         try {  
  27.             response=cliet.execute(get);  
  28.             entity=response.getEntity();  
  29.             is=entity.getContent();  
  30.             BufferedReader br=new BufferedReader(new InputStreamReader(is));  
  31.             String line=null;  
  32.             StringBuffer sb=new StringBuffer();  
  33.             while((line=br.readLine())!=null){  
  34.                 sb.append(line);  
  35.             }  
  36.             System.out.println(sb.toString());  
  37.         } catch (ClientProtocolException e) {  
  38.             e.printStackTrace();  
  39.         } catch (IOException e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.                                                   
  43.     }  
  44. }  


3.使用post的方式:

[java] view plain copy
  1. package com.example.l0903_http_post;  
  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.client.ClientProtocolException;  
  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. public class MainActivity extends Activity {  
  20.     //创建请求对象  
  21.     private HttpPost post;  
  22.     //创建客户端对象  
  23.     private HttpClient cliet;  
  24.     //创建发送请求的对象  
  25.     private HttpResponse response;  
  26.     //  
  27.     private UrlEncodedFormEntity urlEntity;  
  28.     //创建接收返回数据的对象  
  29.     private HttpEntity entity;  
  30.     //创建流对象  
  31.     private InputStream is;  
  32.     @Override  
  33.     protected void onCreate(Bundle savedInstanceState) {  
  34.         super.onCreate(savedInstanceState);  
  35.         setContentView(R.layout.activity_main);  
  36.         //包装请求的地址  
  37.         post=new HttpPost("http://10.0.2.2:8080/My_Service/webdate.jsp");  
  38.         //创建默认的客户端对象  
  39.         cliet=new DefaultHttpClient();  
  40.         //用list封装要向服务器端发送的参数  
  41.         List<BasicNameValuePair> pairs=new ArrayList<BasicNameValuePair>();  
  42.         pairs.add(new BasicNameValuePair("name""llllllllll"));  
  43.         try {  
  44.             //用UrlEncodedFormEntity来封装List对象  
  45.             urlEntity=new UrlEncodedFormEntity(pairs);  
  46.             //设置使用的Entity  
  47.             post.setEntity(urlEntity);  
  48.             try {  
  49.                 //客户端开始向指定的网址发送请求  
  50.                 response=cliet.execute(post);  
  51.                 //获得请求的Entity  
  52.                 entity=response.getEntity();  
  53.                 is=entity.getContent();  
  54.                 //下面是读取数据的过程  
  55.                 BufferedReader br=new BufferedReader(new InputStreamReader(is));  
  56.                 String line=null;  
  57.                 StringBuffer sb=new StringBuffer();  
  58.                 while((line=br.readLine())!=null){  
  59.                     sb.append(line);  
  60.                 }  
  61.                 System.out.println(sb.toString());  
  62.             } catch (ClientProtocolException e) {  
  63.                 e.printStackTrace();  
  64.             } catch (IOException e) {  
  65.                 e.printStackTrace();  
  66.             }  
  67.         } catch (UnsupportedEncodingException e) {  
  68.             e.printStackTrace();  
  69.         }  
  70.                                                
  71.                                                
  72.     }  
  73. }  


4.实现HttpClient通信与AsyncTask异步机制的结合:

[java] view plain copy
  1. package com.example.l0903_http_asynctask_get;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import org.apache.http.HttpEntity;  
  7. import org.apache.http.HttpResponse;  
  8. import org.apache.http.client.ClientProtocolException;  
  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.app.ProgressDialog;  
  14. import android.os.AsyncTask;  
  15. import android.os.Bundle;  
  16. import android.widget.TextView;  
  17. /** 
  18.  * 
  19.  * @author asus 
  20.  * 
  21.  */  
  22. public class MainActivity extends Activity {  
  23.     private TextView tv;// 创建请求对象  
  24.     private HttpGet httpGet;  
  25.     // 创建客户端对象  
  26.     private HttpClient httpClient;  
  27.     // 发送请求的对象  
  28.     private HttpResponse httpResponse;  
  29.     // 接收返回数据  
  30.     private HttpEntity httpEntity;  
  31.     // 创建流  
  32.     private InputStream in;  
  33.     private ProgressDialog pd;  
  34.     @Override  
  35.     protected void onCreate(Bundle savedInstanceState) {  
  36.         super.onCreate(savedInstanceState);  
  37.         setContentView(R.layout.activity_main);  
  38.         tv = (TextView) findViewById(R.id.tv);  
  39.         AsyncTask<String, Void, String> asyncTask = new AsyncTask<String, Void, String>() {  
  40.             @Override  
  41.             protected String doInString...  params) {  
  42.                 String urlstr = params[0];  
  43.                 httpGet = new HttpGet(urlstr);  
  44.                 httpClient = new DefaultHttpClient();  
  45.                 try {  
  46.                     // 向服务器端发送请求  
  47.                     httpResponse = httpClient.execute(httpGet);  
  48.                     httpEntity = httpResponse.getEntity();  
  49.                     in = httpEntity.getContent();  
  50.                     BufferedReader br = new BufferedReader(  
  51.                             new InputStreamReader(in));  
  52.                     String line = null;  
  53.                     StringBuffer sb = new StringBuffer();  
  54.                     while ((line = br.readLine()) != null) {  
  55.                         sb.append(line);  
  56.                     }  
  57.                     System.out.println(sb.toString());  
  58.                     return sb.toString();  
  59.                 } catch (ClientProtocolException e) {  
  60.                     e.printStackTrace();  
  61.                 } catch (IOException e) {  
  62.                     e.printStackTrace();  
  63.                 }  
  64.                 return null;  
  65.             }  
  66.             @Override  
  67.             protected void onPostExecute(String result) {  
  68.                 if (result != null) {  
  69.                     tv.setText(result);  
  70.                     pd.dismiss();// 消除dialog  
  71.                 }  
  72.                 super.onPostExecute(result);  
  73.             }  
  74.         };  
  75.         pd = ProgressDialog.show(this"请稍后。。。""正在请求数据");  
  76.         asyncTask.execute("http://10.0.2.2:8080/My_Service/webdate.jsp?name=haha&age=hh");  
  77.     }  
  78. }  


运行效果:

Android http请求代码_第5张图片

你可能感兴趣的:(Android http请求代码)