【Java进阶营】java实现HTTP请求的三种方式

Geckodriver中定制Firefox HTTP请求头的三种方案与实战指南 HTTP请求头是客户端与服务器通信时传递元数据的关键载体,它定义了请求的身份、能力与偏好,如User-Agent标识客户端类型,Accept-Language指明语言偏好。其原理在于,浏览器或自动化工具在发起网络请求时,会携带一组预定义的头部信息,服务器据此进行内容协商、安全验证与访问控制。在自动化测试、数据采集与安全审计等场景中,定制请求头具有重要技术价值,它能模拟特定设备、绕过基础反爬、注入认证令牌或伪装成搜索引擎爬虫,从而精准控制请求行为。本文聚焦于Selenium自动化框架下的Firefox浏览器, 阅读详情

目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现。HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,HttpClient3.1 是 org.apache.commons.httpclient下操作远程 url的工具包,虽然已不再更新,但实现工作中使用httpClient3.1的代码还是很多,HttpClient4.5是org.apache.http.client下操作远程 url的工具包,最新的;另一种则是通过HttpURLConnection去实现,HttpURLConnection是JAVA的标准类,是JAVA比较原生的一种实现方式。

自己在工作中三种方式都用到过,总结一下分享给大家,也方便自己以后使用,话不多说上代码。

第一种方式:java原生HttpURLConnection
package com.powerX.httpClient;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.OutputStream;
  import java.net.HttpURLConnection;
  import java.net.MalformedURLException;
  import java.net.URL;
  public class HttpClient {
  public static String doGet(String httpurl) {
  HttpURLConnection connection = null;
  InputStream is = null;
  BufferedReader br = null;
  String result = null;
// 返回结果字符串
  try {
  // 创建远程url连接对象
  URL url = new URL(httpurl);
  // 通过远程url连接对象打开一个连接,强转成httpURLConnection类
  connection = (HttpURLConnection) url.openConnection();
  // 设置连接方式:get
  connection.setRequestMethod(“GET”);
  // 设置连接主机服务器的超时时间:15000毫秒
  connection.setConnectTimeout(15000);
  // 设置读取远程返回的数据时间:60000毫秒
  connection.setReadTimeout(60000);
  // 发送请求
  connection.connect();
  // 通过connection连接,获取输入流
  if (connection.getResponseCode() == 200) {
  is = connection.getInputStream();
  // 封装输入流is,并指定字符集
  br = new BufferedReader(new InputStreamReader(is, “UTF-8”));
  // 存放数据
  StringBuffer sbf = new StringBuffer();
  String temp = null;
  while ((temp = br.readLine()) != null) {
  sbf.append(temp);
  sbf.append(“rn”);
  }
  result = sbf.toString();
  }
  } catch (MalformedURLException e) {
  e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  // 关闭资源
  if (null != br) {
  try {
  br.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  if (null != is) {
  try {
  is.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  connection.disconnect();// 关闭远程连接
  }
  return result;
  }
  public static String doPost(String httpUrl, String param) {
  HttpURLConnection connection = null;
  InputStream is = null;
  OutputStream os = null;
  BufferedReader br = null;
  String result = null;
  try {
  URL url = new URL(httpUrl);
  // 通过远程url连接对象打开连接
  connection = (HttpURLConnection) url.openConnection();
  // 设置连接请求方式
  connection.setRequestMethod(“POST”);
  // 设置连接主机服务器超时时间:15000毫秒
  connection.setConnectTimeout(15000);
  // 设置读取主机服务器返回数据超时时间:60000毫秒
  connection.setReadTimeout(60000);
  // 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为true
  connection.setDoOutput(true);
  // 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可无
  connection.setDoInput(true);
  // 设置传入参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
  connection.setRequestProperty(“Content-Type”, “application/x-www-form-urlencoded”);
  // 设置鉴权信息:Authorization: Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0
  connection.setRequestProperty(“Authorization”, “Bearer da3efcbf-0845-4fe3-8aba-ee040be542c0”);
  // 通过连接对象获取一个输出流
  os = connection.getOutputStream();
  // 通过输出流对象将参数写出去/传输出去,它是通过字节数组写出的
  os.write(param.getBytes());
  // 通过连接对象获取一个输入流,向远程读取
  if (connection.getResponseCode() == 200) {
  is = connection.getInputStream();
  // 对输入流对象进行包装:charset根据工作项目组的要求来设置
  br = new BufferedReader(new InputStreamReader(is, “UTF-8”));
  StringBuffer sbf = new StringBuffer();
  String temp = null;
  // 循环遍历一行一行读取数据
  while ((temp = br.readLine()) != null) {
  sbf.append(temp);
  sbf.append(“rn”);
  }
  result = sbf.toString();
  }
  } catch (MalformedURLException e) {
  e.printStackTrace();
  } catch (IOException e) {
  e.printStackTrace();
  } finally {
  // 关闭资源
  if (null != br) {
  try {
  br.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  if (null != os) {
  try {
  os.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  if (null != is) {
  try {
  is.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
  }
  // 断开与远程地址url的连接
  connection.disconnect();
  }
  return result;
  }
  }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151

第二种方式:apache HttpClient3.1
 package com.powerX.httpClient;
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStr

Java实现Basic Auth认证HTTP请求:原理、选型与生产级实践 HTTP认证是Web安全与API交互的基础机制,其中Basic Auth作为最经典的认证方案,通过用户名密码的Base64编码实现身份验证。其工作原理遵循“挑战-响应”模式,服务器通过401状态码发起质询,客户端在Authorization头中携带编码后的凭证完成认证。虽然Base64编码本身不具备加密性,必须与HTTPS配合保障传输安全,但Basic Auth因其简单性和广泛支持,在系统间API调用、数据抓取等场景中仍是常见选择。在Java生态中,开发者需根据项目需求在HttpURLConnection、 阅读详情

相关推荐

告别网络请求烦恼!深度剖析 OkHttp:揭秘Java/Android开发者的「瑞士军刀」!性能、稳定、可扩展的HTTP客户端王者

在当今互联网时代,无论是移动应用、桌面应用还是后端服务,网络请求都扮演着举足轻重的角色。数据交互、API 调用、内容分发……几乎所有的核心功能都离不开高效、稳定、可靠的网络通信。然而,对于Java和Android开发者而言,处理底层网络请求曾是一件令人头疼的事情。早期的API 冗长、易错,且缺乏现代HTTP协议特性支持;而Apache HttpClient虽然功能强大,但在Android上又面临包体积、兼容性等问题。开发者们渴望一个更加优雅、高效、功能完备的解决方案。

wylee的博客 2066

java响应重定向发送post请求

");RedirectWithPost请求类全部代码/**用POST方式 重定向*/");实例化RedirectWithPost请求类//redirectUrl请求地址添加请求参数。

2301_82242204的博客 804

Java~基于fluent-hc快速构建Http请求,结合failsafe实现异常重试(1)

/如果获得这个异常,则执行重试//延迟俩秒//最多尝试俩次拓展知识1.failover:失效转移Fail-Over的含义为“失效转移”,是一种备份操作模式,当主要组件异常时,其功能转移到备份组件。其要点在于有主有备,且主故障时备可启用,并设置为主。如Mysql的双Master模式,当正在使用的Master出现故障时,可以拿备Master做主使用2.failfast:快速失败。

shenliba的博客 848

Hutool - HttpUtil实战:GET与POST请求的进阶用法与场景解析

本文深入解析Hutool工具包中HttpUtil模块的GET与POST请求进阶用法,涵盖自定义请求头、超时设置、参数编码、文件上传下载等实战场景。通过代码示例展示如何简化Java HTTP请求处理,提升开发效率,特别适合需要频繁调用API的Java开发者。

w3x4y的博客 821

【Java进阶营】Java异步NIO框架Netty实现高性能高并发

1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程服务调用。相比于传统基于Java序列化+BIO(同步阻塞IO)的通信框架,性能提升了8倍多。 事实上,我对这个数据并不感到惊讶,根据我5年多的NIO编程经验,通过选择合适的NIO框架,加上高性能的压缩二进制编解码技术,精心的设计Reactor线程模型,达到上述性能指标是完全有可能的。 下面我们就一起来看下Netty是如

hong7888888的博客 884

BurpSuite插件开发实战:自动修改HTTP请求头实现安全测试自动化

HTTP请求头是Web应用通信中的关键组成部分,它承载了客户端信息、会话状态和访问控制等元数据。通过修改请求头,可以模拟不同客户端环境、绕过基础防护策略或进行身份伪装,这在安全测试和渗透测试中尤为重要。传统手动修改方式效率低下且易出错,而自动化技术则能显著提升测试覆盖率和准确性。BurpSuite作为主流的Web安全测试平台,其Extender API提供了强大的扩展能力,允许开发者通过Java插件实现请求的自动化处理。本文以开发一个自动修改HTTP请求头的插件为例,深入解析了IHttpListener接口

congji3817的博客 342

Codex接入DeepSeek全攻略:三种方式从原理到实战详解

最近在技术社区看到不少关于 Codex 和 DeepSeek 的讨论,很多开发者想尝试这个组合,但在选择接入方式时犯了难:是用官方账号、第三方中转,还是直接配置 API?网上资料零散,配置过程也容易踩坑。本文将以一个实战者的视角,系统梳理 Codex 接入 DeepSeek 的三种主流方式,从原理、配置到实测对比,手把手带你走通全流程。无论你是想快速体验 AI 编程助手,还是需要在团队内部署稳定的开发环境,都能在这里找到清晰的路径和避坑指南。 1. 背景与核心概念:为什么是 Codex + DeepSeek

dianxi0949的博客 504

Java 的 OkHttp 高级进阶:HTTP 请求的艺术

构建复杂的请求:使用FormBody和来构建包含文件或表单数据的请求。处理重定向:使用和循环检查来控制重定向行为。配置连接池:使用来管理连接池。使用 SSL 连接:使用和来配置 SSL 连接。处理身份验证:使用来处理基本身份验证。处理错误状态码:检查响应的状态码来决定如何处理。使用 HTTP 代理:使用proxy来配置代理服务器。使用 Cookie:使用CookieJar来管理和处理 Cookie。使用 HTTP 压缩:使用拦截器来处理压缩的数据。使用 HTTP 头部。

java专栏 2340

【Java进阶学习】 Servlet接口规范和7种请求方式的处理

【Java进阶学习】 Servlet接口规范和7种请求方式的处理

weixin_54707168的博客 617

HTTP 黑科技

在 HTTP 中,内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的标准。一旦资源存储在缓存中,理论上就可以永远被缓存使用。但是不管是浏览器缓存还是代理缓存,其存储空间是有限的,所以缓存会定期进行清除,这个过程叫做缓存回收(cache eviction)(自译)。另一方面,服务器上的缓存也会定期进行更新,HTTP 作为应用层的协议,它是一种。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1469

【我的Android进阶之旅】Android采用AES+RSA的加密机制对Http请求进行加密

前言 未加密的抓包截图 加密之后的抓包截图 基本需求及概念 AES算法 AES基本原理及算法流程 AES算法流程 RSA算法 RSA算法基本原理及流程 RSA算法实现流程 AES与RSA相结合数据加密方案 Android端 AESRSA结合实践 基本要求 基本流程 Android端 服务器端 java版示例 更多参考 前言 最近维护公司APP应用的登录模块,由于测试人员用Fiddler抓包工具

字节卷动 1万+

Java Retrofit:高级进阶与刨根问底

通过这篇文章,我们不仅学习了Retrofit的基础知识,还深入了解了其高级特性。Retrofit是一款用于Android和Java应用的类型安全的HTTP客户端,它使得构建干净、流畅的API接口变得轻松愉快。Retrofit通过注解驱动的方式,将复杂的网络请求抽象成简单的接口调用,使得我们可以专注于业务逻辑的实现。为了使用上述定义的API接口,我们需要创建一个Retrofit实例,并将其与API接口绑定起来。为了调试网络请求,我们可以使用OkHttp的拦截器来打印HTTP请求和响应的详细信息。

java专栏 1973

Keil MDK编译错误#541解决方案与ARM_Compiler包解析

在嵌入式开发中,编译器工具链的依赖管理是确保项目顺利构建的关键环节。以Keil MDK为例,其软件包依赖机制通过组件化设计实现功能解耦,其中ARM_Compiler包专门处理系统IO重定向等编译器扩展功能。这种架构既提升了模块复用性,也带来了版本兼容性挑战。当出现'Error #541: component missing'报错时,通常是由于中间件组件(如文件系统)在新版本中显式依赖了ARM_Compiler包。开发者需要通过Pack Installer安装该包,并在Run-Time Environment

weixin_32129187的博客 367

ROS专栏—基于STM32F103的INA219电源数据采集

文章主要记录了stm32f103对ina219的数据采集

热爱生活、奋斗前行 2353

ESP32-S3射频测试与全球认证全栈实践指南

功率谱密度(PSD)和发射功率等级是无线通信设备射频合规的核心基础概念,其物理层原理直接决定自适应测试、阻塞容限及多国认证的通过路径。PSD ≥10 dBm/MHz触发强制性自适应测试,需验证LBT机制与跳频鲁棒性;而16级可编程发射功率等级(-24 dBm至+20 dBm)则为功耗、覆盖与法规平衡提供工程调控维度。该能力广泛应用于低功耗蓝牙IoT终端、智能家居网关及工业无线传感器等场景,尤其在ESP32-S3平台中,需结合eFuse校准、Sigma工具链与QuickTrack认证策略实现从实验室调试到量产

weixin_34945060的博客 288

电机控制-PMSM无感FOC控制(四)SVPWM——过调制

上一章我们提到了SVPWM矢量合成的范围在一个平面的矢量圆内,那么当电压矢量超出调制范围时,该怎么做呢?这就是过调制要解决的问题。电机控制-PMSM无感foc控制(三)SVPWM据之前讲解的内容我们可以知道,SVPWM技术在电压空间上模拟了一个近似于圆的电压轨迹,减小了相电流的谐波,降低了电机的谐波损耗,抑制了转矩脉动。然而,SVPWM技术也存在一些问题,合成电压矢量有极限便是其中之一。这个半径为√3/3Vdc的区域也被称作SVPWM的线性区域。

zhuxinmingde的博客 1315

Altium AD20的PCB板框绘制、定义板子形状、重新设置原点、放置尺寸标注

AD20的板框绘制与以前的版本不同,以前板框是在KeepOut层,而在AD20中没有这个层,绘制板框需要到机械层Mechanical1。 板框大小评估 首先进行板框大小评估。 工具 - 器件摆放 - 在矩形区域摆放。 之后通过鼠标框选矩形区域,元件会自动按照框选的范围进行摆放。这个操作可以重复多次,最后大致得出需要的板框尺寸。确定好后右键。 板框绘制,重新定义板子形状 点击下方的 Mechanical1,切换到机械层。放置线条,根据元件摆放来绘制PCB大致的形状,将元件完全包裹。

Mark_md的博客 10万+

Win11下WSL2安装Ubuntu22.04避坑指南:从镜像源到C++环境配置

本文提供了一份详细的Win11下WSL2安装Ubuntu22.04的实战避坑指南。内容涵盖从WSL2核心安装、自定义安装路径,到更换国内镜像源以解决更新缓慢问题,并一站式配置完整的C++开发环境(包括GCC、CMake、vcpkg等),最后分享提升开发体验的进阶技巧,助你在Windows上打造高效的Linux开发工作站。

weixin_29260291的博客 562

HTML5+CSS3+JS小实例:扇形展开折叠菜单

你肯定见过那种圆形浮动按钮(FAB),点一下弹出几个选项。大部分实现就是菜单项从底下往上"弹"出来,排成一列——能用,但没啥记忆点。后来我看到 Path 那个经典的扇形菜单,点一下,五个按钮像花瓣一样从中心散开,每个带不同的延迟和弹性曲线。当时就觉得:这才对嘛,交互就该有点"戏剧性"。今天拆一个纯手写版本,HTML + CSS + JS,不依赖任何库。六菜单项、扇形 144° 展开、弹性过渡、点击关闭、键盘可达——该有的都有。

艾恩小灰灰的博客 164

SKILL 是什么?怎么做?五分钟 带你从入门到精通

skill-creator 是 Anthropic 官方开源的“元技能”——一个专门用来创建 Skill 的 Skill。你只需要用自然语言描述想要什么功能,它会自动生成。从更宏观的视角看,Skills 的出现标志着 AI 编程的一次范式转变。在传统的 AI 编程中,代码是确定性的:1 是 1,2 是 2。但到了大模型时代,代码变得不确定——你不知道模型会输出什么,不知道它会不会突然删掉几行代码。这种不确定性让很多开发者感到不安。Skills 把这套逻辑又拉了回来。

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 642

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

下一篇: 【Java进阶营】Java 序列化 之 单例模式
jvm大志
博客等级 码龄5年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值