阿里签名中URLEncode于C#URLEncod不同之处

问题

QQ截图20170106155741

如上图所示,阿里云的PercentEncode 转换! 为 %21

PercentEncode 源码为:

package com.aliyuncs.auth;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class AcsURLEncoder {
	public final static String URL_ENCODING = "UTF-8";
	
	public static String encode(String value) throws UnsupportedEncodingException {
		return URLEncoder.encode(value, URL_ENCODING);
	}
	
	public static String percentEncode(String value) throws UnsupportedEncodingException{
        return value != null ? URLEncoder.encode(value, URL_ENCODING).replace("+", "%20")
                .replace("*", "%2A").replace("%7E", "~") : null;
    }
}
 

查找问题

第三方工具

阿里签名中URLEncode于C#URLEncod不同之处_第1张图片
 

上图表明的确没有转义!(感叹号)

 

C#中的URLEncode转义

C#中URLEncode,C#中有两种URLEncode,WebUlitity 和 HttpUlitity

   [TestFixture]
   public class TestUlities
    {
        [Test]
        public void Test()
        {
            var url = @"http://img05.taobaocdn.com/bao/uploaded/TB2BVKlfFXXXXarXXXXXXXXXXXX_!!111708970-0-saturn_solar.jpg";

            var webUrlEncode = WebUtility.UrlEncode(url);

            var httpUrlEncode = HttpUtility.UrlEncode(url);
        }
    }

 

发现都没有转义!(感叹号)

 

WHY

 

In general URIs as defined by RFC 3986 (see Section 2: Characters) may contain any of the following characters:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=`.

Any other character needs to be encoded with the percent-encoding (%hh). Each part of the URI has further restrictions about what characters need to be represented by an percent-encoded word.

 

解决

阿里签名中URLEncode于C#URLEncod不同之处_第2张图片

使用以下代码URLEncode 来进行URLEncode

 

  public class AliUrlEncodeHelper
    {
        public static string Encode(string str)
        {
            return !string.IsNullOrEmpty(str) ?
                WebUtility.UrlEncode(str).Replace("+", "%20")
                .Replace("*", "%2A")
                .Replace("%7E", "~")
                .Replace("!", "%21")
                .Replace("'","%27")
                .Replace("(", "%28") 
                .Replace(")", "%29") 
                :str;
        }
    }

结论

阿里的URLEncode 有点过时,或者说自定义的,需要我们特殊处理。

 

附:阿里签名规则

阿里签名中URLEncode于C#URLEncod不同之处_第3张图片

 

参考

Which characters make a URL invalid?

Les codes hexas et unicode des caractères usuels, par Nicolas Hoffmann

阿里云签名机制

你可能感兴趣的:(阿里签名中URLEncode于C#URLEncod不同之处)