XMLHTTP资料,自己找了好久,发现还是微软的全

使用 XMLHTTP 在 SharePoint Team Services 中发布命令

发布日期: 6/2/2004 | 更新日期: 6/2/2004

Microsoft Corporation

2002 年 5 月

适用于:
Microsoft SharePoint Team Services

摘要:XMLHTTP 为 SharePoint Team Services Web 开发人员提供了一种将命令发布到服务器的高效方法。(8 页打印页)

*
本页内容
简介 简介
SharePoint Team Services RPC 协议 SharePoint Team Services RPC 协议
CAML 视图 CAML 视图
管理协议 管理协议
ASP ASP

简介

XMLHTTP 为 Microsoft SharePoint? Team Services 的 Web 开发人员提供了一种将命令发布到服务器的高效方法。当您需要在不离开客户端上当前调用脚本块的情况下在服务器上执行命令时,此方法特别方便。在 SharePoint Team Services SDK 中描述的几个远程过程调用 (RPC) 方法(例如 ExportListDisplayRenderView)中,服务器的响应形式为浏览器中显示的 XML 数据;但是 XMLHTTP 和 XML 文档对象模型 (DOM) 提供了在脚本中处理此数据的功能。使用 XMLHTTP 对象将命令发布到服务器后,XML 文档对象模型可用于处理服务器的响应。

XMLHTTP 可以与本机 SharePoint Team Services 协议(包括管理协议、URL 协议、SharePoint Team Services RPC 协议)以及协作应用程序标记语言 (CAML) 批处理管理器一起使用。它还可用于在列表上下文中实现 Microsoft Active Server Pages (ASP)。无论您使用哪个协议,都需要执行下列任务:

遵照协议的语法,构造要发布的字符串。如有必要,请使用给定脚本语言的转义符。

创建一个 XMLHTTPRequestServerXMLHTTPRequest 对象以及一个 DOMDocument 对象,以便处理响应。

使用 XMLHTTP open 方法建立与服务器的连接。

使用 send 方法发布命令字符串。

将 XMLHTTP 响应指定给 DOMDocument 对象以进行处理。

本文中的示例假设您已经在客户端上安装了 Microsoft XML Core Services (MSXML) 4.0(以前称为 Microsoft XML Parser)。请下载 Core Services

SharePoint Team Services RPC 协议

要使用 SharePoint Team Services RPC 协议进行发布,您可以创建带有文本区域 (PostBody) 的简单发布表单,然后将适当的 URL 指定给此表单的 action 属性,如下所示:

<FORM method="POST" action="http://[Server_Name]/[Subweb_Name]/
  _vti_bin/owssvr.dll?Cmd=DisplayPost">
  <TEXTAREA rows="18" name="PostBody" cols="72"></TEXTAREA>
  <INPUT type="submit" value="Submit">
  <INPUT type="reset" value="Reset">
</FORM>

然后,您可以使用 CAML MethodSetListSetVar 元素将 RPC 命令键入表单的文本区域。DisplayPost 命令可告诉编译器执行发布正文中包含的哪个 CAML。在此例中,目的是从自定义列表中检索数据,下面的 CAML 传送 Display 命令:

<Method ID="0,Display">
  <SetList Scope="Request">u_[ListName]</SetList>
  <SetVar Name="Cmd">Display</SetVar>
  <SetVar Name="XMLDATA">TRUE</SetVar>
</Method>

单击提交按钮时,服务器将以 XML 的格式将数据返回到浏览器。但是,您可能需要将此响应集成到自定义应用程序中,并在脚本中以编程方式对其进行处理,而不仅是以 XML 的格式显示它。

您可以编写一个在单击页面上的提交按钮时调用的脚本函数,而不必创建发布表单。首先,构造您要发布的字符串,如下所示:

<SCRIPT language="JavaScript">
function GetData()
{
   var strPost = "<ows:HttpVDir/>/_vti_bin/owssvr.dll?" +
      "Cmd=DisplayPost&PostBody=<Method ID=\"Data1\">" +
      "<SetList Scope=\"Request\">u_[ListName]</SetList>" +
      "<SetVar Name=\"Cmd\">Display</SetVar>" +
      "<SetVar Name=\"XMLDATA\">TRUE</SetVar></Method>";

请注意,引号被替换为“\”以便在 JavaScript 中使用,并且 CAML 元素 (HttpVDir) 用于返回子站点的路径。接下来,您可以创建一个 XMLHTTP 对象,打开与服务器的连接,然后张贴上述字符串。您还可以创建一个 DOMDocument 对象来包含服务器的响应。

   var objDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
   var objHTTP = new ActiveXObject("Msxml2.XMLHTTP.4.0");
   objHTTP.open("POST", strPost, false);
   objHTTP.send();
   objDoc = objHTTP.responseXML;

在此例中,async 参数被设置为 false,这可防止脚本与服务器的异步操作。也就是说,脚本将不会继续执行,直到服务器有机会处理请求和响应。一旦响应可用,就会被指定给 DOMDocument 对象。XMLHTTP 对象的 responseXML 属性用于执行到 objDoc 的指定,然后系统将分析该 XML 并从相应的节点提取数据。

   objDoc.setProperty("SelectionLanguage", "XPath");
   var viewNodes = objDoc.documentElement.selectNodes("//*/*/@ows_Price");
   strID = viewNodes.item(2).value;
   alert(strID);
}
</SCRIPT>

此处,setProperty 方法指定 XPath 将作为第二行的 selectNodes 方法中使用的语言,此方法可选择所有匹配 XPath 说明(即所有 ows_Price 属性)的节点。为变量 strID 指定了此集合中第二个属性所包含的值,一个消息框将显示返回值。

CAML 视图

您可以使用脚本块中的 CAML 视图来执行对 SharePoint Team Services 数据库的查询,并返回值以进行处理。为了使 CAML 可以执行,包含代码的页面必须包括编译器的处理说明。<HEAD>部分需要包含以下脚本块,有了此脚本块,通过 CAML 解释器 DLL 查看此页时,文档中的相关链接才能正确工作:

<Script FP_GENERATED="TRUE" Language="JavaScript">
   document.write('<ows:HTMLBase/>');
   var strBinUrl="../_vti_bin/";
</Script>

<HEAD>部分还需要包含以下块,此块允许 SharePoint Team Services DLL 对页面进行处理:

<Script FP_GENERATED="TRUE" SRC="../_vti_bin/owsredir.js">
</Script>
<Script FP_GENERATED="TRUE" Language="JavaScript">
   RedirectToFrame("[folder]/[file_name].htm",
   "../_vti_bin/owssvr.dll");
</Script>

包含以下 CAML 视图的脚本块也可以放在<HEAD>部分中。在此例中,视图返回股票小于等于 15 的项目 ID 的字符串(以逗号分隔),以便在消息框中显示。

var strView = "<ows:XML><SetList>u_[ListName]</SetList>" +
   "<View><ViewFields><FieldRef Name="ID"/></ViewFields>" +
   "<ViewBody> <Fields><Field/>" +
   "<HTML><![CDATA[,]]></HTML></Fields></ViewBody>" +
   "<Query><Where><Leq><FieldRef Name="Stock"/>" +
   "<Value Type="Number">15</Value></Leq></Where>" +
   "<OrderBy><FieldRef Name="ID"/></OrderBy></Query></View></ows:XML>";
alert(strView);

此方法在不需要动态生成字符串时工作良好,但是在需要动态生成字符串时(即字符串取决于用户输入时),则需要另一种方法。假设上述列表名称和股票数量的选择方法是:用户与下拉列表进行交互以选择列表,与文本框进行交互以键入数字。在此例中,您需要将选定的列表指定给一个变量(此处为 selList),将键入的值指定给另一个变量 (selValue),然后将这些变量插入字符串,如下所示:

var strPost = "<ows:XML><SetList>" + selList +
   "</SetList><View><ViewFields><FieldRef Name="ID"/></ViewFields>" +
   "<ViewBody><Fields><Field/><HTML><![CDATA[,]]></HTML></Fields>" +
   "</ViewBody><Query><Where><Leq><FieldRef Name="Stock"/>" +
   "<Value Type="Number">" + selValue + "</Value></Leq></Where>" +
   "<OrderBy><FieldRef Name="ID"/></OrderBy></Query></View></ows:XML>";

但是,当页面在 SharePoint Team Services 中打开时,编译器会首先扫描此页面以查找 CAML,并在服务器上执行它,然后在客户端上执行脚本。由于您希望在对脚本的响应过程中执行 CAML,因此在发布字符串之前需要从编译器掩盖 CAML,以便编译器在页面打开时不会立即尝试处理 CAML 并生成错误。为此,需要对尖括号(“<”或“>”)和引号进行编码。因此,在通过 RPC DisplayPost 方法发布到服务器之前,您需要替换这些括号和引号。

下面的代码说明了上述字符串在编码后和准备发布时的外观。请注意,CAML BatchMethod 元素已经替换了 XML 元素(即,实现了 CAML Batch Manager)。

var strPost = "<ows:HttpVDir/>/_vti_bin/owssvr.dll?" +
   "Cmd=DisplayPost&PostBody=&lt;ows:Batch&gt;" +
   "&lt;Method ID="itmIDs1"&gt;&lt;SetList&gt;" + 
   selList + "&lt;/SetList&gt;&lt;View&gt;&lt;ViewFields&gt;" +
   "&lt;FieldRef Name="ID"/&gt;" +
   "&lt;/ViewFields&gt;&lt;ViewBody&gt;&lt;Fields&gt;&lt;Field/&gt;" +
   "&lt;HTML&gt;&lt;![CDATA[,]]&gt;&lt;/HTML&gt;&lt;/Fields&gt;" +
   "&lt;/ViewBody&gt;&lt;Query&gt;&lt;Where&gt;&lt;Leq&gt;" +
   "&lt;FieldRef Name="Stock"/&gt;" +
   "&lt;Value Type="Number"&gt;" + selValue + 
   "&lt;/Value&gt;&lt;/Leq&gt;&lt;/Where&gt;&lt;OrderBy&gt;" +
   "&lt;FieldRef Name="ID"/&gt;&lt;/OrderBy&gt;" +
   "&lt;/Query&gt;&lt;/View&gt;&lt;/Method&gt;&lt;/ows:Batch&gt;";

请注意,上述 HttpVDir 元素的尖括号未编码,因为我们希望编译器立即返回子站点路径以便构造完整的 URL。发布之前,需要使用尖括号和引号替换编码,如下所示:

var strRep = /&lt;/g;
strPost = strPost.replace(strRep,"<");
strRep = /&gt;/g;
strPost = strPost.replace(strRep,">");
strRep = /"/g;
strPost = strPost.replace(strRep,"\"");

现在,可以使用 XMLHTTP 发布字符串,响应可以插入脚本以进行处理:

var objDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
var objHTTP = new ActiveXObject("Msxml2.XMLHTTP.4.0");
objHTTP.open("POST", strPost, false);
objHTTP.send();
objDoc = objHTTP.responseXML;

管理协议

XMLHTTP 还可以用于发布管理协议命令,经证明,它在从 SharePoint Team Services 之外管理基于 SharePoint Team Services 的 Web 站点的自定义应用程序上下文中十分有用。例如,下面的代码示例创建和配备了一个新的 SharePoint Team Services 子站点,在不离开当前脚本块的情况下执行 POST:

var strPost = "http://[server_name]/_vti_bin/_vti_adm/fpadmdll.dll?" +
   "web=/[new_subweb_name]&operation=create&inherit=true&username=" +
   "[domain_name]\\[user_name]&siteprovision=sharepthp";
HTTPobj = new ActiveXObject("Msxml2.XMLHTTP.4.0");
HTTPobj.open("POST", strPost, true);
HTTPobj.send();

请注意,在此例中,async 参数设置为 true,这意味着脚本将继续执行,而不必等待服务器的响应。

ASP

XMLHTTP 可用于将 ASP 集成到基于 SharePoint Team Services 的 Web 站点的功能中。这可以证明十分有用,例如当您需要在站点上下文中处理外部数据库的数据时。为此,您可以在站点页面的脚本块中创建 ServerXMLHTTPDOMDocument 对象,使用这些对象发布到服务器上的 ASP 页,然后通过脚本和 ASP 检索数据,以便在脚本中进一步处理。

下面的示例可以添加到站点页面中,它对名为 BookList.asp 的文件进行了 POST,并在消息框中显示返回的 XML 数据。

function GetData()
{
   var objSrvHTTP;
   var objDoc;
   objSrvHTTP = new ActiveXObject("Msxml2.ServerXMLHTTP.4.0");
   objDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
   objSrvHTTP.open ("POST","http://[Server_Name]/BookList.asp", false);
   objSrvHTTP.send ();
   objDoc = objSrvHTTP.responseXML;
   alert(objDoc.xml);
}

下一步,您可以使用 BookList.asp 文件中的脚本来创建 Microsoft ActiveX 数据对象 (ADO) ConnectionRecordset 对象,以便建立与数据库的连接并返回其数据进行处理。此示例使用记录集来构造返回到客户端的 XML 输出。

<%
Dim dbConnection
Dim objDoc
Dim rsBooks
Dim SQL

SQL = "SELECT * FROM BookList"

Set dbConnection = Server.CreateObject("ADODB.Connection")
Set rsBooks = Server.CreateObject("ADODB.Recordset")
dbConnection.open "Provider=Microsoft.Jet.OLEDB.4.0;Data" +
  "Source=[drive:][path]filename.mdb]"
Set rsBooks = dbConnection.Execute(SQL)
Response.ContentType = "text/xml" 
%>
<BookData>
<%
Do Until rsBooks.EOF
%>
  <BkItem>
    <BookID> <%= rsBooks("Book ID") %> </BookID>
    <Title> <%= rsBooks("Title") %> </Title>
    <Writer> <%= rsBooks("Writer") %> </Writer>
    <Stock> <%= rsBooks("Stock") %> </Stock>
    <Price> <%= rsBooks("Price") %> </Price>
  </BkItem>
<%
rsBooks.MoveNext
Loop
%>
</BookData>
<%
rsBooks.close()
dbConnection.close()
%>

除了上述示例中实现的 DOM 功能,MSXML 还提供了可在 SharePoint Team Services 的上下文中使用的许多对象、方法和属性。有关详细信息,请参阅 Microsoft XML Core Services (MSXML) 4.0 的 language reference sections

posted on 2004-10-21 17:42  胖胖  阅读(974)  评论(0)    收藏  举报

导航