热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HttpURLConnectionAndroid网络编程

                                                                                               Andro

                                                                                               Android网络编程HttpURLConnection

      大部分andriod应用需要与服务器进行数据交互,HTTP、FTP、SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议。
      本文并不针对HTTP协议的具体内容,仅探讨android开发中使用HTTP协议访问网络的两种方式——HttpURLConnectionHttpClient

1、标准Java接口(java.NET) ----HttpURLConnection,可以实现简单的基于URL请求、响应功能;

2、Apache接口(org.appache.http)----HttpClient,使用起来更方面更强大。一般来说,用这种接口。但它它是基于第一种底层实现的。


URL请求的类别


分为二类,GET与POST请求。二者的区别在于: 

  1
、 get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, 

  2
、post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。

HttpURLConnection

      HttpURLConnection继承自URLConnection类,用它可以发送和接口任何类型和长度的数据,且预先不用知道数据流的长度,可以设置请求方式get或post、超时时间。

1获得HttpURLConnection对象

Java中可以使用HttpURLConnection来请求WEB资源。
HttpURLConnection对象不能直接构造,需要通过URL.openConnection()来获得HttpURLConnection对象,示例代码如下:

String szUrl = "http://my.csdn.net/ljheee";
URL url = new URL(szUrl);
HttpURLConnection httpUrlConnection = (HttpURLConnection)url.openConnection();

      HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:

httpUrlConnection.setConnectTimeout(30000);
httpUrlConnection.setReadTimeout(30000);

2、HttpURLConnection对象设置参数 

// 设定请求的方法为"POST",默认是GET
httpUrlConnection.setRequestMethod("POST");
// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在
// http正文内,因此需要设为true, 默认情况下是false;
httpUrlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true;
httpUrlConnection.setDoInput(true); // Post 请求不能使用缓存
httpUrlConnection.setUseCaches(false); // 设定传送的内容类型是可序列化的java对象
// (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)
httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");
// 连接,从上述url.openConnection()至此的配置必须要在connect之前完成,
httpUrlConnection.connect();

3、HttpURLConnection连接

// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, 
// 所以在开发中不调用上述的connect()也可以)。 
OutputStream outStrm = httpUrlConnection.getOutputStream(); 

 4、HttpURLConnection携带数据与发送数据到服务器

// 通过outStrm构建对象输出流,以实现输出可序列化的对象,作为请求的参数
ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向对象输出流写出数据,这些数据将存到内存缓冲区中
objOutputStrm.writeObject(new String("请求携带的数据")); //序列化对象作为请求的参数// 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream)
objOutputStm.flush(); // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中,
// 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器
objOutputStm.close(); // 调用HttpURLConnection连接对象的getInputStream()函数,
// 将内存缓冲区中封装好的完整的HTTP请求电文发送到服务端。
InputStream inStrm &#61; httpUrlConnection.getInputStream(); // <&#61;&#61;&#61;注意&#xff0c;实际发送请求的代码段就在这里

5、Servlet端的开发注意点

(1) 客户端发送的POST类型的HTTP请求&#xff0c;Servlet必须实现doPost方法&#xff0c;而不能用doGet方法。

(2) 用HttpServletRequest的getInputStream()方法取得InputStream的对象&#xff0c;比如&#xff1a; 
   

InputStream inStream &#61;httpRequest.getInputStream(); ObjectInputStreamobjInStream &#61; new ObjectInputStream(inStream); Object obj &#61;objInStream.readObject(); //获得请求携带的参数// 做后续的处理......

小结:

1、 使用HttpURLConnection的步骤是先实例化一个URL对象&#xff0c;通过URL的openConnection实例化HttpURLConnection对象。然后设置参数&#xff0c;注意此时并没有发生连接。真正发生连接是在获得流时即httpUrlConnection.getInputStream这一句时&#xff0c;这点跟TCP Socket是一样的。并非阻塞在ServerSocket.accept()而是阻塞在获取流。所以在获取流之前应该设置好所有的参数。getInputStream从Http连接中获取输入流&#xff0c;即获取服务器响应请求后&#xff0c;返回给客户端的内容都在此流中可以获得。

2、 HttpURLConnection的connect()函数&#xff0c;实际上只是建立了一个与服务器的tcp连接&#xff0c;并没有实际发送http请求。 
    无论是post还是get&#xff0c;http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。 

3、 connect()函数会根据HttpURLConnection对象的配置值生成http头部信息&#xff0c;因此在调用connect函数之前&#xff0c; 就必须把所有的配置准备好。 在http头后面紧跟着的是http请求的正文&#xff0c;正文的内容是通过outputStream流写入的&#xff0c; 实际上outputStream不是一个网络流&#xff0c;充其量是个字符串流&#xff0c;往里面写入的东西不会立即发送到网络&#xff0c;而是存在于内存缓冲区中&#xff0c;待outputStream流关闭时&#xff0c;根据输入的内容生成http正文。 至此&#xff0c;http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候&#xff0c;就会把准备好的http请求 正式发送到服务器了&#xff0c;然后返回一个输入流&#xff0c;用于读取服务器对于此次http请求的返回信息。由于http 请求在getInputStream的时候已经发送出去了&#xff08;包括http头和正文&#xff09;&#xff0c;因此在getInputStream()函数 之后对connection对象进行设置&#xff08;对http头的信息进行修改&#xff09;或者写入outputStream&#xff08;对正文进行修改&#xff09; 都是没有意义的了&#xff0c;执行这些操作会导致异常的发生。 

4、 [Android4.0后所有网络方面的操作都不能再主线程&#xff01;&#xff01;&#xff01;]在获取网页响应字符串时本文代码使用了Thread&#xff0c;在下载图片时使用了AsyncTask,可以对比其使用的异同。很明显&#xff0c;AsyncTask更加方面。在onPreExecute和onPostExecute里可以很方面的做主线程UI的事。

 


推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • Linux一键安装web环境全攻略
    摘自阿里云服务器官网,此处一键安装包下载:点此下载安装须知1、此安装包可在阿里云所有Linux系统上部署安装,此安装包包含的软件及版本为& ... [详细]
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • 如何利用 Myflash 解析 binlog ?
    本文主要介绍了对Myflash的测试,从准备测试环境到利用Myflash解析binl ... [详细]
author-avatar
旧情人旧往事_322
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有