Jsoup 提交参数乱码,解决思路,解决过程及解决方案

soゝso 2019-06-11 23:26:42 982

最近在开发ICP备案查询网,为了保持运行的稳定性,虽然我已经拥有不用验证码的ICP备案查询:https://www.sojson.com/beian/

但是还是不能放弃域名(www.xbeian.com),故开发一套产品出来。下面来一个不成型的界面当封面图吧。


废话不说了,开始这篇的分享内容。

需求介绍

1.从工信部页面(“http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_showPage.action”)获取验证码。

2.填写查询内容。

3.填写验证码,提交查询内容,获取查询结果。

遇到的问题

中文参数问题:

我们现在项目一般都是UTF-8的了,但是这个页面是GBK的。关于编码可以自己看请求头。

有一个头痛的问题就是汉字会编码,就是表单提交编码问题,而  Jsoup  目前自身没有指定编码的方法。。

    页面GBK编码—> URLEncode 编码—>提交到服务器

刘飞” GBK的URLEncode编码后为 “%C1%F5%B7%C9”,如果你直接转码成这样,通过Jsoup.data(key,value)提交后,会变成“%25C1%25F5%25B7%25C9”,没错,他又一次urlencode,并且是UTF-8编码的。

辗转反侧测试了很多次,还是不行。

上代码,这个代码非中文参数,没毛病。

Connection jsoup = Jsoup.connect("http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_searchExecute.action")
        .header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3")
        .header("Pragma", "no-cache")
        .header("Cache-Control", "no-cache")
        .header("Upgrade-Insecure-Requests", "1")
        .header("Connection", "close")
        .header("Host", "www.beian.miit.gov.cn")
        .header("Referer", "http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_showPage.action")
        .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0")
        .header("Accept-Encoding", "gzip, deflate")
        .header("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
        .header("Cookie", session);
jsoup.data("mainUnitNature","-1");
jsoup.data("certType","-1");
jsoup.data("mainUnitCertNo","");
jsoup.data("verifyCode",vcode);
jsoup.data("condition",type);

switch (type){
    case "0":
        jsoup.data("siteName",java.net.URLEncoder.encode(qtext, "gbk"));
        break;
    case "1":
        jsoup.data("siteDomain",qtext);
        break;
    case "2":
        jsoup.data("siteUrl",qtext);
        break;
    case "3":
        jsoup.data("mainLicense",java.net.URLEncoder.encode(qtext, "gbk"));

        break;
    case "4":
        jsoup.data("siteIp",qtext);
        break;
    case "5"://中文参数提交
        //这里转成GBK,但是URLEncode的编码它是utf-8,所以有问题。
        //直接提交GBK的URLEncode编码结果,它还是再次URLEncode编码,也是utf-8编码。
        jsoup.data("unitName",new String(qtext.getBytes("gbk")));//java.net.URLEncoder.encode(qtext, "gbk")
        break;
}
jsoup.timeout(50000);
Document doc = jsoup.post();

Jsoup解决思路

我们知道  Jsoup  支持解析IO,直接解析  HTML  ,或者  URL  对象都可以。用这些我知道能解决,但是我还是想直接通过  Jsoup  来解决,尝试了很久,网上看了很多资料,看了些许源码,最终还是失败了。

当我们遇到Http请求出现问题了,而又不容易看出问题所在,那么就建议直接用抓包工具,把正常的请求和你模拟的请求进行对比。

对比有几个点:header、text参数、form参数、cookie等等,一般是出在参数、header、cookie问题。本次是参数问题,下面截图对比。


查询资料的时候比较滑稽的是,发现百度里,搜索  Jsoup  乱码,我曾经写的一篇关于  Jsoup  乱码是No 1排名。


Jsoup参数乱码解决方案

不得不借助  Httpclient  等  Http  请求解决。不管采用什么  Http  开源包请求,只要能getInputStream()或者直接拿到Html Dom结构也可以,因为  Jsoup  支持parse IO,也支持parse HTML

我自己有自己的Http 封装的工具。为了大家方便使用,我写了一遍较为原始的Http请求,代码如下,测试好使。

try {
	OutputStream outStream = null;
	OutputStreamWriter  out = null;
	URL realUrl = new URL("http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_searchExecute.action");
	// 打开和URL之间的连接
	HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
	// 发送POST请求必须设置如下两行
	conn.setDoOutput(true);
	conn.setDoInput(true);
	conn.setRequestMethod("POST");// 提交模式
	conn.addRequestProperty("Connection","close");
	conn.addRequestProperty("Host", "www.beian.miit.gov.cn");
	conn.addRequestProperty("Content-type", "application/x-www-form-urlencoded; charset=gbk");
	conn.addRequestProperty("Referer", "http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_searchExecute.action");
	conn.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0");
	conn.addRequestProperty("Cookie", "__jsluid=3f1f3c28f6c3af8b9a7f93418aac4cf1; Hm_lvt_af6f1f256bb28e610b1fc64e6b1a7613=1560086695; Hm_lpvt_af6f1f256bb28e610b1fc64e6b1a7613=1560088421; JSESSIONID=xDlE3rmJFa4RoGaxI_QbVvdJNKbuD-iG_B3Avs_ypkTwQIIoiF-D!-1797433545");
	outStream = conn.getOutputStream();
	out = new OutputStreamWriter(outStream);
        //参数输出
	out.write("certType=-1&condition=5&mainUnitNature=-1&unitName=" + java.net.URLEncoder.encode("刘飞", "gbk") +"&verifyCode=666666");
	// flush输出流的缓冲
	out.flush();

	Document doc = Jsoup.parse(conn.getInputStream(), "GBK", "http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_showPage.action");

	System.out.println(doc.html());
} catch (IOException e) {
	e.printStackTrace();
}

秀一下我封装的Http工具类请求,我比较喜欢链式编程。

String res = Http.create("http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_searchExecute.action")
        .cookies("cookie")
        .charset("gbk")
        .head("Referer","http://www.beian.miit.gov.cn/icp/publish/query/icpMemoInfo_showPage.action")
        .head("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36")
        .head("Host","www.beian.miit.gov.cn")
        //提交参数
        .bodys("siteName=&siteDomain=&siteUrl=&mainLicense=&siteIp=&condition=5&unitName=%D6%DC%B0%D8%B3%C9&mainUnitNature=-1&certType=-1&mainUnitCertNo=&verifyCode=wgqk3k")
        .post()
        .send()
        .getResponse()
        .getResult();

Document doc = Jsoup.parse(res);

结果是可以参数编码为GBKURLEncode后提交正确。也对比了抓包,一模一样。

最终还是依赖Http组件来解决的,如果  Jsoup  解决了的同学,请下面留言,我来补充。


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/331.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

相关文章
JSOUP教程,JSOUP 乱码处理,JSOUP生僻字乱码解决方案
N多系统单点登录,实现、解决方案。四种解决方案
MySQL数据库存储过程字符集问题,乱码解决办法
使用zxing解析二维码抛出com.google.zxing.NotFoundException 解决方案
火狐(Firefox )浏览器提示。此链接是不受信任的,站长和用户的解决方案。SSL申请
Java API接口返回不是JSON的解决方案,SpringMVC返回JSON配置。
Java 之 HTTP请求乱码解决,GZIP 返回值乱码解决
Websocket(一)~ Spring Websocket Session共享解决思路
IE、Firefox对同一域名访问并发限制,及解决优化方案
解决IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法,解决后支持HTML5
最新文章
阿里云和腾讯云哪个好? 91
2019年9月16日新浪短链API已经恢复使用,新浪短链服务官方已经宣布停用。本站已经攻克 1381
2019年 中秋节、国庆节放假通知来了,拼假攻略 182
记一次小失误导致的大事件,Mysql SQL Error: 0, SQLState: null 排查过程 318
Springboot Maven 增加本地依赖包,Springboot Maven打包本地包 174
Java 获取图片属性、获取图片EXIF属性操作方法[metadata-extractor] 87
又拍云(Upyun)CDN、云存储刷新链接缓存,API实例讲解 123
Linux Centos 使用 Redis service 启动,Redis service 脚本编写 181
恭喜SOJSON获得阿里云618“上云接力赛”第一名,获得代金券6.18万 435
Springboot 集成Freemarker 自定义标签解决方案 1267
最热文章
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 184109
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 162726
Elasticsearch教程(四) elasticsearch head 插件安装和使用 142589
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 100843
Elasticsearch教程(六) elasticsearch Client创建 83033
Elasticsearch教程(一),全程直播(小白级别) 80466
Elasticsearch教程(二),IK分词器安装 78366
Elasticsearch教程(八) elasticsearch delete 删除数据(Java) 77561
Elasticsearch教程(五) elasticsearch Mapping的创建 71934
免费天气API,天气JSON API,不限次数获取十五天的天气预报 71928

骚码加入我们 / 千人QQ群:259217951

入群需要5元,如果没有QQ钱包,可以先Alipay、微信,赞助然后加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

正在加载... ...