通过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); SetqueryParameterJSONObjectSet = 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了。