Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在HttpClient查询参数中使用某些字符时的Java9异常

在HttpClient查询参数中使用某些字符时的Java9异常
EN

Stack Overflow用户
提问于 2018-06-14 02:57:55
回答 1查看 536关注 0票数 13

这是我的代码样本。查询被编码为UTF-8:

代码语言:javascript
运行
AI代码解释
复制
HttpRequest request = HttpRequest.newBuilder()
    .header("content-type", "application/json;charset=UTF-8")
    .uri(URI.create("http://localhost:8080/test?param1=test%C5%84"))
    .GET()
    .build();

HttpClient.newBuilder()
    .version(HttpClient.Version.HTTP_2)
    .build()
    .send(request, HttpResponse.BodyHandler.asString(Charset.forName("UTF-8")));

运行此示例后,将得到以下异常:

代码语言:javascript
运行
AI代码解释
复制
java.lang.IllegalArgumentException: char=324
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.Huffman.codeOf(Huffman.java:559)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.Huffman.lengthOf(Huffman.java:524)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.StringWriter.configure(StringWriter.java:79)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.StringWriter.configure(StringWriter.java:62)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.IndexNameValueWriter.value(IndexNameValueWriter.java:64)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.Encoder.literal(Encoder.java:422)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.Encoder.header(Encoder.java:245)
at jdk.incubator.httpclient/jdk.incubator.http.internal.hpack.Encoder.header(Encoder.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.encodeHeadersImpl(Http2Connection.java:927)
at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.encodeHeaders(Http2Connection.java:878)
at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.encodeHeaders(Http2Connection.java:951)
at jdk.incubator.httpclient/jdk.incubator.http.Http2Connection.sendFrame(Http2Connection.java:984)
at jdk.incubator.httpclient/jdk.incubator.http.Stream.sendHeadersAsync(Stream.java:547)
at jdk.incubator.httpclient/jdk.incubator.http.Exchange.lambda$responseAsyncImpl0$8(Exchange.java:322)
at java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SSLFlowDelegate.setALPN(SSLFlowDelegate.java:164)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SSLFlowDelegate.access$200(SSLFlowDelegate.java:81)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SSLFlowDelegate$Reader.processData(SSLFlowDelegate.java:340)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SSLFlowDelegate$Reader$ReaderDownstreamPusher.run(SSLFlowDelegate.java:215)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SynchronizedRestartableTask.run(SequentialScheduler.java:175)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:147)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$TryEndDeferredCompleter.complete(SequentialScheduler.java:315)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$CompleteRestartableTask.run(SequentialScheduler.java:149)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SSLFlowDelegate$Reader.incoming(SSLFlowDelegate.java:242)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SubscriberWrapper.incomingCaller(SubscriberWrapper.java:388)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SubscriberWrapper.onNext(SubscriberWrapper.java:343)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SubscriberWrapper.onNext(SubscriberWrapper.java:58)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.read(SocketTube.java:739)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowTask.run(SocketTube.java:171)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler$SchedulableTask.run(SequentialScheduler.java:198)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:271)
at jdk.incubator.httpclient/jdk.incubator.http.internal.common.SequentialScheduler.runOrSchedule(SequentialScheduler.java:224)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$InternalReadSubscription.signalReadable(SocketTube.java:675)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$InternalReadPublisher$ReadEvent.signalEvent(SocketTube.java:829)
at jdk.incubator.httpclient/jdk.incubator.http.SocketTube$SocketFlowEvent.handle(SocketTube.java:243)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.handleEvent(HttpClientImpl.java:769)
at jdk.incubator.httpclient/jdk.incubator.http.HttpClientImpl$SelectorManager.run(HttpClientImpl.java:731)

char=324的意思是从查询中解码ń

当我读取堆栈跟踪时,我在类中找到了jdk.incubator.http.Stream<T>这个方法:

代码语言:javascript
运行
AI代码解释
复制
private void setPseudoHeaderFields() {
    HttpHeadersImpl hdrs = requestPseudoHeaders;
    String method = request.method();
    hdrs.setHeader(":method", method);
    URI uri = request.uri();
    hdrs.setHeader(":scheme", uri.getScheme());
    // TODO: userinfo deprecated. Needs to be removed
    hdrs.setHeader(":authority", uri.getAuthority());
    // TODO: ensure header names beginning with : not in user headers
    String query = uri.getQuery();
    String path = uri.getPath();
    if (path == null || path.isEmpty()) {
        if (method.equalsIgnoreCase("OPTIONS")) {
            path = "*";
        } else {
            path = "/";
        }
    }
    if (query != null) {
        path += "?" + query;
    }
    hdrs.setHeader(":path", path);
}

在该方法中,使用了uri.getQuery(),给出了解码后的查询,并导致了上述异常。

当我在调试模式中使用uri.getRawQuery()时(这给了我们编码的查询),一切都很好。

我的问题是:这是错误还是故意使用?如果它不是一个bug,我如何避免异常?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-14 03:57:47

这是一个bug:

java.lang.IllegalArgumentException with jdk.incubator.httpclient当使用一些UTF-8字符时,有些UTF-8字符(如"š“)不能与HttpClient一起使用。然而,像“”这样的其他人可能是。

请参阅:https://bugs.openjdk.java.net/browse/JDK-8201238

Java 9/10 HttpClient是孵化的。这是,不是生产准备好的。它在包名中写得非常清楚。因此,它很有可能包含bug。

它将在Java11 (目前定于2018年9月25日发行)中作为9月321的一部分正确发布。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50855889

复制
相关文章
HttpClient在HTTP协议接口测试中的使用
TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式:
流柯
2018/08/30
1.9K0
httpclient参数配置
默认的话,是从response里头读timeout参数的,没有读到则设置为-1,这个代表无穷,这样设置是有点问题了,如果是https链接的话,则可能会经常报
code4it
2018/09/17
7.1K0
varchar在字符集不同情况下导致的查询异常
对于那些删除了尾随字符或比较忽略了尾随字符的情况,如果列具有需要唯一值的索引,则在列中插入仅在尾随字符数量上不同的值将导致重复键错误。
保持热爱奔赴山海
2023/03/16
6990
2018年终总结
整体而言,今年技术层面稍微有点拓宽,跨入了外表看上去高大上的流式计算领域,打开了另外一扇窗;而基于java的分布式/微服务领域,今年变化比较大,spring cloud netflix的部分组件宣布将要进入维护阶段,而国内spring cloud alibaba组件逐渐活跃起来,目前看来处于PublicEvolving阶段;而java自身也处在不断进化中,今年发布了java10及java11,明年java12也要来了,版本变化非常快。稍不留神就跟不上技术更迭了。
code4it
2018/12/31
1.3K0
2018年终总结
在XCode中如何使用高级查询
对于一个框架来说,仅有基本的CURD不行,NewLife.XCode同时还提供了一个非常宽松的方式来使用高级查询,以满足各种复杂的查询需求。 (本文同样适用于其它任何数据访问框架) 先上图看一个复杂查询的效果图: image.png 这里有8个固定的查询条件和1个模糊查询条件,加上多表关联(7张表)、分页、统计,如果用传统的做法,这个查询会非常的复杂。 这个页面有XCode实现,核心查询部分共100多行代码,包括一个查询、一个总记录数分页、两个统计(就是业绩、提成等的统计),看看高级查询代码: image
大石头
2018/01/15
5.3K0
在XCode中如何使用高级查询
在https中传递查询字符串的安全性
译者:java达人-卍极客 英文链接: http://blog.httpwatch.com/2009/02/20/how-secure-are-query-strings-over-https/(点击
java达人
2018/01/31
2.3K0
在https中传递查询字符串的安全性
Git提交时过滤某些文件
4.这个文件处理好以后,如果感觉没有作用,说明你在创建这个文件之前就已经add过了,这时执行
Arno
2019/12/06
2.9K0
Git提交时过滤某些文件
go: 字符串format时使用命名参数(占位符)
在python中,可以在format的时候对占位符命名。这在参数非常多的时候,且顺序不定时非常明确。 例如:
超级大猪
2021/12/24
2.9K0
axios传递参数内容为json字符串时引发400 bad request异常解决
axios会对params中的对象类型值转换为json并进行url编码,但是编码不会处理方括号:’[’, ‘]’
路过君
2022/04/13
8910
java9 gc log参数迁移
有如上三种,其中指定file的话,可以使用%p变量表示当前jvm的pid,用%t表示jvm的启动时间戳。比如
code4it
2018/09/17
1.9K0
网关使用 Apache HttpClient 连接池出现异常
两个主机建立网络连接是一个比较复杂的过程,涉及到多个数据包的交换。建立网络连接本身就很耗时间,而 Http 连接需要三次握手,开销就更大。但是可以直接使用已经建立好的 Http 连接,那么花费就比较小。耗时更短,从而提高访问的吞吐量。
BUG弄潮儿
2022/06/30
9920
在模版类里使用自己时可以省略模版参数
用户10551528
2023/10/18
1500
在模版类里使用自己时可以省略模版参数
[TCP/IP] TCP在listen时的参数backlog的意义
linux内核中会维护两个队列:   1)未完成队列:接收到一个SYN建立连接请求,处于SYN_RCVD状态   2)已完成队列:已完成TCP三次握手过程,处于ESTABLISHED状态   3)当有一个SYN到来请求建立连接时,就在未完成队列中新建一项。当三次握手过程完成后,就将套接口从未完成队列移动到已完成队列。   4)backlog曾被定义为两个队列的总和的最大值,Berkely实现中的backlog值为上面两队列之和再乘以1.5。   5)如果当客户端SYN到达的时候队列已满,TCP将会忽略后续到达的SYN,但是不会给客户端发送RST信息,因为此时允许客户端重传SYN分节。如果启用syncookies (net.ipv4.tcp_syncookies = 1),新的连接不进入未完成队列,不受影响 6)backlog 即上述已完成队列的大小, 这个设置是个参考值,不是精确值. 内核会做些调整
唯一Chat
2019/09/10
1.2K0
[TCP/IP] TCP在listen时的参数backlog的意义
使用子查询时应当注意的
在一个查询中: UPDATE a SET a.scts = b.v1, a.YCYL = b.v2, a.YCSL = b.v3 FROM kfdbsyy a,           (SELECT f_wellnumber, COUNT(*) AS v1, SUM(f_fule) AS v2,                SUM(f_totalliquid - f_fule) AS v3          FROM (SELECT *                  FROM CY_WELLRECOR
用户1075292
2018/01/23
2.1K0
python的中异常处理处理ZeroDivisionError异常处理 FileNotFoundError 异常异常时保持静默
Python 使用被称为 异常 的特殊对象来管理程序执行期间发生的错误。每当发生让 Python 不知所措的错误时,它都会创建一个异常对象。如果你编写了处理该异常的代码,程序将继续运行;如果你未对异常进行处理,程序将停止,并显示一个 traceback ,其中包含有关异常的报告。异常是使用 try-except 代码块处理的。 try-except 代码块让 Python 执行指定的操作,同时告诉 Python 发生异常时怎么办。使用了 try-except 代码块时,即便出现异常,程序也将继续运行:显示你编写的友好的错误消息,而不是令用户迷惑的 traceback 。
章鱼喵
2018/09/26
6.2K0
编程篇(001)-如何获取浏览器 URL 中查询字符串中的参数?
首先要知道location是BOM对象之一,既是window对象的属性,又是document对象的属性,即: window.location == document.location 结果为true
齐丶先丶森
2022/05/12
3.9K0
SpringBoot中的异常处理和参数校验
兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容。
一个程序员的成长
2020/04/21
8260
SpringBoot中的异常处理与参数校验
兄弟们好,这次来跟老铁交流两个问题,异常和参数校验,在说参数校验之前我们先来说异常处理吧,因为后面参数的校验会牵扯到异常处理这块的内容。
一个程序员的成长
2020/11/25
9450
原 荐 Java9之HttpClientAP
Java9之HttpClientAPI实战详解 前言 相信关注java9的小伙伴们都知道java9版本内置模块提供了Http功能,当然并不是说之前jdk之前并不支持,那么这次更新又多了什么呢?或者是解决了什么问题? 说明 自JDK 1.0以来,Java已经支持HTTP/1.1。 HTTP API由java.net包中的几种类型组成。 现有的API有以下问题: 它被设计为支持多个协议,如http,ftp,gopher等,其中许多协议不再被使用。 太抽象了,很难使用。 它包含许多未公开的行为。 它只支持一
石奈子
2018/06/13
1.3K0
点击加载更多

相似问题

Java9 HttpClient SSLHandshakeException

11

在HttpClient中模拟F#时参数计数失配异常

18

使用httpclient时系统异常

22

StringConcatFactory -Java9中的异常

30

带有sendAsyncMulti / multiResponseAsync的Java9 HttpClient

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档