我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Java基础】- HttpURLConnection详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Java基础】- HttpURLConnection详解

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

下载Word文档

猜你喜欢

【Java 基础篇】Java Map 详解

文章目录 导言一、Map 概述二、HashMap三、TreeMap四、LinkedHashMap总结 导言 在Java的集合框架中,Map接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了
2023-08-30

【Java 基础篇】Java递归详解

文章目录 导言一、递归原理二、递归的应用场景三、递归的实现方法四、递归的优缺点优点缺点 总结 导言 递归是一种强大且常用的编程技术,在Java编程中经常被使用。递归是指在函数或方法的定义中调用自身的过程。通过递归,我们
2023-08-20

Java 基础 - 注解机制详解

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。@pdaiJava 基础 - 注解机制详解注解基础Java内置注解内置注解 - @Ov
2022-12-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录