情况是这样的,我要去请求第三方项目的接口获取资源csv文件,
通过浏览器直接输入该地址可以正常获取csv文件,
但是我通过java RestTemplate 请求改地址时,/password 后面的参数的特殊符号就被转码了,然后就请求不到了,
变成这样:
[org.springframework.web.client.RestTemplate] - GET request for "http://127.0.0.1:8080/getDate/?username=admin/password%3D123456/startTime%3D2018-11-05_14:52:08/endTime%3D2018-11-05_14:55:08/res%3Dmin/filter%3D%7Bme%3D127.0.0.1-0%7D/DT%3Dcsv" resulted in 200 (200)
源码:
@RequestMapping(value = "query3.html")
@ResponseBody
public static String query3() {
RestTemplate restTemplate = new RestTemplate();
String result = "";
Date date = new Date();
long time = 30*60*100; //30min
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH:mm:ss");
String startTime = df.format(new Date(date.getTime() - time));
String endTime = df.format(new Date(date.getTime()));
String username = "admin";
String password = "123456";
String res= "min";
String filter = "{me=127.0.0.1-0}";
String DT = "csv";
Map<String,String> queryMap = new HashMap<>();
queryMap.put("username",username);
queryMap.put("password",password);
queryMap.put("startTime",startTime);
queryMap.put("endTime",endTime);
queryMap.put("res",res);
queryMap.put("filter",filter);
queryMap.put("DT",DT);
String dataUrl = "http://127.0.0.1:8080/getDate/";
String queryMapUrl = "?username={username}/password={password}/startTime={startTime}/endTime={endTime}/res={res}/filter={filter}/DT={DT}";
try {
result = restTemplate.getForObject(dataUrl+queryMapUrl,String.class,queryMap);
}catch (Exception e){
e.printStackTrace();
}
return result;
}
这要如何解决
谢谢!
导入commons.lang3的jar ,
import org.apache.commons.lang3.StringEscapeUtils;
调用StringEscapeUtils.unescapeHtml4进行反转义,需要转义的为input,result为转义后的字符
String result = StringEscapeUtils.unescapeHtml4(input);
前端需要进行两次url编码,后台进行一次url解码,就可以了!为什么要这样呢?因为get请求服务器会自动进行一次解码,所以前端如果只编码一次等于没有编码,所以要编码两次,而因为服务器会自动解码一次,所以后台代码只需要再解码一次就可以了
调用URLDecoder.decode(a)进行反转义,需要转义的为input,result为转义后的字符
String result = URLDecoder.decode(input);