通过HttpClient发起请求时
GET http://xxx/v0.1/jenkins?result=FAILURE&project=测试&url=http://xxx/job/job_name/1/consoleText
结果报错:
java.lang.IllegalArgumentException: Invalid uri
'http://xxx/v0.1/jenkins?result=FAILURE&project=测试&url=http://xxx/job/job_name/1/consoleText':
Invalid query
非法查询错误,刚开始以为是url这个参数里面的值有问题,然后去掉结果还是一样。后来发现原来是参数中有中文,没有对中文转码导致。
下面是我专门用于动态获取拼装参数封装的一个方法:
private String parseQueryParameter(String queryParameter){
StringBuilder stringBuilder = new StringBuilder();
JSONObject queryParameterJSONObject = JSONObject.parseObject(queryParameter);
Set<String> queryParameterJSONObjectSet = queryParameterJSONObject.keySet();
for (String queryParameterJSONObjectKey : queryParameterJSONObjectSet) {
String queryParameterJSONObjectValue = queryParameterJSONObject.getString(queryParameterJSONObjectKey);
queryParameterJSONObjectValue = URLEncoder.encode(queryParameterJSONObjectValue, "UTF-8");// 中文转码
stringBuilder.append("&").append(queryParameterJSONObjectKey).append("=").append(queryParameterJSONObjectValue);
}
String result = stringBuilder.toString();
if (StringUtils.isNotBlank(result)) {
result = result.replaceFirst("&", "?");
}
return result;
}
queryParameter参数JSON格式如下:
"query_parameter": {
"url": "{TAG_URL}",
"result": "{TAG_BUILD_RESULT}",
"project": "测试"
}
有没有发现,不管参数值是否都是中文,都进行转码,这样不是很合理;于是我加了一层是否为中文的判断,如果是中文则进行转码:
if (isChinese(queryParameterJSONObjectValue)) {// 判断是否含有中文
queryParameterJSONObjectValue = URLEncoder.encode(queryParameterJSONObjectValue, "UTF-8");// 中文转码
}
public static boolean isChinese(String strName) {
char[] ch = strName.toCharArray();
for (int i = 0; i < ch.length; i++) {
char c = ch[i];
if (isChinese(c)) {
return true;
}
}
return false;
}
private static boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
return true;
}
return false;
}
好了,这样发送就可以200了。