質問者
REST APIを使用して、Office365のフィードへのPOST

質問
-
以下のサイトを参考にし、REST APIを使用して、Office365のフィード上にPOSTを行うコードを書いています。
http://msdn.microsoft.com/ja-jp/library/dn155789.aspx
恐縮ですが、以下のようなリクエストを生成して投げています。
url = @"https://***.sharepoint.com/_api/social.feed/actor(item=@v)/Feed/Post?@v='https://***.sharepoint.com/siteurl/newsfeed.aspx'";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "application/json;charset=utf-8";
request.Accept = "application/json;odata=verbose;
request.Method = "POST";
request.ContentLength = data.length;
request.CookieContainer = cookie;using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
};上記のリクエストを投げても、次のエラーが返ってしまいます。ちなみに、Feedの取得の方はできています。
Message=使用不可
StatusCode=403Offoce365のフィードにPOSTを行う方法をご存じの方、または何かヒントになりそうな情報をご存じの方がいらっしゃいましたら、お知恵を貸して頂けないでしょうか。
- 移動 星 睦美 2014年1月16日 8:05 SP-開発とプログラミング(MOSS2007向け) から
2014年1月16日 7:15
すべての返信
-
OTA Hirofumi様
情報不足失礼いたしました。
クライアントアプリからのリクエストです。
認証については以下のサイトを参考にして、クレームベースを使用しています。
http://blogs.msdn.com/b/tsmatsuz/archive/2011/05/09/office-365-sharepoint-online-remote-client-authentication-programming.aspx=
http://msdn.microsoft.com/ja-jp/library/hh147177.aspx
宜しくお願い致します。
2014年1月17日 8:29 -
なるほど。AccessToken を取得できていて、POST が失敗するという場合は、リクエスト時に X-RequestDigest がヘッダーに含まれていないのではないですかね?下記の URL の内容をご確認いただけますでしょうか?
http://msdn.microsoft.com/ja-jp/library/office/jj164022.aspx#WritingData
2014年1月17日 10:05 -
残念です・・・。
あとは、User-Agentがnullだと403だった気がします。クライアントアプリということなので、当てはまるかもしれません。User-Agentについては、下記の「Step3: Send the Security Token to SharePoint Online」をご確認ください。
http://allthatjs.com/2012/03/28/remote-authentication-in-sharepoint-online/
2014年1月17日 10:45 -
User-Agentの件、今回の現象としては、こちらのブログ記事の方が適切かもしれません。
2014年1月17日 10:49 -
Sharepoint の知識がない自分がレスするのもなんですが・・・
最初の質問のコードで、> request.CookieContainer = cookie;
は、たぶん認証クッキーを要求ヘッダに設定するためだと思いますが、期待通り設定できているのでしょうか?
参考にされている、
http://msdn.microsoft.com/ja-jp/library/hh147177.aspx
で、認証クッキーの取得には WININET.dll の InternetGetCookieEx を使用するとのことです。
そこに「このメソッドは、Internet Explorer 8 で開始されることによってのみ機能します」と書いてあるように、たとえば WebBrowser を使って要求を出して応答ヘッダに含まれるクッキーを受け取る必要があるはずです。そのようなコードはアップされていたコードには見当たりませんが、認証クッキーは期待通り取得できているのでしょうか?
また、要求にクッキーを含める方法についても、参考にされているページに「残念なことに、cookie を要求に追加するための直接的な方法はありません。ただし、ExecutingWebRequest というイベントがあります」とあります。そのあたりは問題ないのでしょうか?
ハズレだったらすみません。2014年1月21日 3:53 -
SurferOnWww様
解答頂きありがとうございます。
>WebBrowser を使って要求を出して応答ヘッダに含まれるクッキーを受け取る必要があるはずです。
>そのようなコードはアップされていたコードには見当たりません
失礼いたしました。質問時にアップしたコードには記載していないのですが、WebBrowserコントロールを使用し、WININET.dllにより取得したクッキーを以下のコードでリクエストヘッダーに追加しています。
request.CookieContainer = cookie;
>「残念なことに、cookie を要求に追加するための直接的な方法はありません。ただし、ExecutingWebRequest というイベントがあります」
こちらに関しましては、クライアント オブジェクト モデルを使用した際に関することと思いますので、今回の現象とはまた別の問題だと認識しています。
GETメソッドが正常に動いているので、クッキーは正しく取得、追加できていると考えているのですが、もう少しクッキー周りを見直してみようと思います。
2014年1月21日 8:01 -
> もう少しクッキー周りを見直してみようと思います。
もしそのあたりに不安があるなら、Fidder2 を利用して応答/要求ヘッダーに含まれる認証クッキーを調べてみることをお勧めします。
Fiddler のお勧め
http://surferonwww.info/BlogEngine/post/2011/05/25/Recommendation-of-Fiddler.aspx2014年1月21日 8:47