1生成Oauth_Nonce

新浪的Oauth_Nonce是ASCII编码 所有随机生成的时候是只要数字就行 而OAuth标准好像是可以有字母大小写

2中文编码

中文采用Uri.EscapeDataString进行编码的话能够避免+号的问题

(至于具体怎么回事看这个http://www.cnblogs.com/guangrou/archive/2011/02/25/1965294.html

这里提供两个编码的方法

/// <summary>
/// URL encodes a string based on section 5.1 of the OAuth spec.
/// Namely, percent encoding with [RFC3986], avoiding unreserved characters,
/// upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs.
/// </summary>
/// <param name="value"></param>
/// <seealso cref="http://oauth.net/core/1.0#encoding_parameters" />
public static string UrlEncodeStrict(string value)
{
// 忽略掉%否则签名会出错
var original = value;
var ret = original.Where(
c => !Unreserved.Contains(c) && c != '%').Aggregate(
value, (current, c) => current.Replace(
c.ToString(), c.ToString().PercentEncode()
));
return ret.Replace("%%", "%25%"); // Revisit to encode actual %'s
}
public static string PercentEncode(this string s)
{
var bytes = s.GetBytes();
var sb = new StringBuilder();
foreach (var b in bytes)
{
// [DC]: Support proper encoding of special characters (\n\r\t\b)
if((b > 7 && b < 11) || b == 13)
{
sb.Append(string.Format("%0{0:X}", b));
}
else
{
sb.Append(string.Format("%{0:X}", b));
}
}
return sb.ToString();
}

/// <summary>
/// URL encodes a string based on section 5.1 of the OAuth spec.
/// Namely, percent encoding with [RFC3986], avoiding unreserved characters,
/// upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs.
/// </summary>
/// <param name="value"></param>
/// <seealso cref="http://oauth.net/core/1.0#encoding_parameters" />
public static string UrlEncodeRelaxed(string value)
{
return Uri.EscapeDataString(value);
}

       /// <summary>
        /// URL encodes a string based on section 5.1 of the OAuth spec.
        /// Namely, percent encoding with [RFC3986], avoiding unreserved characters,
        /// upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs.
        /// </summary>
        /// <param name="value"></param>
        /// <seealso cref="http://oauth.net/core/1.0#encoding_parameters" />
 
        public static string UrlEncodeStrict(string value)
        {
            // 忽略掉%否则签名会出错
            var original = value;
            var ret = original.Where(
                c => !Unreserved.Contains(c) && c != '%').Aggregate(
                    value, (current, c) => current.Replace(
                          c.ToString(), c.ToString().PercentEncode()
                          ));
            return ret.Replace("%%", "%25%"); // Revisit to encode actual %'s
        }
        public static string PercentEncode(this string s)
        {
            var bytes = s.GetBytes();
            var sb = new StringBuilder();
            foreach (var b in bytes)
            {
                // [DC]: Support proper encoding of special characters (\n\r\t\b)
                if((b > 7 && b < 11) || b == 13)
                {
                    sb.Append(string.Format("%0{0:X}", b));
                }
                else
                {
                    sb.Append(string.Format("%{0:X}", b));
                }
            }
            return sb.ToString();
        }
        /// <summary>
        /// URL encodes a string based on section 5.1 of the OAuth spec.
        /// Namely, percent encoding with [RFC3986], avoiding unreserved characters,
        /// upper-casing hexadecimal characters, and UTF-8 encoding for text value pairs.
        /// </summary>
        /// <param name="value"></param>
        /// <seealso cref="http://oauth.net/core/1.0#encoding_parameters" />
        public static string UrlEncodeRelaxed(string value)
        {
            return Uri.EscapeDataString(value);
        }
其中的中文内容最好进行两次UrlEncodeRelaxed否则的话如果本来发布的微博内容就是已经进行UTF8编码过的汉字的话 再编码会出现于本来中文一样的情况 原因在于UrlEncodeStrict进行编码的话编码前后不会发生变化的

3上传图片

关于上传图片 Upload接口上传图片Header里要有要加入Status信息 如这样

--REQUEST: http://api.t.sina.com.cn
POST /statuses/upload.json HTTP/1.1
Authorization: OAuth oauth_consumer_key="2404507248",oauth_token="435df4f2525c99f5b337bb79900a5d8c",oauth_nonce="5277664",oauth_timestamp="1299923945",oauth_signature_method="HMAC-SHA1",oauth_signature="UOsrFw6oX3%2FA4P%2Fb%2BVGbQK5ty7k%3D",oauth_version="1.0",
Content-Type: multipart/form-data; boundary=a00d9f7b-2a78-4cbb-a8a7-1cec8b92735b
--a00d9f7b-2a78-4cbb-a8a7-1cec8b92735b
Content-Disposition: form-data; name="status"
 
%E6%88%91
--a00d9f7b-2a78-4cbb-a8a7-1cec8b92735b
Content-Disposition: form-data; name="pic"; filename="bmp148.jpg"
Content-Type: application/octet-stream
 
[FILE DATA][System.Text.Latin1Encoding]
--a00d9f7b-2a78-4cbb-a8a7-1cec8b92735b--

另外图片文件不要使用Content-Disposition: file要使用Content-Disposition: form-data

觉得这点不太好,应该是开放平台的工程师有什么考虑才这么设计的吧

posted on 2011-03-13 09:47  jiangzhuo  阅读(902)  评论(0编辑  收藏  举报