URL,中文名是统一资源定位符,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名。
URL设计者使用US-ASCII字符集表示URL,这样会带来什么问题呢?没错,汉字和特殊符号。我们看看下面的例子
package encodeTest;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* @author wujiang
* @version 1.0.0.
* @date 2017/4/30
*/
public class encodeTest {
public static void main(String[] args) {
String[] strArray={"abc","人民的名义","http://www.youkuaiyun.com @ # &"};
for(int i=0;i<strArray.length;i++){
try {
String encodeStr = URLEncoder.encode(strArray[i], "UTF-8");
System.out.println(strArray[i]+" encode"+":"+encodeStr);
String decodeStr = URLDecoder.decode(encodeStr, "UTF-8");
System.out.println(strArray[i]+" decode"+":"+decodeStr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
输出结果如下
abc encode:abc
abc decode:abc
人民的名义 encode:%E4%BA%BA%E6%B0%91%E7%9A%84%E5%90%8D%E4%B9%89
人民的名义 decode:人民的名义
http://www.youkuaiyun.com @ # & encode:http%3A%2F%2Fwww.youkuaiyun.com+%40+%23+%26
http://www.youkuaiyun.com @ # & decode:http://www.youkuaiyun.com @ # &
使用场景
URL的encode和decode,最常见的场景就是发送restful请求的时候了。如果一个url中的某一个参数是另一个url,不encode就会造成参数的不完整。举个例子,这个例子是我从https://segmentfault.com/q/1010000002991580看来的,很具有代表性
对于下面的微信接口
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
REDIRECT_URI代表一个本地运算之后的回调地址。比方说,REDIRECT_URI是”http://api.baidu.com/callback.php”
回调地址必须先encode,变成下面的类型,才可以正确发送请求。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http%3A%2F%2Fapi.baidu.com%2Fcallback.php&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
说明:
如有转载,请注明出处:
http://blog.youkuaiyun.com/antony9118/article/details/71036371