【Java基础】- HttpURLConnection详解

这篇具有很好参考价值的文章主要介绍了【Java基础】- HttpURLConnection详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【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使用的方法

  • 设置连接参数方法
    编号 方法名 说明
    1 setAllowUserInteraction 如果为 true,则在允许用户交互(例如弹出一个身份验证对话框)的上下文中对此 URL 进行检查。
    2 setDoInput URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输入,则将 DoInput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 true。
    3 setDoOutput URL 连接可用于输入和/或输出。如果打算使用 URL 连接进行输出,则将 DoOutput 标志设置为 true;如果不打算使用,则设置为 false。默认值为 false
    4 setIfModifiedSince 有些协议支持跳过对象获取,除非该对象在某个特定时间点之后又进行了修改
    5 setUseCaches 如果为 true,则只要有条件就允许协议使用缓存。
    6 setDefaultAllowUserInteraction 默认值为 “sticky”,它是所有 URLConnection 的其中一种静态状态。此标志适用于下一个及后续创建的所有 URLConnection。
    7 setDefaultUseCaches 将此 URLConnectionuseCaches 字段的值设置为指定的值。
  • 设置请求头或响应体
    编号 方法 说明
    1 setRequestProperty(key,value) 设置一般请求属性。如果已存在具有该关键字的属性,则用新值改写其值。注:HTTP 要求所有能够合法拥有多个具有相同键的实例的请求属性,使用以逗号分隔的列表语法,这样可实现将多个属性添加到一个属性中。
    2 addRequestProperty(key,value) 添加由键值对指定的一般请求属性。此方法不会改写与相同键关联的现有值
  • 发送URL请求
    编号 方法 说明
    1 getOutputStream 建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器
  • 获取响应
    编号 方法 说明
    1 getContent 检索此 URL 连接的内容;此方法首先通过调用 getContentType 方法确定对象的内容类型;如果这是该应用程序第一次遇到的特定内容类型,则会创建适用于该类型的内容处理程序:
    如果该应用程序已使用 setContentHandlerFactory 方法建立了内容处理程序工厂实例,则调用此实例的 createContentHandler 方法,内容类型为其中的一个参数;结果为该内容类型的内容处理程序。
    如果尚未建立任何内容处理程序工厂,或者如果工厂的createContentHandler方法返回null`,则应用程序会加载以下名称的类
    2 getHeaderField 返回第 n 个头字段的值。如果少于 n+1 个字段,则返回 null。此方法可与 getHeaderFieldKey 方法配合使用,以迭代消息中的所有头
    3 getInputStream 返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。
    4 getResponseCode 获取服务器的响应代码
    5 getResponseMessage 获取服务器的响应消息
    6 getResponseMethod 获取发送请求的方法
  • 相应的信息头用以下方法获取
    编码 方法 说明
    1 getContentEncoding 返回 content-encoding 头字段的值
    2 getContentLength 返回 content-length 头字段的值。
    3 getContentType 返回 content-type 头字段的值。
    4 getDate 返回 date 头字段的值。
    5 getExpiration 返回 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://www.toymoban.com/news/detail-498191.html

到了这里,关于【Java基础】- HttpURLConnection详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java发送http请求的几种方式,调用第三方接口的方法:HttpUtil、HttpURLConnection等

    参考:https://blog.csdn.net/yubin1285570923/article/details/126225347 put请求 post带请求头 get、delete类似… 使用JDK原生提供的net,无需其他jar包,代码如下: 需要用到commons-httpclient-3.1.jar,maven依赖如下: 看一下我实际应用的例子 需要用到httpclient-4.5.6.jar,maven依赖如下: RestTemplate 是由

    2024年01月18日
    浏览(54)
  • 【Java 基础篇】Java 反射详解

    Java反射是指在运行时动态地获取类的信息,并可以通过该信息来操作类或对象。通过反射,我们可以在运行时获取类的字段、方法、构造函数等信息,并能够动态地创建对象、调用方法、访问和修改字段的值。本文将详细介绍Java反射的概念、原理和使用方法,并提供一些示

    2024年02月09日
    浏览(40)
  • 【Java 基础篇】Java递归详解

    递归是一种强大且常用的编程技术,在Java编程中经常被使用。递归是指在函数或方法的定义中调用自身的过程。通过递归,我们可以解决一些复杂的问题,简化代码逻辑,并实现一些高效的算法。本文将详细介绍Java中的递归原理、应用场景和实现方法,并提供一些示例代码

    2024年02月11日
    浏览(46)
  • 【Java基础 3】Java 数组详解

    🍊 Java学习:社区快速通道 数组是相同数据类型的 多个数据的容器 。 这些元素按 线性顺序排列 。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素。 (“简单理解就是:一个跟一个顺序排列”) 格

    2024年02月08日
    浏览(35)
  • 【Java 基础篇】Java 日期类详解

    日期和时间在软件开发中是非常常见且重要的概念。Java 提供了一套强大的日期和时间 API,用于处理日期、时间、时区等相关操作。本文将详细介绍 Java 日期类的概念、用法和常见操作,并提供一些示例代码。 在早期版本的 Java 中, java.util.Date 类是处理日期和时间的主要类

    2024年02月11日
    浏览(37)
  • 【Java 基础篇】Java 迭代器详解

    在 Java 中,迭代器是一种常用的设计模式,用于遍历集合中的元素。它提供了一种统一的方式来访问集合中的元素,而不必暴露集合的内部实现细节。本文将介绍 Java 迭代器的概念、使用方法和常见技巧,并提供一些示例代码。 迭代器是一种对象,它允许按顺序访问集合中的

    2024年02月13日
    浏览(37)
  • 【Java 基础篇】Java方法引用详解

    Java方法引用是Java 8引入的一项重要特性,它提供了一种简洁、可读性高的方式来直接引用已经存在的方法。方法引用使得代码更加简洁、易懂,同时提高了代码的可维护性和重用性。本文将详细介绍Java方法引用的概念、语法和使用方法,并提供一些示例代码。 方法引用是一

    2024年02月12日
    浏览(38)
  • 【Java 基础篇】Java List 详解

    在Java的集合框架中, List 接口是一个有序、可重复的集合,它扩展了 Collection 接口,并提供了一系列操作和方法来处理元素列表。本文将详细介绍Java中的 List 接口及其常见实现类,包括 ArrayList 、 LinkedList 和 Vector ,并提供一些示例代码。 List 接口继承自 Collection 接口,并添

    2024年02月11日
    浏览(35)
  • 【Java 基础篇】Java Collection详解

    Java的 Collection 框架是一组用于存储和操作对象的接口和类。它提供了一种方便的方式来管理和操作数据集合。本文将详细介绍Java中的 Collection 框架,包括 List 、 Set 、 Map 等常见接口和实现类,并提供一些示例代码。 Collection 是Java集合框架的根接口,它定义了一些基本的操作

    2024年02月09日
    浏览(54)
  • 【Java 基础篇】Java Map 详解

    在Java的集合框架中, Map 接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。 Map 接口的实现类提供了丰富的方法来操作键值对,例如添加、删除、更新和查找。本文将详细介绍Java中的 Map 接口及其常见实现类,包括 HashMap 、 TreeMap 和 LinkedHashMap ,并提供一

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包