【发布时间】:2011-06-21 09:37:33
【问题描述】:
我正在使用 Facebook 的 Javascript API 开发一个需要能够将图像发布到用户墙上的应用程序。 据我所知,应用程序的该部分需要在服务器端,因为它需要将图像数据发布为“multipart/form-data”。
注意:不是使用“post”的简单版本,而是真正的“photos”方法。
http://graph.facebook.com/me/photos
我认为我面临两个问题,一个 .NET 和一个 Facebook 问题:
Facebook 问题:我不太确定是否所有参数都应作为 multipart/form-data(包括 access_token 和消息)发送。唯一的代码示例使用 cUrl util/application。
.NET 问题:我从未从 .NET 发出 multipart/form-data 请求,我不确定 .NET 是否会自动创建 mime-parts,或者我是否必须进行编码以某种特殊方式的参数。
调试有点困难,因为我从 Graph API 得到的唯一错误响应是“400 - 错误请求”。 下面是我决定写这个问题时的代码(是的,它有点冗长:-)
最终的答案当然是从 .NET 发布图像的示例 sn-p,但我可以接受更少。
string username = null;
string password = null;
int timeout = 5000;
string requestCharset = "UTF-8";
string responseCharset = "UTF-8";
string parameters = "";
string responseContent = "";
string finishedUrl = "https://graph.facebook.com/me/photos";
parameters = "access_token=" + facebookAccessToken + "&message=This+is+an+image";
HttpWebRequest request = null;
request = (HttpWebRequest)WebRequest.Create(finishedUrl);
request.Method = "POST";
request.KeepAlive = false;
//application/x-www-form-urlencoded | multipart/form-data
request.ContentType = "multipart/form-data";
request.Timeout = timeout;
request.AllowAutoRedirect = false;
if (username != null && username != "" && password != null && password != "")
{
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential(username, password).GetCredential(new Uri(finishedUrl), "Basic");
}
//write parameters to request body
Stream requestBodyStream = request.GetRequestStream();
Encoding requestParameterEncoding = Encoding.GetEncoding(requestCharset);
byte[] parametersForBody = requestParameterEncoding.GetBytes(parameters);
requestBodyStream.Write(parametersForBody, 0, parametersForBody.Length);
/*
This wont work
byte[] startParm = requestParameterEncoding.GetBytes("&source=");
requestBodyStream.Write(startParm, 0, startParm.Length);
byte[] fileBytes = File.ReadAllBytes(Server.MapPath("images/sample.jpg"));
requestBodyStream.Write( fileBytes, 0, fileBytes.Length );
*/
requestBodyStream.Close();
HttpWebResponse response = null;
Stream receiveStream = null;
StreamReader readStream = null;
Encoding responseEncoding = System.Text.Encoding.GetEncoding(responseCharset);
try
{
response = (HttpWebResponse) request.GetResponse();
receiveStream = response.GetResponseStream();
readStream = new StreamReader( receiveStream, responseEncoding );
responseContent = readStream.ReadToEnd();
}
finally
{
if (receiveStream != null)
{
receiveStream.Close();
}
if (readStream != null)
{
readStream.Close();
}
if (response != null)
{
response.Close();
}
}
【问题讨论】:
标签: c# .net facebook facebook-graph-api