解决java的http请求库dongliu.requests请求结果中文乱码的问题

uniapp [安卓苹果App端] - 实现APP开发后台保活+息屏后台持续运行效果,强制后台保活手机黑屏后进程存活后台保持网络连接或持续定位等功能提供支持(app后台运行休眠仍然可以确保一直运行) uniapp APP开发后台保活,Uniapp-APP后台保活插件(安卓苹果ios后台保活)保证应用在后台继续运行,uniapp实现app保活 保后台运行 避免系统主动杀进程,如何让安卓APP一直在后台运行?uniapp 安卓 APP 后台持续运行(保活)iOS App后台保活,Android 后台运行白名单实现保活,保活息屏后台运行,uniapp后台保活,uniapp熄屏 后台运行,Android/ios进程保活/息屏后后台保持定位、网络运行,uniapp在android ios保活,挂后台可运行,安卓A 阅读详情

前言

在前几天接到一个需求,需要爬取某个网站上的一些数据,并且经过整理后将爬取到的数据写入到数据库内。

这类需求如果不需要考虑太多性能的问题的话,使用 Python 来实现的效率是最高的,但考虑到后续可能需要作为模块整合至springboot 的应用内,所以还是决定使用 java 的库来进行开发。

在这之前了解到并且使用的 java 的 http 库都是 okhttp 、httpclient、RestTemplate 等,虽然这些库也简化了很多原生求的复杂配置过程,但对于一些需求还是需要自行去封装,操作体验和开发效率上都差了很多。

所以突发奇,在java庞大的生态里面,有无类似 python 的 requests 这类体验更好的 http 请求库? 经过一番搜索后,在 github 上找到了与该库同名的一个 http 库,该模块的作者的灵感也同样来自于 Python 的第三方 库 requests,描述如下

Requests is a http request lib with fluent api for java, inspired by the python request module. Requests requires JDK 1.8+, the last version support Java7 is 4.18.* .

一个具有流畅java api的http请求库,灵感来自python请求模块。请求需要JDK 1.8+,最后一个支持Java7的版本是4.18.* (中文为机器翻译)

经过一番体验后,该模块确实提供了很多便捷的java api,简化了大量的配置流程。

具体的使用方法,参考该模块的开源仓库:https://github.com/hsiafan/requests

问题描述

请求返回的数据内包含了中文,而 Requests 模块默认使用的是 utf-8 编码来解析响应的数据,代码如下

public class RequestsDemo {
    public static void main(String[] args) {
        String url = "http://example.com/index.asp";
        //请求头
        Map<String, Object> headers = new HashMap<>();
        headers.put("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36");
        //请求信息
        Map<String, Object> formData = new HashMap<>();
        formData.put("username", "666");
        formData.put("passwd", "666");
        formData.put("login", "%B5%C7%A1%A1%C2%BC");
        Session session = Requests.session();
        String respText = session.post(url)
            //设置请求头
            .headers(headers)
            .requestCharset(Charset.forName("gbk"))
            //请求表单
            .body(formData)
            //发送请求
            .send().readToText();
        System.out.println(respText);
    }
}

请求返回的结果如下图

image.png

从上图可以看出中文的内容都变成了乱码。

发现了两个与编码相关的api

但通过 charset 进行编码的设置后,请求返回的结果仍然是乱码,无奈只能寻求其他的解决方案。

在后续的反思当中,觉着事情没这么简单,经过大量版本迭代的一个优秀的http库怎么会由如此弱鸡的问题?最后发现是api调用循序的问题导致无法根据指定的编码格式对响应的数据进行解码,详细请看 方案2 的过程描述。

解决方案

方案1

使用 .readToBytes() 以 bytes 形式结果获取响应的数据,然后再将 bytes 转为 gb2312 编码的 String 字符串,最终得到预期编码的结果,代码如下

Session session = Requests.session();
//发送请求
byte[] readToBytes = session.post(url)
	//设置请求头
	.headers(headers)
	//请求表单
	.body(formData)
	//发送请求
	.send().readToBytes();
//将请求结果进行解码
try {
	String gb2312 = new String(readToBytes, "gb2312");
	System.out.println(gb2312);
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
}

执行结果如下

成功获取解析带有中文的响应结果。

方案2

而在提出 方案1 的解决方案后又想到可能是因为 api 调用顺序的问题,于是翻阅到了一篇文章,发现对于编码的案例是在 .send() 之后调用了 withCharset() 而 .withCharset() 已被官方替换为 .charset()

由于目前网上对于这个开源类库的内容比较少,所以在这之前没有搜索到合适的案例

废话少说,直接上代码。

//发送请求
String respStr = session.post(url)

	//设置请求头
	.headers(headers)
	//请求表单
	.body(formData)
	//发送请求
	.send().charset(Charset.forName("gb2312")).readToText();
System.out.println(respStr);

响应结果如下

image.png

官方给出的解释如下

image.png

由于之前没有仔细阅读官方的文档,耗进去了不少的时间去去寻找其他的解决办法(机翻的英文有点曲解了意思,奈何纯英文的文档又看不懂)

😁 认识作者

作者:👦 LCyee ,全干型代码🐕

自建博客:https://www.codeyee.com

记录学习以及项目开发过程中的笔记与心得,记录认知迭代的过程,分享想法与观点。

优快云 博客:https://blog.youkuaiyun.com/codeyee

记录和分享一些开发过程中遇到的问题以及解决的思路。

从 Non-Unicode 到 Unicode:ABAP 程序切换的坑、原理与工程化落地指南 摘要 老SAP系统中ABAP程序员常假设1字符=1字节,导致大量代码依赖单字节处理逻辑。Unicode系统的引入彻底改变了字符长度、偏移量等底层认知,强制要求程序遵循Unicode规则。关键问题包括:字符/字节语义混淆、结构体访问风险、以及ABAP语言版本的门槛限制。迁移时需要重点关注字符串处理、二进制协议解析等场景,利用UCCHECK、RSUNISCAN_FINAL等工具扫描风险,并通过持续集成机制确保代码质量。建议在Non-Unicode阶段就启用unicode_check参数模拟严格模式,分批次修复问 阅读详情

相关推荐

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。

解决方案:“Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。 添加getchar();代码块解决无法查找或打开PDB文件。 错误提示: “Project1.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。 “Pro...

m0_46523403的博客 6418

java第三方接口基于 dongliu

java请求第三方接口 直接使用jar包,不需要再一次造轮子 /** 需要导入的jar包 net.dongliu requests 4.18.1 */ package com.utils.httputil; import com.alibaba.fastjson.JSON; import net.dongliu.requests.Requests; import java.nio.ch...

Zhang_1994_bf的博客 1220

宇树G1双足机器人SLAM开发环境搭建实战指南

SLAM(同步定位与建图)是机器人自主导航的核心技术。在双足人形机器人平台上,由于运动模型复杂、机身晃动带来高频IMU噪声,SLAM开发对环境配置和依赖管理提出了更高要求。以宇树G1为例,系统阐述如何通过Ubuntu 20.04、ROS Noetic与Docker容器化方案构建可复现的SLAM开发环境。先介绍依赖分层管理与版本锁定原理,再深入catkin工作空间编译、传感器驱动集成、网络与多机通信配置等工程实践,最后提供常见问题排查与避坑指南。这套方法论不仅适用于G1,也可迁移至其他双足或轮式机器人平台,帮

weixin_32025789的博客 268

net.dongliu.requests

requests 是http 请求库,有丰富的API。 git 地址:https://github.com/hsiafan/requests   maven 配置: &lt;dependency&gt; &lt;groupId&gt;net.dongliu&lt;/groupId&gt; &lt;artifactId&gt;requests&lt;/artifactId&...

dxh0823的专栏 5184

分布式定时任务(XXL-JOB)整合达梦数据库 带源码

背景 1. 因公司需要可视化管理配置调度任务,查询项目选择XXL-JOB,它是开源项目,入手很简单,详情可以参考官方文档; 2. 因项目的机密性,选择数据库为国内知名的达梦数据库7,与Java项目的整合详情可以参考SpringBoot 集成 达梦数据库 maven依赖本地jar包; 3. 因XXL-JOB暂时没有找到集成达梦数据库的案例,博主自己整合DM7踩过很多的坑,特此整合一个简单可直接...

艾斯-李的博客 3814

防雷防浪涌电路设计

通信线路或者电源线路通常会铺设到户外,一旦线路铺到户外后,就需要考虑防雷的问题了,那么怎么设计保护电路,能够防止雷电等浪涌对电路的破坏呢?

manhuami2007的博客 1万+

Java实现http请求-requests全面解读

# requestsHttp请求工具类## 接口文档网址https://github.com/zhangjingpu/requests## 所需Maven依赖包```pom&lt;dependency&gt;    &lt;groupId&gt;net.dongliu&lt;/groupId&gt;    &lt;artifactId&gt;requests&lt;/artifactId&gt; ...

m0_38050551的博客 6116

【AUTOSAR-DCM】-3.1-将CDD导入CFG并查看$22服务配置变化(UDS诊断DID带一个Data)

案例背景:(共8页精讲) 在《【UDS诊断描述文件CDD】-3.2-编辑CDD给$22服务创建一个带一个Data的DID(dataIdentifier)数据标识符》中,适应使用CANdela Studio在CDD中创建一个带一个Data的DID(dataIdentifier)数据标识符,见图0-1。现在我们将该CDD文件导入到CFG(DaVinci Configurator),看看配置会发生哪些变化。 图0-1 目录 1 将诊断描述文件CDD导入CFG(DaVinci Configurator.

「汽车电子助手」的博客 1633

Requests 模块中文文档(六)

原文链接 -&gt; 传送门 The API Documentation / Guide(4) 目录 The API Documentation / Guide(4) 十、迁移到 1.x 十一、迁移到 2.x 十、迁移到 1.x 本节详细介绍 0.x 和 1.x 的主要区别,减少升级带来的一些不便。 API 变化 1. Response.json 现在是可调用的并且不再是响应体的...

来自江南的你的博客 658

文本分析-使用jieba库进行中文分词和去除停用词(附案例实战)

本文将手把手教会你使用jieba库进行中文分词和去除停用词,这是学会文本分析的必经之路!

m0_64336780的博客 4万+

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

高效批量转换Java接口为MCP服务:降低重复劳动的实战指南

专注于编程、AI、人工智能等多个领域内容研究和分析 723

python网络爬虫——requests包

在左侧的资源中找到需要请求的网页,单击需要请求的网页,在heades(标头)中可以看到requests headers(请求标头)的详细信息。除了GET请求外,有时还需要发送一些编码为表单的形式的数据,如在登录的时候请求就位post,因为如果用get请求,密码就行显示在URL中,这个非常不安全。在网络爬虫中,静态网页的数据比较容易获取,因为所有数据都呈现在网页的HTML代码中。requests并不会给予定制的请求头headers的具体情况改变自己的行为,只是在最后的请求中,所有的请求头信息都会被传递进去。

maizeman126的博客 3177

FPGA纯Verilog实现I²C主机控制器与EEPROM读写

I²C是一种广泛应用的同步串行总线协议,用于连接微控制器与EEPROM、传感器等低速外设。其核心原理包括开漏结构、主从通信机制、START/STOP时序及ACK/NACK应答流程。技术价值在于硬件资源占用少、布线简洁、支持多从机扩展,特别适合FPGA嵌入式系统中轻量级外设控制。典型应用场景涵盖工业数据存储、配置参数持久化及实时传感器接口。本文基于Xilinx Spartan-6 FPGA,采用纯Verilog HDL实现参数化I²C主机控制器与AT24C02 EEPROM读写验证,深入解析状态机设计、SDA

weixin_33557333的博客 119

java 网络编程

package com; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; i

MAGANG255的博客 543

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

使用JSON报的一个错误java.lang.ClassNotFoundException

====>我的新浪小铺 以前在做项目的时候就曾接触过json的技术,但那个时候是项目经理把所有该配制的都配了,工具类也提供了,如何使用也跟我们说了,那个时候只是觉得很好用,倒没有研究过。 今天自己写了一个json的例子,可以一调用就出了问题,报下面这个异常: java.lang.classnotfoundexception: org.apache.commons.lang.exception

javazhuanzai的专栏 811

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java Https工具类,Java Https Post请求

io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.SecureRandom; import java.security.cert.CertificateException; import java.security.cert.X509C

蕃薯耀的博客 2748

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Requests函数返回值乱码问题解决

解决Python返回值中文乱码问题的几种简单方法

花花彩虹糖 2648

java调用

这是个大坑啊,坑我好久。初学者表示很难受。首先创建想要调用的那个方法类的对象

qianshuidongliu的博客 326

Java窗口

哟,这个还没学,等在下笔记记好了在来发布,皮一下很舒服。

qianshuidongliu的博客 538

Spring AOP拦截器调用的实现

本节一起学习Spring AOP拦截器调用的实现在Spring AOP通过JDK的代理方式或者CGLIB方式生成代理对象的时候,相关的拦截器已经配置到代理对象中了,拦截器在代理对象中起作用是通过对这些方法的回调完成的。如果是JDK的Proxy生成代理对象,那么需要通过InvocationHandler来设置拦截器回调,如果是使用CGLIB,则通过DynamicAdvisedInterceptor完...

dxh0823的专栏 1228

IDEA打包jar-解决错误: 找不到或无法加载主类 main

学习大佬们开发安全小工具,打包jar解决错误: 找不到或无法加载主类 main 1 Maven方式 遇到报错”找不到或无法加载主类 main“ 解决方案 一定加入<build> <plugins>中的插件,这里需要注意的是 <mainClass>Main</mainClass>,这里填写的路径为/src/main/java下开始写的 <?xml version="1.0" encoding="UTF-8"?> <proj.

问题很多的小明 2万+

python学习之 requests爬虫导致的中文乱码

python requests库 爬虫 中文乱码

sentimental_dog的博客 1万+

2.requests两种方式的简单实践(上)

2.1.get方式获取单页面数据 eg:如我们想获取中国旅游网站的首页所有的标题和链接 方法1:get方式 pip install requests #安装requests库 import requests #加载库 url='http://www.cntour.cn/' #以中国旅游网站为例 strhtml=requests.get(url) #此时strhtml只是一个url对象 ...

小咸鱼gogogo~~ 608

YApi使用进阶说明 - script AES RSA

YApi使用进阶说明 AES RSA Pre-request Script 使用说明 查看源码中 context.utils 的功能支持 context.utils = Object.freeze({ _: _, CryptoJS: CryptoJS, jsrsasign: jsrsasign, base64: utils.base64, md5: utils.md5, sha1: utils.sha1, sha224: utils.sha224, sha256:

liudongroot的博客 1437

使用requests下载文件

普通下载 以哔哩哔哩壁纸站为栗子 通过开发者模式找到该图片的url,例如选中图片的链接为https://i0.hdslb.com/bfs/album/1eab364136f7dc024eac1d663bb843c43c996798.jpg import requests url='https://i0.hdslb.com/bfs/album/1eab364136f7dc024eac1d663bb...

weixin_44350621的博客 5219

InnoDB 内存结构总览:Change Buffer、AHI 与 Log Buffer

本文系统梳理InnoDB内存结构中的ChangeBuffer、Adaptive Hash Index(AHI)与LogBuffer。ChangeBuffer缓存二级索引页不在内存时的变更,减少随机IO,仅在页加载时合并;聚簇索引修改立即执行,因数据本身不可延后。AHI基于高频等值查询自动构建哈希索引,加速定位,仅支持等值操作。LogBuffer为redo log内存缓冲,配合磁盘日志实现崩溃恢复。三者均服务于性能优化,其中ChangeBuffer与AHI共享BufferPool空间,而LogBuffer独立

bksczm的博客 289
上一篇: 微服务[学成在线] day20:项目总结
下一篇: 通过 Java 反射复用 MyBatis Plus 的 QueryWrapper 条件值
cory_lin
博客等级 码龄7年 22粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值