• 阿里签名中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;
        }
    }
     

    查找问题

    第三方工具

    QQ截图20170106160805
     

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

    C#中的URLEncode转义

    C#中URLEncode,C#中有两种URLEncode,WebUlitityHttpUlitity

       [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.

    解决

    QQ截图20170106173506

    使用以下代码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 有点过时,或者说自定义的,需要我们特殊处理。

    附:阿里签名规则

    image

    参考

    Which characters make a URL invalid?

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

    阿里云签名机制

  • 相关阅读:
    序列化 Serialization
    http soap关系
    sql 查询
    返回最后插入到标识列的值(scope_identity.ident_current.@@identity)
    匿名方法
    九、volatile与Java内存模型
    八、Java内存模型JMM
    十、CAS
    CUSTOM ROUTE CONSTRAINTS
    获取本地数据库
  • 原文地址:https://www.cnblogs.com/HQFZ/p/6256821.html
Copyright © 2020-2023  润新知