IntelliJ字符串拼接问题:调用服务时URL非法字符报错
解决URL日期参数引发的“Illegal character in scheme name”错误
嘿,我来帮你搞定这个问题!你遇到的这个报错,核心原因是URL里的双引号"和空格都是非法字符——直接用引号包裹日期、或者简单用单引号/加号拼接根本没解决这些非法字符的问题,所以错误才会一直出现。
给你几个靠谱的解决办法:
方法1:手动修正URL参数(快速临时方案)
直接去掉日期的双引号,并且把空格换成URL编码后的%20,修正后的代码如下:
serviceCall("""http://example.com/books/report?name=abc¶m=env=deck&time=13%20Apr%202010&acct=N&id=wre23""")
这种方式适合快速测试,但如果日期是动态生成的,还是用下面的方法更稳妥。
方法2:用URL编码工具处理参数(推荐)
不管是Kotlin还是Java,都有现成的工具类帮你对参数进行URL编码,避免手动处理的失误。比如Kotlin里可以这样写:
import java.net.URLEncoder import java.nio.charset.StandardCharsets val dateStr = "13 Apr 2010" // 对日期字符串进行URL编码 val encodedDate = URLEncoder.encode(dateStr, StandardCharsets.UTF_8.name()) // 用编码后的日期拼接URL serviceCall("""http://example.com/books/report?name=abc¶m=env=deck&time=$encodedDate&acct=N&id=wre23""")
方法3:用URIBuilder构建URL(最安全)
如果你的参数比较多,或者经常需要调整,用URIBuilder来构建URL是最不容易出错的,它会自动帮你处理编码问题:
// Java示例,Kotlin也可以调用同样的类 import java.net.URIBuilder; URI uri = new URIBuilder() .setScheme("http") .setHost("example.com") .setPath("/books/report") .addParameter("name", "abc") .addParameter("param", "env=deck") .addParameter("time", "13 Apr 2010") .addParameter("acct", "N") .addParameter("id", "wre23") .build(); serviceCall(uri.toString());
之前你用单引号或者加号拼接没用,是因为这些操作只是改变了字符串的拼接方式,但没处理URL里的非法字符(双引号、空格),所以错误依然存在。用上面的方法处理后,这些非法字符会被转换成URL允许的格式,自然就不会报错啦。
内容的提问来源于stack exchange,提问作者uniXVanXcel
相关产品推荐
相关产品推荐

