问题描述
最近做文件下载的时候,访问下载接口发现,有的文件下载会400,但是有的可以正常下载。
问题定位
400的主要有两种形式:
1、bad request意思是“错误的请求";
2、invalid hostname意思是"不存在的域名”
因为有的请求是可以成功调用的,所以应该是参数错误。发现下载失败的文件名称都有中文,然后猜想是因为中文没有编码,然后请求中的中文乱码导致请求失败,报400
问题解决
将请求中的中文编码,调用成功。自己写了一个公共方法,对请求中 ? 后面的参数进行编码,返回编码后的url
代码实现
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class UrlUtil {
/**
* 将url参数编码
*
* @param urlPath
* @param enc
* @return
*/
public static String encodeUrl(String urlPath,String enc){
try {
int index = urlPath.indexOf("?");
if (index < 0) return urlPath;
String query = urlPath.substring(0, index);
String params = urlPath.substring(index + 1);
Map map = getArgs(params,enc);
String encodeParams = transMapToString(map);
return query + "?" + encodeParams;
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return "";
}
/**
* 将url参数格式转化为map
*
* @param params
* @param enc
* @return
* @throws Exception
*/
public static Map getArgs(String params, String enc) throws Exception{
Map map=new HashMap();
String[] pairs=params.split("&");
for(int i=0;i<pairs.length;i++){
String[] split = pairs[i].split("=");
String value = "";
if(split.length > 1){
value = URLEncoder.encode(split[1],enc);
}
map.put(split[0],value);
}
return map;
}
/**
* 将map转换为url参数
*
* @param map
* @return
*/
public static String transMapToString(Map map){
java.util.Map.Entry entry;
StringBuffer sb = new StringBuffer();
for(Iterator iterator = map.entrySet().iterator(); iterator.hasNext();)
{
entry = (java.util.Map.Entry)iterator.next();
sb.append(entry.getKey().toString()).append( "=" ).append(null==entry.getValue()?"":
entry.getValue().toString()).append (iterator.hasNext() ? "&" : "");
}
return sb.toString();
}
}
特此声明
上述代码是百度的,自己已测试使用并稍作修改,结果正常。因为没有保存引用地址,所以没有贴出引用,作者看到请留言。