java.lang.IllegalArgumentException: Invalid uri 'http://xxxxxx' : Invalid query 异常通过URLEncoder来解决。

本文介绍了解决HTTPClient POST请求时因URL中含有特殊字符而导致的InvalidURI及InvalidQuery错误的方法。通过使用java.net包中的URLEncoder.encode()方法对特殊字符进行转码,成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在用httpclient的POST请求时,出现以下错误。

Exception in thread "main" java.lang.IllegalArgumentException: Invalid uri 'http://xxxxxx': Invalid query

at org.apache.commons.httpclient.HttpMethodBase.<init>(HttpMethodBase.java:222)

at org.apache.commons.httpclient.methods.ExpectContinueMethod.<init>(ExpectContinueMethod.java:93)

at org.apache.commons.httpclient.methods.EntityEnclosingMethod.<init>(EntityEnclosingMethod.java:119)

at org.apache.commons.httpclient.methods.PostMethod.<init>(PostMethod.java:106)

at com.senxing.main.JsonTest.main(JsonTest.java:33)

出现了Invalid uri 和 Invalid query 应该就是接口地址中含有了特殊符号,发现url中出现了“|”这个符号,但是这个符号也不能删除掉。为什么会出现这个问题呢?

这是因为有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。

所以我们要想办法进行这些符号的转码,而java.net包中的URLEncoder.encode("\\\\|","utf-8")可以解决掉这个问题。也就是将特殊字符重新进行UTF-8编码。

这是我原来要请求的接口地址出现"|"的地方:&from=database&params=t3:208|t6&

现在改成&from=database&params=t3:208"+URLEncoder.encode("\\\\|","utf-8")+"t6&       //注:首先对"|"进行了转义。

再请求测试,问题完美解决。

特殊字符有好多,都可以通过这样的方法来解决。

 

<think>嗯,用户在使用Java的WebSocket时遇到了一个IllegalArgumentException,提示请求目标中有无效字符。错误信息里提到请求路径是/api/v1/admin/common/webSocket/{{device_id:"H010001182F0100010027"}},而RFC 7230和RFC 3986规定了合法字符。首先,我需要确定问题出在哪里。 首先,根据错误信息,请求目标中有无效字符。检查用户提供的URL,发现路径中包含大括号{}和冒号:,还有引号"。这些字符在URL中是否允许呢?根据RFC 3986,URI的合法字符包括字母、数字以及-._~等特殊符号,而其他字符如{}、:、"需要经过百分号编码。 所以,用户的URL中直接使用了未转义的特殊字符,比如大括号、冒号和双引号,导致服务器端解析时认为这是非法字符,抛出异常。接下来需要确认WebSocket客户端的连接URL是否正确处理了这些特殊字符。通常,URL中的路径参数如果需要传递特殊字符,必须使用URL编码,比如将{替换为%7B,}替换为%7D,:替换为%3A,双引号"替换为%22。或者,可能用户错误地将路径参数以JSON格式直接拼接在URL中,这是不正确的做法。 另外,用户可能误解了WebSocket连接参数的传递方式。通常,路径参数应该是简单的键值对,而不应该包含JSON结构。例如,正确的做法可能是将device_id作为查询参数,如/api/v1/webSocket?device_id=H010001182F0100010027,或者将device_id放在路径中,但确保只使用合法字符,如/api/v1/webSocket/H010001182F0100010027。如果确实需要传递JSON结构,可能需要使用URL编码,或者改为在建立连接后通过消息发送JSON数据,而不是放在URL里。 可能的解决方案包括:1)修改URL结构,避免特殊字符;2)对特殊字符进行URL编码;3)使用查询参数代替路径中的JSON结构。需要检查用户的代码,看生成WebSocket连接URL的部分是否正确处理了这些字符。例如,在Java中可以使用URLEncoder对参数进行编码,替换掉非法字符。此外,确保服务端也正确解析这些参数,可能需要服务端进行相应的解码处理。 总结问题原因:URL中包含未转义的非法字符,违反了RFC标准。解决办法是正确编码或调整参数传递方式。</think>### 问题分析:`Invalid character found in the request target` 的根本原因 此错误是由于 **WebSocket 连接 URL 中包含非法字符**引起的。根据 RFC 7230 和 RFC 3986 标准,URL 的路径部分(`request target`)仅允许以下字符: - 字母、数字:`A-Z`、`a-z`、`0-9` - 保留字符:`-`、`_`、`.`、`!`、`~`、`*`、`'`、`(`、`)` - 分隔符:`/`、`?`、`&`、`=`、`#` 而你的 URL 中使用了 **`{`、`}`、`"`、`:`** 等非法字符: ``` /api/v1/admin/common/webSocket/{{device_id:"H010001182F0100010027"}} ``` --- ### 解决方案 #### 1. 调整参数传递方式(推荐) **问题核心**:直接将 JSON 格式参数嵌入 URL 路径是非法操作。 **正确做法**: - **方式 1**:将参数改为**查询参数(Query Parameter)**: ```java String url = "wss://your-domain.com/api/v1/admin/common/webSocket?device_id=H010001182F0100010027"; ``` - **方式 2**:将参数放在**路径占位符**中(需服务端支持): ```java String url = "wss://your-domain.com/api/v1/admin/common/webSocket/H010001182F0100010027"; ``` --- #### 2. 对特殊字符进行 URL 编码(适用于必须保留 JSON 的场景) 如果必须保留 JSON 结构,需对非法字符进行编码: ```java import java.net.URLEncoder; String deviceIdJson = "{\"device_id\":\"H010001182F0100010027\"}"; String encodedJson = URLEncoder.encode(deviceIdJson, StandardCharsets.UTF_8); String url = "wss://your-domain.com/api/v1/admin/common/webSocket/" + encodedJson; ``` 编码后的 URL 示例: ``` wss://your-domain.com/api/v1/admin/common/webSocket/%7B%22device_id%22%3A%22H010001182F0100010027%22%7D ``` --- ### 验证与调试步骤 1. **检查编码后的 URL**: ```java System.out.println("Encoded URL: " + url); ``` 确保输出中没有 `{`、`}`、`"`、`:` 等字符。 2. **服务端兼容性**: - 服务端需支持对 URL 解码。 - 如果服务端期望 JSON 参数,建议通过 WebSocket 的 `onMessage` 传递数据,而非 URL。 --- ### 附加建议 - **避免在 URL 中传递复杂数据**:WebSocket 连接建立后,可通过 `send()` 方法发送 JSON 数据。 - **调试工具**:使用 [Postman](https://www.postman.com/) 或浏览器控制台测试 WebSocket 连接合法性。 通过以上步骤,可彻底解决 `Invalid character found in the request target` 错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值