SharePointのListsウェブサービスのGetListItems(http://<Site>/_vti_bin/Lists.asmx?op=GetListItems)を使ってみました。
C#やVBなどの使い方はサンプルソースつきでmsdnに載っているのですが、クライアントからスクリプトでサービスを呼びたかったので結構苦労しましたよ。
http://<Site>/_vti_bin/Lists.asmx?op=GetListItems
を見てみるとsoapの要求と応答のサンプルが載っています。リスト名(listName)、ビュー名(viewName)を与えるらしいです。ほかにもクエリ(query)と結果(viewFields)、取得件数(rowLimit)クエリオプション(queryOptions)とウェブID(webID)を渡すようですね。
listNameはGUIDでもリスト名を直打ちでもいいらしいくて、viewNameは省略可のようです。
queryは
<query><Query/></query>っていう発想はなかったです。これが出来るまでsoapのエラーを何度見たことか。msdnにちゃんと書いてあるんだけど、ちょっと紛らわしいですね。全文サンプル載せて欲しいです。で、このクエリのWhere句のつくり方を以下に記してみます
viewFieldsは
クライアントで戻ってきたxmlをパースすることになるので、ある程度欲しい情報は絞ったほうがいいかもしれませんね。
queryOptionはちゃんと使ってないので判りませんが、戻り値の日付フォーマットをUTCにしたり、ページングの情報を返してくれたりすることが出来るようです。
最後のwebIDはどうやら省略可能のようですが、http://<Site>/_vti_bin/SiteData.asmx?op=GetWebの戻り値の
最終的にGetListItemsでやりたかったのは、リストのビューを作らないでクエリを投げて必要なアイテムを返してもらってExtJSのGridを使ってレンダリングするということなのですが、GetListItemsで投げるクエリは完全一致したものを戻してくるのでちょっと目論見が外れました。でもリストフィールドがフリーテキストではなくて、ステータスを保持しているものであれば、意外と使えそうですね。
以下にサンプルスクリプトを載せておきます。環境に合わせて試してみてください。
C#やVBなどの使い方はサンプルソースつきでmsdnに載っているのですが、クライアントからスクリプトでサービスを呼びたかったので結構苦労しましたよ。
http://<Site>/_vti_bin/Lists.asmx?op=GetListItems
を見てみるとsoapの要求と応答のサンプルが載っています。リスト名(listName)、ビュー名(viewName)を与えるらしいです。ほかにもクエリ(query)と結果(viewFields)、取得件数(rowLimit)クエリオプション(queryOptions)とウェブID(webID)を渡すようですね。
<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>ふむふむり。このカタチで渡せってことみたいです。
listNameはGUIDでもリスト名を直打ちでもいいらしいくて、viewNameは省略可のようです。
queryは
<query><Query><Where><Eq><FieldRef Name="ID" /><Value Type="Counter">1</Value></Eq></Where></Query></query>こんな感じで組み立てたら出来ました。
<query><Query/></query>っていう発想はなかったです。これが出来るまでsoapのエラーを何度見たことか。msdnにちゃんと書いてあるんだけど、ちょっと紛らわしいですね。全文サンプル載せて欲しいです。で、このクエリのWhere句のつくり方を以下に記してみます
- FieldRef
- FieldRefタグはそのままフィールド名です。[リストの設定ページ]→[ビューの編集ページ]のHTMLソースを見ればどんな値がNameに入ってくるか判ります。スクリプトのg_FieldsというArrayに設定されている文字列がそれです。
- Name属性の例として、Title / ID / ContentType / Modified / Created / Author / Editorなどがあります。デフォルトでリストが持っているものから、追加したフィールドもg_Fieldsに全て載っています。
- Value
- ValueタグのType要素も同様、HTMLのソースを見れば判ります。今度はg_FieldTypeというArrayに設定されている文字列になります。
- Type属性の例として、Attachments / Boolean / Choice / Counter / DateTime / Lookup / RichText / Text / WorkflowStatusなどがあります
- Eq / Lt / Gt
- Eqタグはクエリで得られるアイテムそのものを返してくれるようにする要求で、他にもLtタグ、Gtタグが使えます。Ltタグはクエリ以下のもの、Gtはクエリ以上のものです。例えば、上記のクエリに5を与えていた場合、Ltで要求すると、1から4が返ってきます。
<Lt><FieldRef Name="ID" /><Value Type="Counter">5</Value></Lt>
Ltタグを使うとrowLimitタグにしたがって、要求数分1~4のIDを持つアイテムが返ってきます。
<Gt><FieldRef Name="ID" /><Value Type="Counter">5</Value></Gt>
Gtタグを使うと、6~のIDを持つアイテムがrowLimitにしたがって返ってきます。
viewFieldsは
<viewFields><ViewFields><FieldRef Name="ID" /><FieldRef Name="Title" /></ViewFields></viewFields>上記のように組み立てます。特に設定が無いと、デフォルトとして戻り値を得ることが出来るのですが、全てのフィールドが返ってくる訳ではないようですので、欲しいフィールドは明示的にこの要求から設定する必要があるようです。順番も上記設定どおりに返ってきます。
クライアントで戻ってきたxmlをパースすることになるので、ある程度欲しい情報は絞ったほうがいいかもしれませんね。
queryOptionはちゃんと使ってないので判りませんが、戻り値の日付フォーマットをUTCにしたり、ページングの情報を返してくれたりすることが出来るようです。
最後のwebIDはどうやら省略可能のようですが、http://<Site>/_vti_bin/SiteData.asmx?op=GetWebの戻り値の
<WebID>string</WebID>に入ってくる値です。
最終的にGetListItemsでやりたかったのは、リストのビューを作らないでクエリを投げて必要なアイテムを返してもらってExtJSのGridを使ってレンダリングするということなのですが、GetListItemsで投げるクエリは完全一致したものを戻してくるのでちょっと目論見が外れました。でもリストフィールドがフリーテキストではなくて、ステータスを保持しているものであれば、意外と使えそうですね。
以下にサンプルスクリプトを載せておきます。環境に合わせて試してみてください。
<script language="JavaScript">
<!--
var httpInst = window.XMLHttpRequest ? new XMLHttpRequest() : ( function() {
try { return new ActiveXObject( "Msxml2.XMLHTTP" ); }
catch( e ) { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
})();
function GetListItems() {
var renderData = '';
var qry = document.getElementById( "value_id" ).value;
httpInst.open( "POST", "http://<Site>/_vti_bin/Lists.asmx", false );
httpInst.setRequestHeader( 'Content-Type','text/xml; charset=utf-8' );
httpInst.setRequestHeader( 'SOAPAction','http://schemas.microsoft.com/sharepoint/soap/GetListItems' );
var postBody = '<?xml version="1.0" encoding="utf-8"?><soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"><soap12:Body><GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">' +
'<listName>{********-****-****-*****************}</listName>' +
'<viewName>{********-****-****-*****************}</viewName>' +
'<query><Query><Where><Eq><FieldRef Name="ID" /><Value Type="Counter">' + qry + '</Value></Eq></Where></Query></query>' +
'<viewFields><ViewFields><FieldRef Name="ID" /><FieldRef Name="Title" /></ViewFields></viewFields>' +
'<rowLimit>100</rowLimit>' +
'<queryOptions><QueryOptions/></queryOptions>' +
'<webID>{********-****-****-*****************}</webID>' +
'</GetListItems></soap12:Body></soap12:Envelope>';
httpInst.onreadystatechange = function()
{
if ( httpInst.readyState == 4 ){
xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
xmlDoc.async = false;
xmlDoc.loadXML( httpInst.responseText );
// IDで取っているので1個だけ返るはずだけど。
rowsItem = xmlDoc.selectNodes( '/soap:Envelope/soap:Body/GetListItemsResponse/GetListItemsResult/listitems/rs:data/z:row' );
for( idx = 0; idx < rowsItem.length; idx++ ){
alert( rowsItem[ idx ].getAttribute( "ows_Title" ) );
}
}
}
httpInst.send( postBody );
document.getElementById( "printField" ).innerHTML = renderItem;
}
//-->
</script>
</head>
<body>
<div>
<input type="button" value="ID検索" onclick="GetListItems()"/>
<input type="text" id="value_id" size="40" />
<div id="printField"></div>
</div>
</body>



