`
radzhang
  • 浏览: 303422 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK的HttpUrlConnection

 
阅读更多

java提交Http请求及收取回应可以直接使用jdk的httpurlconnection和apache的httpcomponents的clients两种方法。

下面是urlconnection详解

原文:

http://www.blogjava.net/supercrsky/articles/247449.html

a:) HttpURLConnection的connect()函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。 
    无论是post还是get,http请求实际上直到HttpURLConnection的getInputStream()这个函数里面才正式发送出去。 
       b:) 在用POST方式发送URL请求时,URL请求参数的设定顺序是重中之重, 
    对connection对象的一切配置(那一堆set函数) 
    都必须要在connect()函数执行之前完成。而对outputStream的写操作,又必须要在inputStream的读操作之前。 
    这些顺序实际上是由http请求的格式决定的。 
    如果inputStream读操作在outputStream的写操作之前,会抛出例外: 
    java.net.ProtocolException: Cannot write output after reading input....... 
       
       c:) http请求实际上由两部分组成, 
    一个是http头,所有关于此次http请求的配置都在http头里面定义, 
           一个是正文content。 
    connect()函数会根据HttpURLConnection对象的配置值生成http头部信息,因此在调用connect函数之前, 
    就必须把所有的配置准备好。 
       d:) 在http头后面紧跟着的是http请求的正文,正文的内容是通过outputStream流写入的, 
    实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络, 
    而是存在于内存缓冲区中,待outputStream流关闭时,根据输入的内容生成http正文。 
    至此,http请求的东西已经全部准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求 
    正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http 
    请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数 
    之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改) 
    都是没有意义的了,执行这些操作会导致异常的发生。 

6:> Servlet端的开发注意点: 
a:) 对于客户端发送的POST类型的HTTP请求,Servlet必须实现doPost方法,而不能用doGet方法。 
b:) 用HttpServletRequest的getInputStream()方法取得InputStream的对象,比如: 
     InputStream inStream = httpRequest.getInputStream(); 
     现在调用inStream.available()(该方法用于“返回此输入流下一个方法调用可以不受阻塞地 
     从此输入流读取(或跳过)的估计字节数”)时,永远都反回0。试图使用此方法的返回值分配缓冲区, 
     以保存此流所有数据的做法是不正确的。那么,现在的解决办法是 
     Servlet这一端用如下实现: 
     InputStream inStream = httpRequest.getInputStream(); 
     ObjectInputStream objInStream = new ObjectInputStream(inStream); 
     Object obj = objInStream.readObject(); 
     // 做后续的处理 
     // 。。。。。。 
     // 。。。 。。。 
     而客户端,无论是否发送实际数据都要写入一个对象(那怕这个对象不用),如: 
     ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); 
     objOutputStrm.writeObject(new String("")); // 这里发送一个空数据 
     // 甚至可以发一个null对象,服务端取到后再做判断处理。 
     objOutputStrm.writeObject(null); 
     objOutputStrm.flush(); 
     objOutputStrm.close(); 

注意:上述在创建对象输出流ObjectOutputStream时,如果将从HttpServletRequest取得的输入流 
      (即:new ObjectOutputStream(outStrm)中的outStrm)包装在BufferedOutputStream流里面, 
      则必须有objOutputStrm.flush();这一句,以便将流信息刷入缓冲输出流.如下: 
      ObjectOutputStream objOutputStrm = new ObjectOutputStream(new BufferedOutputStream(outStrm)); 
      objOutputStrm.writeObject(null); 
      objOutputStrm.flush(); // <======此处必须要有. 
      objOutputStrm.close(); 



HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。可以通过以下两个语句来设置相应的超时:
System.setProperty("sun.net.client.defaultConnectTimeout", 超时毫秒数字符串);
System.setProperty("sun.net.client.defaultReadTimeout", 超时毫秒数字符串);

其中: sun.net.client.defaultConnectTimeout:连接主机的超时时间(单位:毫秒)
sun.net.client.defaultReadTimeout:从主机读取数据的超时时间(单位:毫秒)

例如:
System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
System.setProperty("sun.net.client.defaultReadTime

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

分享到:
评论

相关推荐

    Java的HttpURLConnection的封装类 v3.0

    用于对基于HTTP的服务进行抓取 HttpClient 现在是HttpComponents 把问题搞复杂了 其实Java内置的HttpURLConnection很好的 内含文档 使用方法见http://blog.csdn.net/jdgdf566/article/details/17039693

    RestTemplate如何在Spring或非Spring环境下使用.docx

    RestTemplate是执行HTTP请求的同步阻塞式的客户端,它在HTTP客户端库(例如JDK HttpURLConnection,Apache HttpComponents,okHttp等)基础封装了更加简单易用的模板方法API。也就是说RestTemplate是一个封装,底层...

    azure-jax-rs:适用于Windows Azure DocumentDB,存储和搜索的JAX-RS 2.0客户端实用程序库

    但是,实现方式有所不同(用于存储的JDK HTTPURLConnection,用于DocumentDB的Apache HTTPClient),并且它们都具有各种其他第三方依赖性。 该项目的目的是使用用于REST服务的标准Java API JAX-RS,以最小的依赖...

    org.restlet.jar

    * com.noelios.restlet.ext.net.jar (基于JDK的HttpURLConnection的HTTP客户端连接器) 这些JAR包可以在Restlet发布包中的lib目录里找到。要确保你的Java环境支持Java SE 5.0(或更高)版本。如果你确实需要的话...

    一些关于Java发https请求证书问题 资料

    URL url = new URL( "https://localhost:8443"); HttpURLConnection connection

    Feign HTTP Client 使用指南 - Tower.pdf

    默认情况下,feign通过jdk中的HttpURLConnection向下游服务发起http请求,这种情况下,由于缺乏连接池的支持,在达到一定流量的后服务肯定会出问题.本指南详细介绍feign的实现以及优化

    中国慕课大学数据采集和管理网站-前后台-Java版

    包括网站前台、后台、数据库...爬取用的是HttpURLConnection和Jsoup,5大策略(内分小策略)支持全站所有风格的课程爬取。使用的工具是JDK、IDEA、Mysql、Navicat。需远程协助,请安装远程连接工具向日葵后,私信博主。

    Android OkHttp基本使用详解

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。 尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比...对于Java, JDK1.7以上。 基本使用 HTTP GET OkHttpClient clie

    小而全的Java工具类库,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”

    hutool-aop JDK动态代理封装,提供非IOC下的切面支持 hutool-bloomFilter 布隆过滤,提供一些Hash算法的布隆过滤 hutool-cache 简单缓存实现 hutool-core 核心,包括Bean操作、日期、各种Util等 hutool-cron 定时...

    http、https调用json接口必要包

    包含commons-beanutils.jar、commons-collections.jar、commons-lang.jar、commons-logging-1.1.1.jar、ezmorph-1.0.5.jar、json-lib-2.4-jdk15.jar 使用HttpURLConnection、HttpsURLConnection 以JSON形式传递数据...

    java8源码-my-api:各种技术api尝试操作

    是个人基于HttpURLConnection 实现http 请求;Json 主要仿照 开源JSON。当然common也会存放一些其他模块使用的JavaBean、annotation等; api-gateway 这功能貌似比较新颖,采用servlet+spring 方式进行 将 Spring-...

    restful restful所需要的jar包

    * Multiple client HTTP connectors available, based on either the JDK's HttpURLConnection class or on Apache HTTP Client. * Internal HTTP client and server connectors were also added in Restlet 1.1, ...

    java8源码-my-java-api:java相关技术学习:jdkjvmniodisruptorwebcamelgroovyjavassis

    java8 源码 api-common 这里存放通用api操作,其中攘括了: 通用Util,如二位码生成、中文转拼音、spring-bean方式格式化输出;...书学习、加密与解密、java8新特性、javaWeb、及jdk源码学习位运算、集合、泛化、instr

    APP登录注册 步骤三:客户端

    JDK版本:1.8 MySQL版本:5.7 JDBC驱动:mysql-connector-java-5.1.47.jar 1、项目架构: MainSecondActivity 是 APP 入口程序; Android 上发送 HTTP请求的方式一般有两种:HttpURLConnection 和 HttpClient ! ...

    Android开发与应用——张荣,原书配套课件

    2.1.1 安装JDK 2.1.2 安装Eclipse 2.1.3 Eclipse中文包的安装 2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android模拟器 2.3.1 创建AVD 2.3.2 开发环境测试 2.3.3 模拟器的使用 ...

    android开发揭秘PDF

    2.2.1 安装JDK和配置Java开发 环境 2.2.2 Eclipse的安装与汉化 2.2.3 SDK和ADT的安装和 配置 2.3 创建第一个Android项目——HeUoAndroid 2.3.1 创建HelloAndroid项目 2.3.2 运行HelloAndroid及模拟器的使用 2.3.3 ...

    Java网络编程(第三版)中文版.part11.rar

    本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播...

    Java网络编程(第三版)高清中文版.part01.rar

    本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播...

    Java网络编程(第三版)中文版.part06.rar

    本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播...

    Java网络编程(第三版)中文版.part07.rar

    本书讨论了JDK 1.4和1.5(现在已命名为J2SE 5)中所做的所有修改和增补。本书内容全面,涵盖了从网络基础知识到远程方法调用(RMI)等各方面的内容,书中章节涉及到TCP和UDP socket、服务器socket、URL和URI、组播...

Global site tag (gtag.js) - Google Analytics