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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na