如何使用java.net.URLConnection类发起和处理HTTP请求

2023-12-19 03:32

本文主要是介绍如何使用java.net.URLConnection类发起和处理HTTP请求,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 准备

      首先我们至少要知道URL和charset,这两个参数是可选的,取决于功能需求。

String url = "http://example.com";
String charset = "UTF-8";  // Or in Java 7 and later, use the constant: java.nio.charset.StandardCharsets.UTF_8.name()
String param1 = "value1";
String param2 = "value2";
// ...String query = String.format("param1=%s&param2=%s", URLEncoder.encode(param1, charset), URLEncoder.encode(param2, charset));

  参数query必须是name=vale格式的,并且用&符号来连结。你也可以通过URLEncoder.encode()方法来指定参数的字符集。

String的format()方法是很方便的。当我需要使用字符串连接操作符 ’ + ’ 两次以上的时候,我很喜欢用这个方法。


  • 发起一个带query参数的HTTP GET请求

      这是一个繁琐的任务,get请求是默认的请求方法。

URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", charset);
InputStream response = connection.getInputStream();
// ...

  任何query参数都要跟URL的?后面。请求头的Accept-Charset属性用来告诉服务器用什么字符集来编码参数。如果你不想发送任何参数,你可以不加Accept-Charset属性。如果你不需要加任何请求头信息,甚至你可以使用URL.openStream()快捷方法。

InputStream response = new URL(url).openStream();
// ...

  如果另一边是HttpServlet的话,那么doGet()方法会被调用,然后可以用HttpServletRequest.getParameter()方法来获取参数。
  
  你可以打印响应体到控制台来测试,就像下面这样:

try (Scanner scanner = new Scanner(response)) {String responseBody = scanner.useDelimiter("\\A").next();System.out.println(responseBody);
}

  • 发起一个带query参数的HTTP POST请求

      通过URLConnection.setDoOutput(true)方法来表明我们发起的是一个POST请求。标准的web表单HTTP POST请求体的Content-Type是application/x-www-form-urlencoded类型。

URLConnection connection = new URL(url).openConnection();
connection.setDoOutput(true); // Triggers POST.
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + charset);try (OutputStream output = connection.getOutputStream()) {output.write(query.getBytes(charset));
}InputStream response = connection.getInputStream();
// ...

注意:不管你什么时候提交表单,不要忘了把表单中的<inputtype="hidden"><input type="submit">元素以name=value的形式加入到query字符串参数中,因为这是在服务器端确定你触发的是哪一个按扭的关键。

  你也可以将URLConnection 转换成HttpURLConnection ,并使用HttpURLConnection.setRequestMethod()方法来表明是一个POST请求。但如果你想要获取输出流的话,你仍然需要设置URLConnection.setDoOutput(true)。

HttpURLConnection httpConnection = (HttpURLConnection) new URL(url).openConnection();
httpConnection.setRequestMethod("POST");
// ...

  另外,如果另一边是一个HttpServlet,那么doPost()方法将会被调用,就可以通过HttpServletRequest.getParameter()方法来获取参数。


  • 关于发起请求

      你可以用URLConnection.connect()方法来发起一个请求,但当你想要获取关于HTTP response的任何信息的时候,请求会自动的发起,诸如:通过URLConnection.getInputStream()方法来获取响应体等等。上面的例子确实如此,所以connect()方法的调用实际上是多余的。


  • 收集HTTP响应信息

    HTTP response status:
      在这里你需要一个HttpURLConnection,如果必要转换它。

int status = httpConnection.getResponseCode();

  ② HTTP response headers:

for (Entry<String, List<String>> header : connection.getHeaderFields().entrySet()) {System.out.println(header.getKey() + "=" + header.getValue());
}

  ③ HTTP response encoding:
    当Content-Type属性设置了字符集参数时,响应体很可能是基于文本的,那么我们将要在服务器端以指定的字符集来编码响应体。

String contentType = connection.getHeaderField("Content-Type");
String charset = null;for (String param : contentType.replace(" ", "").split(";")) {if (param.startsWith("charset=")) {charset = param.split("=", 2)[1];break;}
}if (charset != null) {try (BufferedReader reader = new BufferedReader(new InputStreamReader(response, charset))) {for (String line; (line = reader.readLine()) != null;) {// ... System.out.println(line) ?}}
} else {// It's likely binary content, use InputStream/OutputStream.
}

声明:文章是经论坛回答翻译而来。

这篇关于如何使用java.net.URLConnection类发起和处理HTTP请求的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510756

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置