none
SPO2013でRESTAPIを使ってアイテムを取得したい RRS feed

  • 質問

  • お世話になります。

    現在下記コードを流用して指定したリストアイテムの情報を取得しているのですが、
    取得した大量のアイテムの一意のキーを or で繋ぎ、また別のリストのアイテムの情報を取得したいのですが、
    リクエスト時のURLが長すぎるためか、エラーになってしまいます。

    POSTリクエストであれば回避出来るかもしれないと試行錯誤しているのですが、
    恥ずかしながらPOST処理を作成したことが無いため、上手く動きません。

    色々なサイト様を探しまわっているのですが、目的に沿った情報が見つかっていない現状です。
    ・リストアイテムを取得するPOSTリクエストのサンプル
    ・リストアイテム情報取得のPOST処理を作成する上での参考になるサイトURL
    ・そもそもPOSTの場合アイテム作成しか出来ないのではないか?

    上記3点の関する情報をお持ちの方、お知恵を拝借したく存じます。

    2016年4月26日 7:31

回答

  • こんにちは。

    REST APIとのことなので、こちらを使われているということでよろしいでしょうか。
    https://msdn.microsoft.com/ja-jp/library/office/fp142380.aspx

    RESTは仕様上、POSTでデータを取得するというのは難しいのではないかと思います。

    要件を満たせるかわかりませんが、CSOMやJSOMを使うといった方法は取れないでしょうか。
    CSOMやJSOMであれば、CAMLをPOSTで送るはずですので、複雑なクエリでも取得できると思います。

    • 回答の候補に設定 佐伯玲 2016年4月27日 1:26
    • 回答としてマーク sttks 2016年5月6日 5:16
    2016年4月26日 9:43

すべての返信

  • こんにちは。

    REST APIとのことなので、こちらを使われているということでよろしいでしょうか。
    https://msdn.microsoft.com/ja-jp/library/office/fp142380.aspx

    RESTは仕様上、POSTでデータを取得するというのは難しいのではないかと思います。

    要件を満たせるかわかりませんが、CSOMやJSOMを使うといった方法は取れないでしょうか。
    CSOMやJSOMであれば、CAMLをPOSTで送るはずですので、複雑なクエリでも取得できると思います。

    • 回答の候補に設定 佐伯玲 2016年4月27日 1:26
    • 回答としてマーク sttks 2016年5月6日 5:16
    2016年4月26日 9:43
  • Takashi Shinohara 様
    ご回答ありがとうございます。

    >REST APIとのことなので、こちらを使われているということでよろしいでしょうか。
    >https://msdn.microsoft.com/ja-jp/library/office/fp142380.aspx

    仰る通りです。現在使用しているリクエストは下記で、クエリが2000文字を超えてしまっている状態です。
    https://hogehoge.sharepoint.com/sites/hoge/_api/web/lists/getbytitle('hogehoge)/items?$filter以下略

    CAMLでの絞り込みを行ってアイテム取得するのは下記URL最上部のサンプルを参考にするようなかたちでしょうか?(私にはCSOMかJSOMか判断がついてませんが。。。)
    https://msdn.microsoft.com/ja-jp/library/office/ee534956(v=office.14).aspx?cs-save-lang=1&cs-lang=jscript#code-snippet-1

    すみません、一つ記載を忘れてしまったのですが、今回のアイテム取得元のリストですが、5000件をゆうに超えるアイテムを格納する予定となっているのですが、CSOM.JSOMでのアイテム取得は5000件を超えたリストからも取得が可能なものでしょうか?

    早速検証を開始し、経過を報告させて頂きたく思います。

    2016年4月27日 1:10
  • SharePoint は知らない自分がレスするのは何ですが・・・(SharePoint = IIS + ASP.NET + SQL Server + 独自拡張 と理解していますが、独自拡張の部分を知らないという意味です)

    > クエリが2000文字を超えてしまっている状態です。

    Web サーバーに IIS7 以降を使っているのであれば、IIS7 から導入された「要求のフィルタリング <requestFiltering>」でクエリ文字列がデフォルトで 2048 バイトに制限されているので、それに引っかかっているのだと思います。

    IIS の設定を変えられるのであれば requestLimits 子要素の maxQueryString 属性の設定を変えて試してみてはいかがですか。IIS マネージャーを使っても設定できます。

    詳しくは以下の記事を見てください。

    要求のフィルタリング <requestFiltering>
    https://technet.microsoft.com/ja-jp/library/ee431637.aspx

    要求制限 <requestLimits>
    https://technet.microsoft.com/ja-jp/library/ee431638.aspx

    ハズレでしたらすみません。

    #REST なので、CRUD 操作 (CREATE, READ, UPDATE, DELETE) を実行するのに、CRUD の順に HTTP の PUT, GET, POST, DELETE 要求を利用するはずです。なので、今回のケースで POST 要求を使うのが適切かどうかは疑問です。

    2016年4月27日 2:00
  • SurferOnWww 様
    ご回答ありがとうございます。

    IISの設定についてですが、今回の開発については不特定多数の環境に対して適用するため、設定は難しいと考えております。

    >今回のケースで POST 要求を使うのが適切かどうかは疑問です。
    SharePointの検索APIでは、GET要求時URLの長さの上限を超える場合、代わりにPOSTを使用する情報があったため、
    今回のケースでも同様の回避策が無いかを模索していた次第です。
    参考:https://msdn.microsoft.com/ja-jp/library/office/jj163876.aspx

    2016年4月27日 3:00
  • 試せてませんがバッチ要求を噛ませればいけるかもしれません。 https://msdn.microsoft.com/ja-jp/library/office/dn903506.aspx
    2016年4月27日 3:09
  • > IISの設定についてですが、今回の開発については不特定多数の環境に対して適用するため、
    > 設定は難しいと考えております。

    「不特定多数の環境に対して適用」=「設定は難しい」が自分的にはどうしてもつながりません。IIS は質問者さんの管理下になく、設定を変える権限がないということでしょうか?

    > SharePointの検索APIでは、GET要求時URLの長さの上限を超える場合、代わりにPOSTを使用
    > する情報があったため

    失礼しました。SharePoint の独自拡張で READ を POST で行うことができるエンドポイント(?)が用意されているということのようですね。

    参考にされている記事では "POST 要求について、要求のクエリ パラメーターを JavaScript Object Notation (JSON) 形式で渡します" と書いてありました。それには jQuery.ajax を利用して、その data オプションに JSON 文字列を設定してやればよさそうに思えますが、そういう方法はいかがでしょう?

    jQuery.ajax の data の型
    http://surferonwww.info/BlogEngine/post/2015/10/05/what-must-be-set-to-data-option-in-jquery-ajax.aspx

    また見当違いのレスでしたらすみません。

    【追伸】

    クライアントがブラウザとは限りませんでしたね(= JavaScript / jQuery は使えない)。

    Windows Forms アプリとかでしたら、HttpWebRequest クラスを使って JSON 文字列を POST し、HttpWebResponse を使って応答を受信するという方法はどうでしょうか?

    • 編集済み SurferOnWww 2016年4月27日 7:35 【追伸】追加
    2016年4月27日 3:51
  • Takashi Shinohara様

    下記のURLを参考にJSOMによる取得を試みたのですが、
    5000件以上のアイテムが格納されているリストに対する対して処理を行おうとすると、
    エラーが発生し上手くいきませんでした。
    重ね重ね情報不足で恐縮なのですが、今回はSharePointホスト型アドインの開発を行っているのですが、
    CSOMはSharePointホスト型アプリに組み込む事は可能なのでしょうか?
    https://blogs.technet.microsoft.com/sharepoint_support/2014/11/14/sharepoint-jsom-crud/
    バッチ要求については検証する時間が確保できておりません。

    SurferOnWww 様

    当方IISについて十分な知識を持ちあわせていないですが、SharePointOnlineを使用する上でWebサーバを立てていないため、
    管理についてはMSが行っているものと考えておりました。
    仮にユーザサイドで設定変更が可能だとして、その場合テナント単位での適用がされるかと思うのですが、
    不特定多数のテナントに展開を予定しているため、IISの設定変更を前提とするアドインの開発は避けるべきかと考えておりました。

    SharePointアドインなので、クライアントはブラウザです。
    現行のGet処理についても下記サンプルのようにjQuery.ajaxを使用しております。

    var searchUrl = https://hogehoge.sharepoint.com/sites/hoge/_api/web/lists/getbytitle('hogehoge)/items?$filter=hoge%20eq&20hoge
    $.ajax({
        url: searchUrl,
        method: "GET",
        headers: {
            "accept": "application/json;odata=verbose"
        },
        success: onQuerySuccess,
        error: onQueryError
    });

    参考記事のAPIは検索RESTAPIなのですが、POSTで情報を取得出来るのは検索RESTAPIの特有のものだと思っております。
    ただ、検索RESTAPIではリストアイテムの詳細なデータを取得できないため、壁にぶつかっている現状であります。

    2016年5月6日 3:01
  • IIS の件、返答をありがとうございます。状況了解しました。

    Microsoft のサポートにクエリ文字列のバイト数制限を緩和するのにどのような対応が可能か聞いてみてはいかがでしょう。聞いてみたら意外と簡単な話で、選択肢の一つになるかも知れません。


    > 現行のGet処理についても下記サンプルのようにjQuery.ajaxを使用しております。
    ・・・
    > ただ、検索RESTAPIではリストアイテムの詳細なデータを取得できないため、壁にぶつかって
    > いる現状であります。

    「現行のGet処理」は「検索 REST API」に対する要求で、クエリ文字列のバイト数制限に引っかからなければ必要としている「詳細なデータ」を取得できると理解していましたが。

    結局、必要としている「詳細なデータ」を取得するには、「検索 REST API」は、GET / POST に関係なく、使えないということでしょうか?

    自分は SharePoint の検索 REST API というものは知らないので話が通じてないのかもしれません。その場合は失礼しました。

    2016年5月6日 4:22
  • SurferOnWww 様

    そうですね、サポートへの問い合わせも視野に入れたいと思います。

    「現行のGet処理」は、「リストおよびリストアイテムRESTAPI」を使用しております。(正式名称かどうかは不明)
    イメージとしてはSQLでレコードを取得するようなものです。
    https://msdn.microsoft.com/ja-jp/library/office/dn531433.aspx

    お察しの通り、「検索RESTAPI」ではGET/POSTに関わらず、求めている結果が得られません。
    こちらはGoogle検索のようなもので、あらゆるオブジェクトの概要を取得するようなものです。

    現状は文字数上限に引っかからないようにクエリを区切ってひたすらループを回す処理で妥協していますが、
    リストの構成を見なおして回避するのが妥当かと考えております。
    バッチ要求の検証が出来ていませんが、当質問に対しての回答は「POSTでアイテム取得は出来ない」ということでクローズさせて頂きます。

    Takashi Shinohara 様、SurferOnWww 様
    ご回答ありがとうございました。

    2016年5月6日 5:15