none
REST APIを使用して、Office365のフィードへのPOST RRS feed

  • 質問

  • 以下のサイトを参考にし、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=403

    Offoce365のフィードにPOSTを行う方法をご存じの方、または何かヒントになりそうな情報をご存じの方がいらっしゃいましたら、お知恵を貸して頂けないでしょうか。


    • 移動 星 睦美 2014年1月16日 8:05 SP-開発とプログラミング(MOSS2007向け) から
    2014年1月16日 7:15

すべての返信

  • フォーラム オペレーターの星 睦美です。
    kotatakimoto さん、投稿ありがとうございます。

    質問の内容からSharePoint 2013 に関する話題をあつかっているフォーラムで回答が集まりやすいのではないかと思いますので、私のほうでスレッドを移動させていただきますね。

    ※フォーラムで参考になる回答がありましたら、投稿者からの[回答としてマーク] をお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年1月16日 8:04
  • 星 睦美 様

    対処頂きありがとうございました。

    2014年1月16日 9:11
  • 質問の情報を追加します。

    上記のリクエストだけではなく、POSTメソッドを使用したリクエストが全て、同様のエラーで返ってきてしまいます。

    何かご存じの方がいらっしゃいましたら、宜しくお願い致します。

    2014年1月16日 9:13
  • 確認ですが、
    SharePoint Online から SharePoint Online へのリクエストでしょうか?
    それとも、SharePoint Online 以外のアプリケーションから SharePoint Online へのリクエストでしょうか?

    おそらくは、SharePoint Online への認証絡みではないかと思うのですが・・・

    2014年1月17日 3:23
  • 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
  • OTA Hirofumi様

    早速の回答ありがとうございます。

    上記サイトを参考にDigestを追加したのですが、結果は変わらず403エラーでした。

    ただ、POSTメソッドのリクエストに対する上記オプションの追加は必須なようですので、情報大変感謝いたします。

    2014年1月17日 10:40
  • 残念です・・・。

    あとは、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月20日 0:10
    • 回答の候補の設定解除 佐伯玲 2014年1月27日 4:42
    2014年1月17日 10:45
  • User-Agentの件、今回の現象としては、こちらのブログ記事の方が適切かもしれません。

    http://razirais.wordpress.com/2011/05/19/how-to-fix-sharepoint-online-403-forbidden-error-while-downloading-files-using-client-object-model/

    • 回答の候補に設定 佐伯玲 2014年1月20日 0:10
    • 回答の候補の設定解除 佐伯玲 2014年1月27日 4:42
    2014年1月17日 10:49
  • OTA Hirofumi様

    情報頂き大変ありがとうございます。

    User Agentを追加してみたのですが、残念ながら403エラーでした。。

    2014年1月21日 0:37
  • 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.aspx

    2014年1月21日 8:47