Java网络编程之HttpURLConnection

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hexingen/article/details/52874662

这里写图片描述

从上图,可知HttpURLConnection是URLConnection类的子类,先了解下URLConnection.

URLConnection类:

  • 描述:

    1. 是从Url创建的,并且用于访问URL指向的资源的通信连接。

    2. 这个抽象类的工作是通过底层协议(例如http或者https)来处理。

    3. URLConnection是应用程序和Url之间通信的类的超类。

    4. 这类对象可以读取和写入Url所指向的资源。

  • 从URL创建其对象到读写URL指向的资源,进行了以下步骤:

    1. 通过URL调用openConnection()来创建对象

    2. 设置一般参数和请求属性

    3. connection()来实际连接到远程对象

    4. 若是远程对象可用,则可以访问远程对象的Header( 标头)和content(内容)

  • 对以上4个步骤,详细描述如下:

    1. 创建方式:

         url.openConnection();
      
    2. 修改参数的方法:

         setAllowUserInteraction()
         setDoInput()
         setDoOutput()
         setIfModifiedSince()
         setUseCaches()
      
    3. 修改Request的属性的方法:

       setRequestProperty()
      

      总结:以上每个set()都有对应的get()获取到对应值。设置哪些参数和request的属性都是协议指定的。

    4. 设置一些默认配置的方法:

         setDefaultAllowUserInteraction 
         setDefaultUseCaches.
      
    5. 在连接远程对象后(即调用connection()),用于获取内容和header的方法:

       getContent
       getOutputStream
       getHeaderField
       getInputStream 
      
    6. 一些频繁访问header的方法:

        getContentEncoding
        getContentLength
        getContentType
        getDate
        getExpiration
        getLastModifed 
      
    7. 释放相关的网络资源:

      调用getInputStream()或getOutputStream(),需再调用close()。

      通常情况下,可以忽略预连接的参数和一般请求属性(简单理解:使用 get请求,不设置参数,request 属性)。

      对于大多数客户端(使用者):需注意这两个getInputStream() 和getContent()。它们很方便访问到Url所指向的资源(简单理解:通过这两个方法可以读取到服务器上的数据)。

  • 其API:

    • addRequestProperty(String key, String value) : 添加一个key-value形式的Request属性

    • connect():若是url的通信连接,将打开到此Url所指向资源的通信连接。

    • setRequestProperty(String key, String value):设置request 的属性

    • setUseCaches(boolean usecaches):设置true,允许协议使用缓存

    • setReadTimeout(int timeout) : 将读超时设置为指定的超时值,以毫秒为单位。

    • setIfModifiedSince(long ifmodifiedsince):设置从第几个对象开始获取(有些协议支持跳过对象获取)

    • setFileNameMap(FileNameMap map): 设置 FileNameMap。

    • setDoOutput(boolean dooutput): 设置true,允许添加数据。post请求需要用到

    • setDoInput(boolean doinput): 设置true,允许从服务器读取数据

    • setAllowUserInteraction(boolean allowuserinteraction):设置true,允许用户交互的上下文对此Url进行操作。(设置为true,服务器可以获取request中coockie.loaction等等)

    • setConnectTimeout(int timeout): 设置一个指定的超时值(以毫秒为单位)

    • setContentHandlerFactory(ContentHandlerFactory fac): 设置应用程序的 ContentHandlerFactory。

    • getxxx()与setxxx()相对应:这里省略

官方链接: http://docs.oracle.com/javase/8/docs/api/java/net/URLConnection.html

中文翻译的链接:http://www.apihome.cn/api/java/URLConnection.html


HttpURLConnection类:

  • 描述:

    1. 一个URLConnection子类,提供一些特有附加功能对于Http协议。

    2. 每个HttpURLConnection对象是用于单个请求,但可以与其他HttpURLConnection对象共享Http服务器的底层网络连接。

    3. 对于共享的网络连接,在HttpURLConnection的InputStream (或者 OutputStream)调用close()来释放网络资源是没有效果的。

    4. 若是不需要连接服务器,则调用disconnect() 来关闭底层的socket,释放资源.

    5. htttp协议处理一些访问系统数据的设置。例如代理设置及各种其他设置

  • 其特有的API(除开继承父类的外):

    • disconnect(): 解除连接

    • getPermission():返回一个权限对象,其代表建立此对象表示的连接所需的权限。

    • setRequestMethod(String method):设置请求方式,例如GET POST HEAD OPTIONS PUT DELETE TRACE

    • getRequestMethod():获取request的请求方式

    • usingProxy():使用代理模式连接

    • getErrorStream() :获取到错误流

    • getFollowRedirects() :自动执行Http重定向的boolean值

    • getHeaderField(int n) :返回第n个header的值

    • getHeaderFieldKey(int n) :获取第n个headder的key

    • getHeaderFieldDate(String name, long Default) :返回解析为日期的指定字段的值。

    • getResponseCode() :获取状态码

    • getResponseMessage():获取与来自服务器的响应代码一起返回的 HTTP 响应消息(如果有)。

    • setChunkedStreamingMode(int chunklen) :在不知道内容长度前提下,设置流输出时的存储块长度

    • setFixedLengthStreamingMode(int contentLength) :在知道内容长度前提下,设置流输出的固定内容长度

    • setFollowRedirects(boolean set):设置true,允许自动执行Http重定向

    • setInstanceFollowRedirects(boolean followRedirects) :设置此 HttpURLConnection 实例是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。

官方链接:http://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html

中文连接:http://www.apihome.cn/api/java/HttpURLConnection.html

  • 使用案例 :

    • GET使用方式:
      先创建HttpURLConnection对象,设置Header( 标头 ):

      /**
      * 创建httpUrlConnection对象,指定request的属性
      *
      * @param url
      * @return
      */
      public HttpURLConnection createConnection(String url) {
         HttpURLConnection urlConnection = null;
         try {   
               //创建其对象
               urlConnection = (HttpURLConnection) new URL(url).openConnection();
      
               //设置连接时间,10秒
               urlConnection.setConnectTimeout(10 * 1000);
               urlConnection.setReadTimeout(10 * 1000);
      
               //数据编码格式,这里utf-8
               urlConnection.setRequestProperty("Charset", "utf-8"); 
      
               //添加cookie,cookie规则需开发者自定
               urlConnection.setRequestProperty("Cookie", Constants.COOCKIE_KEY + token); 
      
              //设置返回结果的类型,这里是json
               urlConnection.setRequestProperty("accept", "application/json"); 
      
               //这里设置post传递的内容类型,这里json
               urlConnection.setRequestProperty("Content-Type", "application/json");
      
      
          } catch (Exception e) {
              e.printStackTrace();
          }
          return urlConnection;
      }

      从服务器响应数据,获取其内容转成String类型的数据:

      /**
      * 获取HttpUrlConnection的返回内容
      *
      * @param urlConnection
      * @return
      */
      public String getStreamContent(HttpURLConnection urlConnection) {
         ByteArrayOutputStream byteArrayOutputStream = null;
         BufferedInputStream bufferedInputStream = null;
         String result = null;
      
         try {
              //开启客户端与Url所指向的资源的网络连接
              urlConnection.connect();
      
              if (200 == urlConnection.getResponseCode()) {//HTTP_OK 即200,连接成功的状态码
                  if (urlConnection.getContentLength() > 0) {
                         bufferedInputStream = new  
                             BufferedInputStream(urlConnection.getInputStream());
                         byteArrayOutputStream = new ByteArrayOutputStream();
                         //httpUrlConnection返回传输字节的长度,创建一个byte 数组。
                         byte[] b = new byte[urlConnection.getContentLength()];
                         int length;
                         while ((length = bufferedInputStream.read(b)) > 0) {
                             byteArrayOutputStream.write(b, 0, length);
                         }
                        result = byteArrayOutputStream.toString("utf-8");
                  }
             }
          } catch (Exception e) {
               e.printStackTrace();
          } finally {
               try {
                   if (byteArrayOutputStream != null) {
                         byteArrayOutputStream.close();
                    }
                   if(bufferedInputStream!=null){
                          bufferedInputStream.close();
                   }
                  if (urlConnection != null) {
                        //解除连接,释放网络资源
                       urlConnection.disconnect();
                  }
               } catch (Exception e) {
                    e.printStackTrace();
              }
      
        }
         return result;
      }
    • POST使用方式:
      Post请求方式是需要添加Body的,需要传递数据到服务器的。创建其对象和读取服务器返回数据的操作都一样,比GET请求方式多一步添加数据操作: 这里传递一个json数据类型的数据

      //设置连接配置
      HttpURLConnection httpURLConnection = createConnection(url2);
      //添加传递的参数
      ddParameter(httpURLConnection, jsonObject);
      //获取返回数据
      String result = getStreamContent(httpURLConnection);
      
      /**
      * 添加http参数
      *
      * @param urlConnection
      * @param jsonObject
      */
      public void addParameter(HttpURLConnection urlConnection, JSONObject jsonObject) {
        try {
             //设置post请求方式
             urlConnection.setRequestMethod("POST");
             //允许往流中写入数据
             urlConnection.setDoOutput(true);
            //借助BufferedOutputStream提高速度
             OutputStream outputStream = new    
                            BufferedOutputStream(urlConnection.getOutputStream()); 
      
             byte[] body = jsonObject.toString().getBytes("utf-8");
             outputStream.write(body, 0, body.length);
             //刷新数据到流中
             outputStream.flush();
             //关闭流
            outputStream.close();
      } catch (Exception e) {
          e.printStackTrace();
      }
      }
    • 衍生点:
      HTTP请求是有Header和Body构成,Body是传递到服务器上的数据(Post会用到),Header是标头,包 含一些Coockie,传递的数据的编码格式,响应的数据的编码格式,Accept格式,Keep-Alive等等。

      这里是一个简单的Request Header包含的信息:

      Host                    localhost:8080
      Accept                  text/html,application/xhtml+xml,application/xml;q=0.9
      Accept-Language         fr,en-gb;q=0.7,en;q=0.3
      Accept-Encoding         gzip,deflate
      Accept-Charset          ISO-8859-1,utf-8;q=0.7,*;q=0.7
      Keep-Alive              300
展开阅读全文

没有更多推荐了,返回首页