HttpUtility.UrlEncode编码重写

1. 某些系统方法,例如.NET系统方法HttpUtility.UrlEncode会将‘=’编码成‘%3d’,而不是%3D,致使加密签名通不过验证,请开发者注意检查。java

2.Java 1.3和早期版本中,调用java.net.URLEncoder下的方法进行URL编码时,某些特殊字符并不会被编码,例如星号(*)。 因为URL编码规则中规定了星号(*)必须编码,所以在请求字符串中含星号(*)的状况下若是使用了上述方法,会致使生成的签名不能经过验证。 例如调用v3/pay/buy_goods接口时, payitem参数值中必定会含有* ,在使用类java.net.URLEncoder下的方法进行编码后,需开发人员手动将星号字符“*”替换为“%2A”,不然将致使加密签名一直通不过验证,请开发者注意检查。c#

3. 某些语言的urlencode方法会把“空格”编码为“+”,实际上应该编码为“%2B”。这也将生成错误的签名,致使签名通不过验证。 请开发者注意检查,手动将“+”替换为“%2B”。 在PHP中,推荐用rawurlencode方法进行URL编码。api

下面是关于c#语言对UrlEncode重写:ui

        /// <summary>
        /// UrlEncode重写:小写转大写,特殊字符特换
        /// </summary>
        /// <param name="strSrc">原字符串</param>
        /// <param name="encoding">编码方式</param>
        /// <param name="bToUpper">是否转大写</param>
        /// <returns></returns>
        private string UrlEncode(string strSrc, System.Text.Encoding encoding, bool bToUpper)
        {
            System.Text.StringBuilder stringBuilder = new System.Text.StringBuilder();
            for (int i = 0; i < strSrc.Length; i++)
            {
                string t = strSrc[i].ToString();
                string k = HttpUtility.UrlEncode(t, encoding);
                if (t == k)
                {
                    stringBuilder.Append(t);
                }
                else
                {
                    if (bToUpper)
                        stringBuilder.Append(k.ToUpper());
                    else
                        stringBuilder.Append(k);
                }
            }
             if (bToUpper)
return stringBuilder.ToString().Replace("+", "%2B"); else
return stringBuilder.ToString();
}
调用方法:
string org_loc = this.UrlEncode("/dfdasf/get_api_m", Encoding.UTF8, true);
相关文章
相关标签/搜索