博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用HttpClient GET请求时报Invalid query错误
阅读量:6582 次
发布时间:2019-06-24

本文共 2500 字,大约阅读时间需要 8 分钟。

hot3.png

 通过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
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了。

转载于:https://my.oschina.net/lienson/blog/1541201

你可能感兴趣的文章
myeclipse注册码生成器
查看>>
怎样快速学好PHP技术之PHP学习方法总结
查看>>
iOS App间相互跳转漫谈 part2
查看>>
Java CAS 原理剖析
查看>>
ISCC2014 writeup
查看>>
Kotlin 知识梳理(1) Kotlin 基础
查看>>
js正则表达式
查看>>
iOS socket通信,编解码,浮点型数据解析
查看>>
手把手教你如何新建scrapy爬虫框架的第一个项目(下)
查看>>
前端基础15:JS作用域基础
查看>>
Linux系统相关命令
查看>>
BATJ面试必会之 Spring 篇(一)
查看>>
表驱动法
查看>>
什么是企业内训
查看>>
firefox无法显示java插件plugin
查看>>
H3C设备之OSPF DR选举
查看>>
List grantee right in oracle
查看>>
Activity生命周期
查看>>
通过VBS编写自动输入账号和密码、自动登录程序的脚本
查看>>
MTK APSoC SDK MT7621编译固件的快速开始
查看>>