Yammer にメッセージを投稿すると共に、ファイルをアップロードしようとしています。メッセージの投稿は機能します(すべての承認などは問題ありません)。ファイルを添付したいときに問題が発生します。ここからコードをたどろうとしました:Yammer.Net
しかし、いくつかの部分が欠けているのではないかと心配しています (プロジェクト全体を参照できませんでした。なぜか私の Visual Studio に問題があります)。
そのため、リクエスト パラメータを指定する従来の方法に従おうとしました。以下に私の方法を示します:
public bool postMessage(string body, string attachement)
{
var url = "https://www.yammer.com/api/v1/messages.json";
NameValueCollection parameters = new NameValueCollection();
parameters.Add("body", body);
parameters.Add("group_id", group_id);
var authzHeader = oauth.GenerateAuthzHeader(url, "POST");
//new request
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
request.Headers.Add("Authorization", authzHeader);
request.Method = "POST";
//content type settings
request.ContentType = "multipart/form-data";
request.KeepAlive = true;
//Proxy settings
request.Proxy = new System.Net.WebProxy("my company's proxy", true);
request.Proxy.Credentials = new System.Net.NetworkCredential(user, password);
//prepare the parameters
FileInfo fi = new FileInfo(attachement);
int i = 0;
long postDataSize = fi.Length;
parameters.Add("attachment", "attachment1");
parameters.Add("file", Path.GetFileName(attachement));
int count = 0;
string wdata = string.Empty;
foreach (string key in parameters.Keys)
{
if (count == 0)
{
wdata = key + "=" + oauth.encode(parameters[key]);
}
else
{
wdata += "&" + key + "=" + oauth.encode(parameters[key]);
}
count++;
}
//add the parameters
byte[] postDataBytes = Encoding.ASCII.GetBytes(wdata);
request.ContentLength = postDataBytes.Length + postDataSize;
Stream reqStream = request.GetRequestStream();
reqStream.Write(postDataBytes, 0, postDataBytes.Length);
//write the file
//postDataBytes = Encoding.ASCII.GetBytes(fileHeader);
//reqStream.Write(postDataBytes, 0, postDataBytes.Length);
int bufferSize = 10240;
FileStream readIn = new FileStream(attachement, FileMode.Open, FileAccess.Read);
readIn.Seek(0, SeekOrigin.Begin); // move to the start of the file
byte[] fileData = new byte[bufferSize];
int bytes;
while ((bytes = readIn.Read(fileData, 0, bufferSize)) > 0)
{
// read the file data and send a chunk at a time
reqStream.Write(fileData, 0, bytes);
}
readIn.Close();
reqStream.Close();
using (var response = (System.Net.HttpWebResponse)request.GetResponse())
{
using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
{
string resp = reader.ReadToEnd();
return true;
}
}
}
コードは少し混沌としているように見えるかもしれませんが、理解していただければ幸いです。主な問題は次のとおりです。
- メッセージ(group_id、body)のみを投稿すると機能します。
- 上記の方法を試して添付ファイルを投稿すると、Yammer から "Internal Server Error" が表示されます。
API を使用して Yammer にファイルをアップロードする方法を知っている人はいますか? できれば.NETで:)