RestTemplate/httpclient请求:请求参数中的特殊字符处理
RestTemplate/httpclient请求:请求参数中的特殊字符处理
特殊url:
url中有:SuperPNR_ID%3D202006151522247812 (%3D)
url中有:|(竖线)
http:\/\/119.254.234.92:9280\/easypay\/mobilepay.servlet?OrderAmount=1090&AppType=B2C&BankId=TENPAYGW_MINIPROGRAM&BillNo=2020061500011970&Ext1=10.221.150.211&Ext2=&Lan=CN&Msg=SuperPNR_ID%3D202006151522247812&OrderCurtype=CNY&OrderNo=202006151522389979&OrderType=1|0|&OrgId=XZAIRB2C&OrderDate=20200615&OrderTime=152228&ordername=Xizang+Airlines+e-ticket&Orderinfo=&usrid=o_57z5FJx1rlTpMSzsgsdeiEvKxc&username=&gateid=TENPAYGW_MINIPROGRAM&Version=1.0&ReturnId=id_pay_1000&SIGNATURE=f16fa3e8a299c44ebe41a0c3ea678bf6
请注意url中有%3D,还有|中竖线。
RestTemplate
在使用restTemplate请求时,会对%3D进行转义,
通过UriComponentsBuilder创建URI对象,这样RestTemplate不会自动进行urlencode
// 通过UriComponentsBuilder创建URI对象,这样RestTemplate不会自动进行urlencode UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromHttpUrl(requestUrl); 或者 UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromUriString(requestUrl); URI uri = uriComponentsBuilder.build(true).toUri();
但同时存在另一个问题,参数中有“|”,竖线,请求失败,直接报错:
java.lang.IllegalArgumentException: Invalid uri 'http://xxxxxx' : Invalid query 异常通过URLEncoder来解决。
这是需要对含有“|”竖线的,参数进行单独转码:
URLEncoder.encode("|","utf-8");
HttpClient
一样的情况,碰到参数“|”,也是会报错(虽然%3D不会被转义了)。
我们需要些个类来处理url中的参数,对"|",进行转码
public class UrlUtils { public static class UrlEntity { /** * 基础url */ public String baseUrl; /** * url参数 */ public Map<String, String> params; } /** * 解析url * * @param url * @return */ public static UrlEntity parse(String url) { UrlEntity entity = new UrlEntity(); if (url == null) { return entity; } url = url.trim(); if (url.equals("")) { return entity; } String[] urlParts = url.split("\\?"); entity.baseUrl = urlParts[0]; //没有参数 if (urlParts.length == 1) { return entity; } //有参数 String[] params = urlParts[1].split("&"); entity.params = new HashMap(); for (String param : params) { String[] keyValue = param.split("="); System.out.println(JSON.toJSONString(keyValue)); if(keyValue.length==1){ entity.params.put(keyValue[0], ""); continue; } if(keyValue[1].contains("|")){ try { keyValue[1] = URLEncoder.encode(keyValue[1],"utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } entity.params.put(keyValue[0], keyValue[1]); } return entity; } public static String getUrl(String url){ UrlEntity params = parse(url); String baseUrl = params.baseUrl; StringBuffer strtTotalURL = new StringBuffer(); if(params.params!=null){ for (Map.Entry<String, String> m:params.params.entrySet()){ String temp = null; if(m.getValue().contains("|")){ try { temp = m.getKey() + "=" + URLEncoder.encode(m.getValue(),"utf-8") + "&"; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }else{ temp = m.getKey() + "=" + m.getValue() + "&"; } strtTotalURL.append(temp); } } return baseUrl + "?" + strtTotalURL.toString(); } public void main(String[] args){ String url = "http:\\/\\/119.254.234.92:9280\\/easypay\\/mobilepay.servlet?OrderAmount=1090&AppType=B2C&BankId=TENPAYGW_MINIPROGRAM&BillNo=2020061500011970&Ext1=10.221.150.211&Ext2=&Lan=CN&Msg=SuperPNR_ID%3D202006151522247812&OrderCurtype=CNY&OrderNo=202006151522389979&OrderType=1|0|&OrgId=XZAIRB2C&OrderDate=20200615&OrderTime=152228&ordername=Xizang+Airlines+e-ticket&Orderinfo=&usrid=o_57z5FJx1rlTpMSzsgsdeiEvKxc&username=&gateid=TENPAYGW_MINIPROGRAM&Version=1.0&ReturnId=id_pay_1000&SIGNATURE=f16fa3e8a299c44ebe41a0c3ea678bf6"; System.out.println(getUrl(url));
相关文章
- PreparedStatement 不定参数处理「建议收藏」
- 烧脑巨作,Spring Boot请求处理(常用参数注解使用)
- web安全扫描器组件-HTTP请求参数处理py脚本
- Python 接口测试之处理转义字符的参数和编码问题
- 【C 语言】数组 ( 指针数组用法 | 命令行参数处理 )
- ORA-48496: “string” is a mandatory keyword for the command ORACLE 报错 故障修复 远程处理
- MySQL Error number: 4078; Symbol: ER_REGEXP_MISSING_FILE; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-010722; Symbol: ER_RPL_MTS_SLAVE_COORDINATOR_HAS_WAITED; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-010834; Symbol: ER_BINLOG_ERROR_GETTING_NEXT_LOG_FROM_INDEX; SQLSTATE: HY000 报错 故障修复 远程处理
- SQLServer 错误 12307 “construct”中参数的默认值必须是常量。 故障 处理 修复 支持远程
- SQLServer 错误 35250 到主要副本的连接处于非活动状态。 无法处理该命令。 故障 处理 修复 支持远程
- SQLServer 错误 41030 无法打开 Windows Server 故障转移群集注册表子项“%.*ls”(错误代码 %d)。 父键为群集根键。 WSFC 服务可能未在运行或是在其当前状态下无法访问,或指定的参数无效。 如果已删除对应的可用性组,则会出现此错误。 有关此错误代码的信息,请参阅 Windows 开发文档中的“系统错误代码”。 故障 处理 修复 支持远程
- MySQL Error number: MY-011831; Symbol: ER_IB_MSG_6; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-012081; Symbol: ER_IB_MSG_256; SQLSTATE: HY000 报错 故障修复 远程处理
- MySQL Error number: MY-013011; Symbol: ER_IB_MSG_1186; SQLSTATE: HY000 报错 故障修复 远程处理
- Java处理日期时间的示例大全详解编程语言
- 页面传入json数组参数的处理代码详解编程语言
- 使用Oracle带参数函数进行高效处理(oracle带参数函数)
- Linux宏中可变参数的处理(linux宏可变参数)
- 处理使用Java的Redis进行高效的过期处理(redisjava过期)
- 关于处理GET方式提交的含有特殊字符的参数
- javatapestry5布局参数的处理
- Asp.net请求处理之管道处理介绍
- 探讨如何用委托处理排序