如何使用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

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(