iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【Java基础】- HttpURLConnection详解
  • 615
分享到

【Java基础】- HttpURLConnection详解

javaservlet开发语言HttpURL 2023-09-09 21:09:01 615人浏览 薄情痞子
摘要

【Java基础】- HttpURLConnection详解 文章目录 【Java基础】- HttpURLConnection详解一、HttpURLConnection简述二、HttpURLCo

Java基础】- HttpURLConnection详解

文章目录

一、HttpURLConnection简述

HttpURLConnection一个抽象类是标准的JAVA接口,该类位于java.net包中,它提供了基本的URL请求,响应等功能。

HttpURLConnection是基于http协议的,支持GET、POST、PUT、DELETE等各种请求方式。如果使用https协议请求,可以使用它的子类HttpsURLConnection完成更安全的请求操作。

二、HttpURLConnection使用步骤

  1. 创建一个URL对象:URL url=new URL(“接口地址”)

  2. 调用URL对象的openConnection()来获取HttpURLConnection对象实例;

    HttpURLConnection connection= (HttpURLConnection) url.openConnection();

  3. 设置HTTP请求使用的方法:GET、POST或其他请求;

    connection.setRequestMethod(“GET”);

  4. 设置连接超时,读取超时的毫秒数,以及服务器希望得到的一些消息头;

    connection.setConnectTimeout(6*1000);

    connection.setReadTimeout(6 * 1000);

  5. 调用getInputStream()方法获得服务器返回的输入流,然后输入流进行读取了;

    InputStream in = connection.getInputStream();

  6. 最后调用disconnect()方法将HTTP连接关掉;

    connection.disconnect();

三、HttpURLConnection使用的方法

  • 设置连接参数方法

    编号方法名说明
    1setAllowUserInteraction如果为 true,则在允许用户交互(例如弹出一个身份验证对话框)的上下文中对此 URL 进行检查。
    2setDoInputURL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。
    3setDoOutputURL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false
    4setIfModifiedSince有些协议支持跳过对象获取,除非该对象在某个特定时间点之后又进行了修改
    5setUseCaches如果为 true,则只要有条件就允许协议使用缓存
    6setDefaultAllowUserInteraction默认值为 “sticky”,它是所有 URLConnection 的其中一种静态状态。此标志适用于下一个及后续创建的所有 URLConnection。
    7setDefaultUseCaches将此 URLConnectionuseCaches 字段的值设置为指定的值。
  • 设置请求头或响应体

    编号方法说明
    1setRequestProperty(key,value)设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。注:HTTP 要求所有能够合法拥有多个具有相同键的实例的请求属性,使用以逗号分隔的列表语法,这样可实现将多个属性添加到一个属性中。
    2addRequestProperty(key,value)添加由键值对指定的一般请求属性。此方法不会改写与相同键关联的现有值
  • 发送URL请求

    编号方法说明
    1getOutputStream建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器
  • 获取响应

    编号方法说明
    1getContent检索此 URL 连接的内容;此方法首先通过调用 getContentType 方法确定对象的内容类型;如果这是该应用程序第一次遇到的特定内容类型,则会创建适用于该类型的内容处理程序:
    如果该应用程序已使用 setContentHandlerFactory 方法建立了内容处理程序工厂实例,则调用此实例的 createContentHandler 方法,内容类型为其中的一个参数;结果为该内容类型的内容处理程序。
    如果尚未建立任何内容处理程序工厂,或者如果工厂的createContentHandler方法返回null`,则应用程序会加载以下名称的类
    2getHeaderField返回第 n 个头字段的值。如果少于 n+1 个字段,则返回 null。此方法可与 getHeaderFieldKey 方法配合使用,以迭代消息中的所有头
    3getInputStream返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。
    4getResponseCode获取服务器的响应代码
    5getResponseMessage获取服务器的响应消息
    6getResponseMethod获取发送请求的方法
  • 相应的信息头用以下方法获取

    编码方法说明
    1getContentEncoding返回 content-encoding 头字段的值
    2getContentLength返回 content-length 头字段的值。
    3getContentType返回 content-type 头字段的值。
    4getDate返回 date 头字段的值。
    5getExpiration返回 expires 头字段的值。

四、HttpURLConnection使用演示

  • Get方式

    public void testDoGet(){        String api="";        HttpURLConnection connection = null;        InputStream in=null;        BufferedReader reader=null;        try{            //构造一个URL对象            URL url = new URL(api);            //获取URLConnection对象            connection= (HttpURLConnection) url.openConnection();            //getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法,所以在开发中不调用connect()也可以)            in = connection.getInputStream();            //通过InputStreamReader将字节流转换成字符串,在通过BufferedReader将字符流转换成自带缓冲流            reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));            StringBuilder sb = new StringBuilder();            String line = null;            //按行读取            while ((line = reader.readLine()) != null) {                sb.append(line);            }            String response= sb.toString();            System.out.println(response);        }catch (Exception exception){            exception.printStackTrace();        }finally {            if (connection != null) {                connection.disconnect();            }            if (in != null) {                try {                    in.close();                } catch (IOException e) {                    e.printStackTrace();                }            }            if (reader != null) {                try {                    reader.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }
  • POST方式

     public void testDoPost(){        String apiUrl = "https://www.Goyeer.com/api";        String username  = "Goyeer";        String passWord  = "123456";        String tenantUrl = "";        HttpURLConnection conn = null;        OutputStream out = null;        InputStream in = null;        String idToken = null;        try        {           // 构造一个URL对象            URL url = new URL(apiUrl);            // 获取URLConnection对象            conn = (HttpURLConnection) url.openConnection();            // 限制socket等待建立连接的时间,超时将会抛出java.net.SocketTimeoutException            conn.setConnectTimeout(3000);            // 限制输入流等待数据到达的时间,超时将会抛出java.net.SocketTimeoutException            conn.setReadTimeout(3000);            // 设定请求的方法为"POST",默认是GET            conn.setRequestMethod("POST");            // 设置传送的内容类型是JSON格式            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");            // 接收的内容类型也是json格式            conn.setRequestProperty("Accept", "application/json;charset=utf-8");            // 设置是否从httpUrlConnection读入,默认情况下是true            conn.setDoInput(true);            // 由于URLConnection在默认的情况下不允许输出,所以在请求输出流之前必须调用setDoOutput(true)。为一个HTTP URL将doOutput设置为true时,请求方法将由GET变为POST            conn.setDoOutput(true);            // 是否使用缓存,Post方式不能使用缓存            conn.setUseCaches(false);            // 准备数据            JSONObject json = new JSONObject();            json.put("username", username);            json.put("password", DigestUtils.md5Hex(password));            json.put("tenantUrl", tenantUrl);            // 返回一个OutputStream,可以用来写入数据传送给服务器            out = conn.getOutputStream();            // 将数据写入到输出流中            out.write(json.toString().getBytes(StandardCharsets.UTF_8));            // 刷新管道            out.flush();            // 建立连接            conn.connect();            // 判断数字响应码是否是200            int responseCode = conn.getResponseCode();            String result="";            if (responseCode == 200) {                // 获取输入流                in = conn.getInputStream();                // 获取返回的内容                StringWriter sw = new StringWriter();                InputStreamReader reader = new InputStreamReader(in, StandardCharsets.UTF_8);                char[] buffer = new char[4096];                for (int n = 0; -1 != (n = reader.read(buffer)); ) {                    sw.write(buffer, 0, n);                }                result = sw.toString();                System.out.println(result);            }        }catch (Exception exception){            exception.printStackTrace();        }finally {            if (conn != null) {                conn.disconnect();            }            if (out != null) {                out.close();            }            if (in != null) {                in.close();            }        }    }

五、HttpURLConnection使用总结

  • HttpURLConnection对象不能直接构造,需使用URL类中的openConnection()方法来创建实例

  • HttpURLConnection对象属性设置,需在connect()方法执行之前完成HttpURLConnection的connect()函数,其本质是建立一个与服务器的tcp连接,但并未实际发送HTTP请求 HTTP请求靠调用getInputStream()、getResponseCode()等方法触发,HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现
    不设置超时(timeout),当网络异常的情况下,可能会导致程序僵死而不继续往下执行

  • HTTP正文的内容是通过OutputStream流写入,向流中写入的数据不会立即发送到网络,而是存在于内存缓冲区中,待流关闭时,根据写入的内容生成HTTP正文。

  • 调用getInputStream()方法时,会返回一个输入流,用于从中读取服务器对于HTTP请求的返回信息

  • 当获取HTTP响应的时候,请求就会自动的发起

  • 如使用HttpURLConnection.getInputStream()方法的时系统会自动调用connect()方法

  • jdk8自带的HttpURLConnection 默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接,使用后的HttpURLConnection会放入缓存中供以后的同host:port的请求重用底层socket在keepAlive超时之前不会关闭。

  • 当在HttpURLConnection的header中加入Connection: close,则此连接不会启用keepAlive如果想启用keepAlive,程序请求完毕后必须调用HttpURLConnection.getInputStream().close()(此操作用于归还长连接给缓存,下次同host:port的请求重用底层socket连接),而不调用HttpURLConnection.disconnect()(表示关闭底层socket连接,不会启用keepAlive)。

来源地址:https://blog.csdn.net/songjianlong/article/details/131095601

--结束END--

本文标题: 【Java基础】- HttpURLConnection详解

本文链接: https://www.lsjlt.com/news/401907.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Java基础】- HttpURLConnection详解
    【Java基础】- HttpURLConnection详解 文章目录 【Java基础】- HttpURLConnection详解一、HttpURLConnection简述二、HttpURLCo...
    99+
    2023-09-09
    java servlet 开发语言 HttpURL
  • 【Java 基础篇】Java List 详解
    文章目录 导言一、List 概述二、ArrayList三、LinkedList四、Vector总结 导言 在Java的集合框架中,List接口是一个有序、可重复的集合,它扩展了Coll...
    99+
    2023-09-11
    java list 数据结构
  • 【Java 基础篇】Java Collection详解
    文章目录 导言一、Collection 简介二、List 接口三、Set 接口四、Map 接口总结 导言 Java的Collection框架是一组用于存储和操作对象的接口和类。它提供了...
    99+
    2023-09-14
    java 开发语言 jvm
  • 【Java 基础篇】Java Map 详解
    文章目录 导言一、Map 概述二、HashMap三、TreeMap四、LinkedHashMap总结 导言 在Java的集合框架中,Map接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了...
    99+
    2023-08-30
    java 开发语言 数据结构
  • 【Java 基础篇】Java Set 详解
    文章目录 导言一、Set 概述二、HashSet三、TreeSet四、LinkedHashSet总结 导言 在Java的集合框架中,Set接口是一个无序、不可重复的集合,它扩展了Col...
    99+
    2023-10-18
    java 开发语言 数据结构
  • java数组基础详解
    目录数组一. 数组概述二. 数组声明和创建三. 内存分析1.JAVA内存有:堆,栈,方法区····2.静态初始化:创建+赋值3.动态初始化:前面其实就是动态初始化,是分开写的。没有赋...
    99+
    2024-04-02
  • Java基础之StringBuffer详解
    目录一、前言二、用法三、结果四、长度 容量五、IStringBuffer接口六、value和capacity一、前言 StringBuffer是可变长的字符串 1.append 追加...
    99+
    2024-04-02
  • Java基础:流Stream详解
    目录写在前面一、"流"概念二、流的分类1、按流的方向分为:输入流、输出流2、按流处理数据的单位分为:字节流、字符流3、按流的功能分为:节点流(又称低级流)、过滤流(又称高级流、处理流...
    99+
    2024-04-02
  • Java基础之ClassLoader详解
    目录一、ClassLoader简介二、内置的CLassLoader的类型三、BootstrapClassLoader四、ExtClassLoader五、AppClassLoader六...
    99+
    2024-04-02
  • Java基础之Maven详解
    目录一、Maven环境的搭建1. 为什么要学习Maven?2. Maven项目架构管理工具3. 下载安装Maven4. 配置环境变量5. 阿里云...
    99+
    2024-04-02
  • Java基础之TreeMap详解
    目录一、写在前面二、定义三、成员变量四、内部类五、构造器六、成员方法一、写在前面 TreeMap的底层数据结构是红黑树,且TreeMap可以实现集合元素的排序。 所以TreeMap...
    99+
    2024-04-02
  • Java基础之FastJson详解
    目录一、fastJson将json格式字符串转化成List集合二、fastJson将json格式字符串转化成对象三、FastJson将对象或集合转化成json格式字符串四、FastJ...
    99+
    2024-04-02
  • 【Java 基础篇】Java 反射详解
    文章目录 导言一、反射的概念二、反射的原理三、反射的使用示例四、反射的应用场景五、反射的注意事项总结 导言 Java反射是指在运行时动态地获取类的信息,并可以通过该信息来操作类或对象。...
    99+
    2023-09-14
    java python 开发语言
  • 【Java 基础篇】Java Stream流详解
    文章目录 导言一、Stream流的概念二、Stream流的使用方法三、并行流操作四、Stream流与集合的比较总结 导言 Java Stream流是Java 8引入的一种新的数据处理方...
    99+
    2023-09-11
    java
  • 【Java 基础篇】Java递归详解
    文章目录 导言一、递归原理二、递归的应用场景三、递归的实现方法四、递归的优缺点优点缺点 总结 导言 递归是一种强大且常用的编程技术,在Java编程中经常被使用。递归是指在函数或方法的定义中调用自身的过程。通过递归,我们...
    99+
    2023-08-20
    java 算法 开发语言
  • Java基础之数组详解
    目录前言二.创建数组三.数组的使用四.数组的遍历五.数组作为方法的参数六.数组相关方法Arrays前言 我们了解数组这个概念之前,我们先思考下面几个问题。 如果我们需要两个数据,那么...
    99+
    2024-04-02
  • Java基础之Object类详解
    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 ...
    99+
    2024-04-02
  • Java基础之反射详解
    目录前言一、一个需求引出反射二、反射入门三、反射原理图四、反射相关类五、反射调用优化前言 反射是我们框架的灵魂,反射也是我们框架的一个底层基石,没有反射也就没有框架,如果我们学好了反...
    99+
    2024-04-02
  • java多线程:基础详解
    目录Java内存模型主内存和工作内存的交互命令内存模型的原子性内存模型的可见性内存模型的有序性指令重排优化的底层原理valatile原理volatile与加锁的区别先行发生原则线程的...
    99+
    2024-04-02
  • Java中的类(基础详解)
    文章目录 可以有多个类,但只能有一个public类类 = 字段+方法类的构造函数我们没写构造函数的时候如果我们自己写了构造函数构造函数中 this 的使用 类的修饰符 / 控制符第一...
    99+
    2023-09-01
    java jvm c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作