- 浏览: 325598 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xuanyuanxiaoxue:
...
Android - LayoutInflater -
柴兴博:
不错 多谢
Android 悬浮Activity并可拖动(访悬浮歌词) -
di1984HIT:
写的很好,我收藏一下。
java之动态代理模式(JDK和cglib) -
chinacssnj:
待测试,明天测,测试的结果发给大家
网络开发上传文件到服务器 -
fx_199182:
...
Android之MediaPlayer
Android中提供的HttpURLConnection和HttpClient接口可以用来开发HTTP程序。以下是本人在学习中的总结与归纳。
1. HttpURLConnection接口
首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。因此,在编程之前,应当首先明确使用的请求方法,然后再根据所使用的方式选择相应的编程方式。
HttpURLConnection是继承于URLConnection类,二者都是抽象类。其对象主要通过URL的openConnection方法获得。创建方法如下代码所示:
URL url = new URL("http://www.51cto.com/index.jsp?par=123456"); HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
通过以下方法可以对请求的属性进行一些设置,如下所示
//设置输入和输出流 urlConn.setDoOutput(true); urlConn.setDoInput(true); //设置请求方式为POST urlConn.setRequestMethod("POST"); //POST请求不能使用缓存 urlConn.setUseCaches(false); //关闭连接 urlConn.disConnection();
Manifest文件中权限的设定:
<uses-permission android:name="android.permission.INTERNET" />
HttpURLConnection默认使用GET方式,例如下面代码所示:
//以Get方式上传参数 public class Activity03 extends Activity { private final String DEBUG_TAG = "Activity03"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.http); TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP); //http地址"?par=abcdefg"是我们上传的参数 String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=abcdefg"; //获得的数据 String resultData = ""; URL url = null; try { //构造一个URL对象 url = new URL(httpUrl); } catch (MalformedURLException e) { Log.e(DEBUG_TAG, "MalformedURLException"); } if (url != null) { try { // 使用HttpURLConnection打开连接 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //得到读取的内容(流) InputStreamReader in = new InputStreamReader(urlConn.getInputStream()); // 为输出创建BufferedReader BufferedReader buffer = new BufferedReader(in); String inputLine = null; //使用循环来读取获得的数据 while (((inputLine = buffer.readLine()) != null)) { //我们在每一行后面加上一个"\n"来换行 resultData += inputLine + "\n"; } //关闭InputStreamReader in.close(); //关闭http连接 urlConn.disconnect(); //设置显示取得的内容 if ( resultData != null ) { mTextView.setText(resultData); } else { mTextView.setText("读取的内容为NULL"); } } catch (IOException e) { Log.e(DEBUG_TAG, "IOException"); } } else { Log.e(DEBUG_TAG, "Url NULL"); } }
如果需要使用POST方式,则需要setRequestMethod设置。代码如下:
//以post方式上传参数 public class Activity04 extends Activity { private final String DEBUG_TAG = "Activity04"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.http); TextView mTextView = (TextView)this.findViewById(R.id.TextView_HTTP); //http地址"?par=abcdefg"是我们上传的参数 String httpUrl = "http://192.168.1.110:8080/httpget.jsp"; //获得的数据 String resultData = ""; URL url = null; try { //构造一个URL对象 url = new URL(httpUrl); } catch (MalformedURLException e) { Log.e(DEBUG_TAG, "MalformedURLException"); } if (url != null) { try { // 使用HttpURLConnection打开连接 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); //因为这个是post请求,设立需要设置为true urlConn.setDoOutput(true); urlConn.setDoInput(true); // 设置以POST方式 urlConn.setRequestMethod("POST"); // Post 请求不能使用缓存 urlConn.setUseCaches(false); urlConn.setInstanceFollowRedirects(true); // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的 urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成, // 要注意的是connection.getOutputStream会隐含的进行connect。 urlConn.connect(); //DataOutputStream流 DataOutputStream out = new DataOutputStream(urlConn.getOutputStream()); //要上传的参数 String content = "par=" + URLEncoder.encode("ABCDEFG", "gb2312"); //将要上传的内容写入流中 out.writeBytes(content); //刷新、关闭 out.flush(); out.close(); //获取数据 BufferedReader reader = new BufferedReader(new InputStreamReader(urlConn.getInputStream())); String inputLine = null; //使用循环来读取获得的数据 while (((inputLine = reader.readLine()) != null)) { //我们在每一行后面加上一个"\n"来换行 resultData += inputLine + "\n"; } reader.close(); //关闭http连接 urlConn.disconnect(); //设置显示取得的内容 if ( resultData != null ) { mTextView.setText(resultData); } else { mTextView.setText("读取的内容为NULL"); } } catch (IOException e) { Log.e(DEBUG_TAG, "IOException"); } } else { Log.e(DEBUG_TAG, "Url NULL"); } } }
2. HttpClient接口
使用Apache提供的HttpClient接口同样可以进行HTTP操作。
对于GET和POST请求方法的操作有所不同。GET方法的操作代码示例如下:
public class Activity02 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.http); TextView mTextView = (TextView) this.findViewById(R.id.TextView_HTTP); // http地址 String httpUrl = "http://192.168.1.110:8080/httpget.jsp?par=HttpClient_android_Get"; //HttpGet连接对象 HttpGet httpRequest = new HttpGet(httpUrl); try { //取得HttpClient对象 HttpClient httpclient = new DefaultHttpClient(); //请求HttpClient,取得HttpResponse HttpResponse httpResponse = httpclient.execute(httpRequest); //请求成功 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { //取得返回的字符串 String strResult = EntityUtils.toString(httpResponse.getEntity()); mTextView.setText(strResult); } else { mTextView.setText("请求错误!"); } } catch (ClientProtocolException e) { mTextView.setText(e.getMessage().toString()); } catch (IOException e) { mTextView.setText(e.getMessage().toString()); } catch (Exception e) { mTextView.setText(e.getMessage().toString()); } } }
使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数,另外,还需要设置所使用的字符集。代码如下所示:
public class Activity03 extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.http); TextView mTextView = (TextView) this.findViewById(R.id.TextView_HTTP); // http地址 String httpUrl = "http://192.168.1.110:8080/httpget.jsp"; //HttpPost连接对象 HttpPost httpRequest = new HttpPost(httpUrl); //使用NameValuePair来保存要传递的Post参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); //添加要传递的参数 params.add(new BasicNameValuePair("par", "HttpClient_android_Post")); try { //设置字符集 HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312"); //请求httpRequest httpRequest.setEntity(httpentity); //取得默认的HttpClient HttpClient httpclient = new DefaultHttpClient(); //取得HttpResponse HttpResponse httpResponse = httpclient.execute(httpRequest); //HttpStatus.SC_OK表示连接成功 if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { //取得返回的字符串 String strResult = EntityUtils.toString(httpResponse.getEntity()); mTextView.setText(strResult); } else { mTextView.setText("请求错误!"); } } catch (ClientProtocolException e) { mTextView.setText(e.getMessage().toString()); } catch (IOException e) { mTextView.setText(e.getMessage().toString()); } catch (Exception e) { mTextView.setText(e.getMessage().toString()); } } }
HttpClient实际上是对Java提供方法的一些封装,在HttpURLConnection中的输入输出流操作,在这个接口中被统一封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。
另外,在使用POST方式进行传输时,需要进行字符编码。
评论
发表评论
-
Android中AsyncTask的简单用法
2012-01-13 16:00 1127在开发Android移动客户端的时候往往要使用多线程来进行操 ... -
Android应用的自动升级、更新模块的实现 .
2011-11-16 14:01 647http://www.eoeandroid.com/threa ... -
一个APK反编译利器Apktool
2011-11-16 13:54 1557一个APK反编译利器Apktool APK 本地化 ... -
自定义Android标题栏TitleBar布局
2011-11-14 14:13 1218很多网友发现自己Android程序的标题栏TitleBar区域 ... -
Android GPS获取地理位置 .
2011-11-14 14:11 829import android.app.Activity; i ... -
android ListView详解
2011-11-14 13:48 1026在android开发中ListView是比较常用的组件,它以列 ... -
Android之Content provider 详解
2011-11-14 13:35 2437Android是如何实现应用程序之间数据共享的?一个应用程序可 ... -
Android源码地址
2011-11-12 19:14 1027http://blog.csdn.net/ilittleone ... -
android之File
2011-11-11 22:39 19701:Fileservice package cn.itcas ... -
Android知识补漏
2011-11-09 22:33 01:AndroidManifiest.xml < ... -
深入剖析Android消息机制
2011-11-09 14:13 935在Android中,线程内部或者线程之间进行信息交互时经常会使 ... -
Android之Handler详解(四)
2011-11-09 14:00 1263d、自己创建新的线程,然后在新线程中创建Looper,主线程调 ... -
Android之Handler详解(三)
2011-11-09 13:58 1349c、将消息队列绑定到子线程上,主线程只管通过Handl ... -
Android之Handler详解(二)
2011-11-09 13:54 1635二:sendMessage版本的Handl ... -
Android之Handler详解(一)
2011-11-09 13:22 2270一个Handler允许你发送和处理消息(Message)以及 ... -
关于StartActivityForResult方法的使用
2011-10-31 17:11 1058根据方法名可知 这个方法是要得到启动后的Activity返回的 ... -
Android 悬浮Activity并可拖动(访悬浮歌词)
2011-10-24 16:23 2053天天动听, 这款Android手机上的音乐播放器,相信不少朋友 ... -
Android GWES
2011-10-24 16:13 1158第八章 Android GWES 8.1 View Syst ... -
Android系统服务-WindowManager
2011-10-24 16:10 1416WindowManager是Android中一个重要的服务 ... -
http通信
2011-10-15 17:31 1068HTTP(HyperText Transfer Proto ...
相关推荐
Android网络编程Android网络编程Android网络编程Android网络编程Android网络编程Android网络编程Android网络编程Android网络编程
本资料详细介绍了android如何应用socket进行网络编程,详细介绍了android用socket进行聊天室开发,包含服务器端与Android客户端的开发过程介绍,开有详细代码及解释说明,非常适应android网络编程初学者或教师教学...
android 网络编程基础;android 网络编程基础;android 网络编程基础
Android 网络编程入门之图片下载,搭建Tomcat作为服务器,下载网络图片。
Android网络编程Demo 此Demo博客地址:http://blog.csdn.net/u012814441/article/details/49643865
android 网络编程详解代码第3章(网络下的XML解析和生成)
android网络编程访问网络,http传输数据,浏览网页,蓝牙通信
Dive_Into_Android_Networking-_Adding_Ethernet_Connectivity 初学者入门介绍
android网络编程面试题,Android面试题整理
这是一本Android网络编程方面的专著,旨在帮助开发者们高效地编写出高质量的Android网络应用。不仅系统讲解了Android网络编程的各项核心技术和功能模块,通过多个案例解读了Android网络编程的方法和技巧,而且从源码...
这是关于安卓网络开发的一些源代码,是相关博客文章讲到的
android网络编程
Android网络编程
android 网络编程详解代码第7章(android的Socket编程)
Android网路编程代码 设计客户端和服务器端通信 适合初学者学习 当然其中包括很多其他知识点 例如基于handler的主副线程通信机制 多线程应用等 另外 对于Android入门的学习者 也是一手极好的学习资料 下载即可运行 ...
android网络编程包说明 呵呵 希望对你们有帮助
url方式获取网络数据展示,并且下载文件解压文件,并且提供浏览SD卡文件并且上传文件。包括服务器端。
Android网络编程之Http通信,使用了http和jason