0

我正在从http://blog.blackballsoftware.com/2010/11/03/making-a-facebook-wall-post-using-the-new-graph-api-and-c/重写代码以创建一个类发布到 Facebook。只要我不对帖子数据进行 URLEncode,该代码就可以工作。例如:如果发布数据是“message=Test,请忽略”,那么它可以工作。如果我将相同的数据 URLEncode 到 "message%3dTest%2cplease+ignore" 中,那么我会收到错误 {"error":{"message":"(#100) Missing message or attachment","type":"OAuthException", “代码”:100}}。

Post 数据应该是 URLEncoded 吗?我认为应该是因为如果我发布这样的消息“Test&Message”,那么只会出现“Test”这个词。

相关代码如下。如果 postParams = HttpUtility.UrlEncode(postParams); 被注释掉,然后代码工作。如果没有,Facebook 会返回消息丢失的错误。

        postParams = HttpUtility.UrlEncode(postParams);
        byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postParams);
        webRequest.ContentLength = bytes.Length;

        System.IO.Stream os = webRequest.GetRequestStream();
        os.Write(bytes, 0, bytes.Length);
        os.Close();

        try
        {
            var webResponse = webRequest.GetResponse();
        }

        catch (WebException ex)
        {
            StreamReader errorStream = null;

            errorStream = new StreamReader(ex.Response.GetResponseStream());
            error = errorStream.ReadToEnd() + postParams;

         }
4

1 回答 1

0

答案可以在 Stackoverflow 上的C# Escape Plus Sign (+) in POST using HttpWebRequest中找到。使用 Uri.EscapeDataString 而不是 URLEncode。仅对参数值进行编码,而不对参数名称后的等号进行编码。示例:message=Test%2Cplease%26%20ignore 有效,但 message%3dTest%2Cplease%26%20ignore 无效,因为参数名称后面的等号被编码为 %3d。

于 2012-05-07T11:37:41.897 回答