SharePointにJavaScriptでTickerを実装する - WebService の呼び出し(1)

SOAPメソッドの確認

http:///_vti_bin/Lists.asmx?op=GetListItems を見てサーバに送らなければいけない内容を確認

POST /_vti_bin/Lists.asmx HTTP/1.1
Host: 
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://schemas.microsoft.com/sharepoint/soap/GetListItems"
 
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <listName>string</listName>
      <viewName>string</viewName>
      <query>
        <xsd:schema>schema</xsd:schema>xml</query>
      <viewFields>
        <xsd:schema>schema</xsd:schema>xml</viewFields>
      <rowLimit>string</rowLimit>
      <queryOptions>
        <xsd:schema>schema</xsd:schema>xml</queryOptions>
      <webID>string</webID>
    </GetListItems>
  </soap:Body>
</soap:Envelope>

これを元に、MSDNのLists.GetListItems を参考にしながら必要な値を埋めていけばいいみたい。

引数

詳細はMSDNのヘルプを見るとして、簡単にまとめれば…

引数名 解説
listName 必須 取得するリストの表示名か GUID
viewName 任意 指定しなければ既定のビューになる、GUID で指定
query 任意 リストに対する検索クエリ(SQL の Where 句のようなモノ)
viewFields 任意 取得したいフィールド指定
rowLimit 任意 取得するレコード数、指定した場合は既定のビューの設定より優先される
queryOptions 任意 いろいろオプション設定が可能
webID 任意 親Webサイトの GUID、指定しなくてもいいらしい

これに従えば最小のリクエストは

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
        <GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
            <listName>{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}</listName>
        </GetListItems>
    </soap:Body>
</soap:Envelope>;

かな?

listName

同じ Lists.asmx にある GetListCollection を呼んであげれば GUID を取得できるみたいだけど、とりあえずのテストなのでリストの表示名で指定するか、下記の方法で逃げ

  1. GUID を調べたいリストの一覧ページを開く
  2. 「操作」から「RSS フィードの表示」をする
  3. 表示された URL の /_layouts/listfeed.aspx?List= 以下が URL エンコードされた GUID なのでデコードして使う
    1. %7B → {
    2. %2D → -
    3. %7D → }

XHTMLRequest

素でXMLHttpRequestを呼ぶのはちょっと嫌なので jQuery を用いて上のデータをポスト。とりあえず下記のを実行するとうまくいったヽ(´ー`)ノ
次のステップはとりあえずで書いたソースの見直しと各種パラメータの検討とかかな

ソース(JavaScript)
var postData = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">' +
                '<listName>{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}</listName></GetListItems></soap:Body></soap:Envelope>';
$.ajax({
    type: 'POST',
    url: '/_vti_bin/Lists.asmx',
    contentType: 'text/xml; charset=utf-8',
    dataType: 'xml',
    processData: false,
    data: postData,
    complete: function( data ) {
        document.body.innerText = data.responseText;
    },
    beforeSend: function(req) {
        req.setRequestHeader('Content-Length', postData.length);
        req.setRequestHeader('SOAPAction', 'http://schemas.microsoft.com/sharepoint/soap/GetListItems');
    }
});
結果
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/">
            <GetListItemsResult>
                <listitems xmlns:s='uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' xmlns:dt='uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' xmlns:rs='urn:schemas-microsoft-com:rowset' xmlns:z='#RowsetSchema'>
                    <rs:data ItemCount="69">
                        <z:row ows_Title='*********' (略) />
                        (略)
                    </rs:data>
                </listitems>
            </GetListItemsResult>
        </GetListItemsResponse>
    </soap:Body>
</soap:Envelope>