【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

时间: 2024-10-12 17:03:59

【Android笔记】Android开发之Http通信HttpURLConnection接口的相关文章

android控件开发之ListView

android控件开发之ListView 本文主要讲述安卓开发中的ListView控件的使用方法 java代码: package com.example.listview; import java.util.ArrayList; import java.util.HashMap; import android.app.ListActivity; import android.os.Bundle; import android.view.Menu; import android.view.View

android控件开发之progress

android控件开发之progress 本博文主要讲述的是android开发中的progress进度条的使用方法,代码如下: MainActivity.java: package com.example.progress; import android.os.Bundle; import android.R.integer; import android.app.Activity; import android.view.Menu; import android.view.View; impo

android控件开发之Radio(单选按钮)和CheckBox(多选按钮)开发

android控件开发之Radio(单选按钮)和CheckBox(多选按钮)开发 本博文主要讲述的是android开发中的单选和多选按钮的使用,具体情况请看实例代码: MainActivity.java: package com.example.radiotest; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.CheckBox; imp

Android插件化开发之Hook StartActivity方法

第一步.先爆项目demo照片,代码不多,不要怕 第二步.应该知道Java反射相关知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之Java反射机制研究 http://blog.csdn.net/u011068702/article/details/49863931 第三步.应该知道Java静态代理知识 如果不知道或者忘记的小伙伴请猛搓这里,Android插件化开发基础之静态代理模式 http://blog.csdn.net/u011068702/article/detai

android控件开发之ExpandableListActivity

android控件开发之ExpandableListActivity 本博文主要讲述的是android控件开发中的ExpandableListActivity(可扩展List)控件的简单用法. java代码: package com.example.expandablelistactivity; import java.util.ArrayList; import java.util.HashMap; import android.os.Bundle; import android.app.Li

android控件开发之Spinner控件

android控件开发之Spinner控件 概述:android中,Spinner控件主要是用来显示下拉列表,同时,用户可以选择列表中的数据,作为当前的选择 java代码: 此代码中使用了两种方法给Spinner提供数据(method 1和method 2).运行时任选其一即可 方法一: 使用的动态list的形式给Spinner提供数据 方法二: 使用的Strings.xml中定义的固定String array提供数据 根据项目需要,选择相关方法即可 package com.example.sp

Android Studio快速开发之道

概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. Postfix completion 介绍 Postfix completion 是IntelliJ IDEA很早就有的功能,该功能基于已经输入的表达式和你添加的后缀来实现另一个你想要的表达式.例如在布尔表达式之后加上后缀if就是if语句 . 常用后缀介绍 下面介绍一下个人工作中觉得比较常用的几个后缀

android控件开发之SeekBar

android控件开发之SeekBar 本博文主要讲述的是SeekBar的使用,此控件在播放器中使用时相当的广泛.下面我们直接来看看代码吧! mainActivity.java: package com.example.seekbar; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.SeekBar; public class MainAc

android控件开发之RatingBar

android控件开发之RatingBar 本博文主要讲述的RatingBar的开发,此控件主要是用做评分,评级中使用,下面我们来看看实例代码: MainActivity.java: package com.example.ratingbar; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.RatingBar; public class