【Android笔记】Android开发之Http通信HttpURLConnection接口

HttpURLConnection接口

Http通信协议中,使用的最多的就是Get和Post。

Get请求可以获取静态页面,也可以把参数放在字串后面,传递给服务器。

Post与Get不同的是Post的参数不是放在URL字串的里面,而是放在http请求数据中。

HttpURLConnection是JAVA的标准类,继承自URLConnection类;

HttpURLConnection和URLConnection类都是抽象类,无法直接实例化对象。

其对象主要是通过URL的openConnection方法获得。

 

实例定义代码:

1 //构造一个URL对象
2 url = new URL(httpUrl);
3 //使用HttpURLConnection打开链接,urlConn就是实例对象
4 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

openConnection方法只是创建了一个HttpURLConnection或者URLConnection的实例,并不进行真正的链接操作。

每次openConnection的时候都将创建一个新的实例。

因此在连接之前可以对该对象的属性进行设置。

1 //设置输入(输出)流
2                 urlConn.setDoOutput(true);
3                 urlConn.setDoInput(true);
4                 //设置以POST方式
5                 urlConn.setRequestMethod("POST");
6                 //POST请求不能使用缓存
7                 urlConn.setUseCaches(false);
8 //在连接完成之后可以关闭这个连接
9                 urlConn.disconnect();

利用Get和Post方式来获取一个网页内容。

HttpURLConnection默认使用Get方式,如果要使用Post方式,则需要setRequestMethod设置。然后将我们要传递的参数内容通过weiteBytes方法写入数据流。

 

Get方式访问无参数的代码:

 1 /*
 2  *  HttpURLConnectionActivity02.java
 3  *  北京Android俱乐部群:167839253
 4  *  Created on: 2012-5-9
 5  *  Author: blueeagle
 6  *  Email: [email protected]
 7  */
 8 
 9 public class HttpURLConnectionActivity02 extends Activity {
10     /** Called when the activity is first created. */
11     
12     private final String DEBUG_TAG = "HttpURLConnectionActivityActivity";
13     @Override
14     public void onCreate(Bundle savedInstanceState)    {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.main);        
17         TextView mTextView = (TextView)this.findViewById(R.id.myTextView);
18         //http地址
19         String httpUrl = "http://10.1.69.34/http1.jsp";
20         //获得的数据
21         String resultData = "";
22         URL url = null;
23         try
24         {
25             //构造一个URL对象
26             url = new URL(httpUrl); 
27         }
28         catch (MalformedURLException e)
29         {
30             Log.e(DEBUG_TAG, "MalformedURLException");
31         }
32         if (url != null)
33         {
34             try
35             {
36                 //使用HttpURLConnection打开连接
37                 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
38                 //得到读取的内容(流)
39                 InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
40                 // 为输出创建BufferedReader
41                 BufferedReader buffer = new BufferedReader(in);
42                 String inputLine = null;
43                 //使用循环来读取获得的数据
44                 while (((inputLine = buffer.readLine()) != null))
45                 {
46                     //我们在每一行后面加上一个"\n"来换行
47                     resultData += inputLine + "\n";
48 
49                 }    
50                 
51                 if ( !resultData.equals("") )
52                 {
53                     mTextView.setText(resultData);
54                 }
55                 else
56                 {
57                     mTextView.setText("读取的内容为NULL");
58                 }
59                 //关闭InputStreamReader
60                 in.close();
61                 //关闭http连接
62                 urlConn.disconnect();
63                 //设置显示取得的内容
64 
65             }
66             catch (IOException e)
67             {
68                 Log.e(DEBUG_TAG, "IOException");
69             }
70         }
71         else
72         {
73             Log.e(DEBUG_TAG, "Url NULL");
74         }
75         //设置按键事件监听
76         Button button_Back = (Button) findViewById(R.id.Button_back);
77         /* 监听button的事件信息 */
78         button_Back.setOnClickListener(new Button.OnClickListener() 
79         {
80             public void onClick(View v)
81             {
82                 /* 新建一个Intent对象 */
83                 Intent intent = new Intent();
84                 /* 指定intent要启动的类 */
85                 intent.setClass(HttpURLConnectionActivity02.this, HttpURLConnectionActivity.class);
86                 /* 启动一个新的Activity */
87                 startActivity(intent);
88                 /* 关闭当前的Activity */
89                 HttpURLConnectionActivity02.this.finish();
90             }
91         });
92     }     
93 }

POST方式访问服务器,以及访问服务器端图片并显示在客户端。

代码如下:

  1 /*
  2  *  HttpURLConnectionActivity02.java
  3  *  北京Android俱乐部群:167839253
  4  *  Created on: 2012-5-9
  5  *  Author: blueeagle
  6  *  Email: [email protected]
  7  */
  8 
  9 public class HttpURLConnectionActivity03 extends Activity {
 10     /** Called when the activity is first created. */
 11     private final String DEBUG_TAG = "Activity03";
 12     private Bitmap bmp;
 13     @Override
 14     public void onCreate(Bundle savedInstanceState)    {
 15         super.onCreate(savedInstanceState);
 16         setContentView(R.layout.main);        
 17         TextView mTextView = (TextView)this.findViewById(R.id.myTextView);
 18         ImageView mImageView = (ImageView)this.findViewById(R.id.bmp);
 19         //http地址
 20         String httpUrl = "http://10.1.69.34/http1.jsp";
 21         //获得的数据
 22         String resultData = "";
 23         URL url = null;
 24         try
 25         {
 26             //构造一个URL对象
 27             url = new URL(httpUrl); 
 28         }
 29         catch (MalformedURLException e)
 30         {
 31             Log.e(DEBUG_TAG, "MalformedURLException");
 32         }
 33         if (url != null)
 34         {
 35             try
 36             {
 37                 //使用HttpURLConnection打开链接
 38                 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
 39 //********************************Post方式不同的地方*************************************//
 40                 //因为这个是post请求,需要设置为true
 41                 urlConn.setDoOutput(true);
 42                 urlConn.setDoInput(true);
 43                 //设置以POST方式
 44                 urlConn.setRequestMethod("POST");
 45                 //POST请求不能使用缓存
 46                 urlConn.setUseCaches(false);
 47                 urlConn.setInstanceFollowRedirects(true);
 48                 
 49                 //配置本次连接的Content_type,配置为application/x-www-form-urlencoded
 50                 urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
 51                 //连接,从postUrl.OpenConnection()至此的配置必须要在connect之前完成。
 52                 //要注意的是connection.getOutputStream会隐含地进行connect.
 53 //********************************Post方式不同的地方*************************************//
 54                 urlConn.connect();
 55                 //DataOutputStream流。
 56                 DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
 57                 //要上传的参数
 58                 String content = "par=" + URLEncoder.encode("ABCDEF","gb2312");
 59                 //将要上传的内容写入流中
 60                 out.writeBytes(content);
 61                 //刷新、关闭
 62                 out.flush();
 63                 out.close();
 64                 //获取数据
 65                 BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
 66                 String inputLine = null;
 67                 
 68                 //---///得到读取的内容(流)
 69                 //---InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
 70                 //---// 为输出创建BufferedReader
 71                 //---BufferedReader buffer = new BufferedReader(in);
 72                 //---String inputLine = null;
 73                 //---//使用循环来读取获得的数据
 74                 while (((inputLine = reader.readLine()) != null))
 75                 {
 76                     //我们在每一行后面加上一个"\n"来换行
 77                     resultData += inputLine + "\n";
 78 
 79                 }    
 80                 reader.close();
 81                 //关闭http链接
 82                 urlConn.disconnect();
 83                 //设置显示取得的内容
 84                 
 85                 if ( !resultData.equals("") )
 86                 {
 87                     mTextView.setText(resultData);
 88                     bmp = this.GetNetBitmap("http://10.1.69.34/0.jpg");
 89                     mImageView.setImageBitmap(bmp);
 90                 }
 91                 else
 92                 {
 93                     mTextView.setText("读取的内容为空");
 94                 }
 95                 //关闭InputStreamReader
 96                 reader.close();
 97                 //关闭http连接
 98                 urlConn.disconnect();
 99                 //设置显示取得的内容
100 
101             }
102             catch (IOException e)
103             {
104                 Log.e(DEBUG_TAG, "IOException");
105             }
106         }
107         else
108         {
109             Log.e(DEBUG_TAG, "Url NULL");
110         }
111         //设置按键事件监听
112         Button button_Back = (Button) findViewById(R.id.Button_back);
113         /* 监听button的事件信息 */
114         button_Back.setOnClickListener(new Button.OnClickListener() 
115         {
116             public void onClick(View v)
117             {
118                 /* 新建一个Intent对象 */
119                 Intent intent = new Intent();
120                 /* 指定intent要启动的类 */
121                 intent.setClass(HttpURLConnectionActivity03.this, HttpURLConnectionActivity.class);
122                 /* 启动一个新的Activity */
123                 startActivity(intent);
124                 /* 关闭当前的Activity */
125                 HttpURLConnectionActivity03.this.finish();
126             }
127         });
128     }
129   //********************************获取网络图片(支持bmp,jpg,png,gif等格式,但是bmp格式支持的比较小)*************************************//    
130     public Bitmap GetNetBitmap(String url){
131         URL imageUrl = null;
132         Bitmap bitmap = null;
133         try{
134             imageUrl = new URL(url);
135         }
136         catch(MalformedURLException e){
137             Log.e(DEBUG_TAG, e.getMessage());
138         }
139         try{
140             HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection();
141             conn.setDoInput(true);
142             conn.connect();
143             //将得到的数据转换成InputStream
144             InputStream is = conn.getInputStream();
145             //将InputStream 转换成Bitmap
146             bitmap = BitmapFactory.decodeStream(is);
147             is.close();
148         }
149         catch(IOException e){
150             Log.e(DEBUG_TAG, e.getMessage());
151         }
152         return bitmap;
153         
154     }
155 }

总结:

针对HTTP协议,简单来说:

GET方式是通过把参数键值对附加在url后面来传递的,是文本方式的。

在服务器端可以从‘QUERY_STRING‘这个变量中直接读取,效率较高,但缺乏安全性,也无法来处理复杂的数据,长度有限制。主要用于传递简单的参数。

POST方式:就传输方式讲参数会被打包在http报头中传输,可以是二进制的。
从CONTENT_LENGTH这个环境变量中读取,便于传送较大一些的数据,同时因为不暴露数据在浏览器的地址栏中,安全性相对较高,但这样的处理效率会受到影响。

参考原文:http://blog.csdn.net/redoffice/article/details/7552137

 

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