java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

1、代码报错信息:java.lang.IllegalArgumentException: Invalid uri 'http://XXXXX接口地址NReq?serviceCode=参数1&channel=参数2&channelSerial=参数3&version=参数4&reqParamsBody={"province":"011","screenheight":"1130","screenwidth":"640","mobile":"参数"}': Invalid query

2、报错的原因:参数中出现了{}符号。

3、原因分析:

首先看下创建GET方法实例的代码:

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

出错的就是这行代码,我们继续往下分析, 

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

ok,我们继续往下走,进入new URI(uri, true, charset)方法

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

OK,继续往下走,进入this.parseUriReference(s, escaped)方法,

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

如上图,最终我们看到的异常信息就是在此处抛出的异常,参数:uric是一个BitSet(不懂BitSet的私下百度吧,这里不做过多说明),它包含的数据为:

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE这些数字代表的是ASCII表中对应的字符,不知道的同学可以查看一下ACSII表,看一下这些数字具体代指哪些字符(提前指出"{}"这两个字符不在这些数值所表示的字符范围之内),然后我们点进this.validate(this._query, uric)方法,

java代码以GET方式发送Http请求中的创建GET方法实例时:throw new URIException("Invalid query") java.lang.IllegalArgumentE

方法中的for循环generous就是我们上面说的uric(一个BitSet),component 代指我们请求URL中"?"后面的所有字符信息,在这里是一个字符数组,循环该字符数组,并在generous中判断该字符是否存在,如果我们参数信息中的每一个字符都在generous中存在,则证明我们的请求URL是一个正确的URL,否则就说明我们的URL不是一个正确的URL。我遇到的问题就是我的请求参数中包含了"{}"这两个字符,所以被判定为错误的URL。同时如果谁遇到这个问题,可以直接使用POST方式发送请求。

说到这里可能会有同学说,如果我参数前面的信息包含有特殊字符怎么办?OK,有问题的同学可以跟一下代码,仔细的研究一下代码中是如何一步一步判断一个URL是否为一个正确的URL的,这里我就不做过多的说明了。

希望可以给遇到这个问题的同学提供一点点的帮助,同时已上所有的观点仅代表我自己的观点。如有不妥还请多多指正。欢迎转载,但请标明出处。

祝所有人生活开心。