Jquery(Ajax) 调用 SharePoint 2013 Search Rest API 并使用Josn反回结果并简单显示:
SharePoint 2010 中使用的 search.asmxSOAPwebservice在SharePoint 2013中已经被标记为过期, 但为了和老版本的Solution兼容还是可以用的。
而替代search.asmx的技术为SharePoint 2013 Search Rest API:
http://blogs.msdn.com/b/nadeemis/archive/2012/08/24/sharepoint-2013-search-rest-api.aspx
主要用于三方系统需要集成SharePoint 的 Enterprise Search 功能:
query |
http://host/site/_api/search/query |
使用Get方式取得查询结果,URL长度有限制 |
postquery |
http://host/site/_api/search/postquery |
使用Post方式取得查询结果,可以克服URL长度有限制 |
suggest |
http://host/site/_api/search/suggest |
使用Get 方式取得search suggestion(搜索建议) |
本文将展示用Jquery(Ajax) 调用 SharePoint 2013 Search Rest API 并使用Josn反回结果并简单显示的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untitled Page</title> <script type="text/javascript" language="javascript" src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.8.0.js"></script> <script type="text/javascript" language="javascript"> function StartSearch() { resultDiv.style.dispaly = "none"; $("#resultTable").empty(); // 显示Loading data 图片 loadingDataDiv.style.display = "block"; // 在搜索之前先要取到X-RequestDigest, 并使用Ajax request的Header 传到服务器端,如果没有X-RequestDigest 会出现 403 错误 $.ajax( { url: "http://host/_api/contextinfo", type: "Post", dataType: "xml", contentType: "text/xml; charset=\"utf-8\"", complete: ProcessDigest }); } var loadingDataDiv; var resultDiv; $(document).ready(function () { loadingDataDiv = $("#dataloadingDiv")[0]; resultDiv = $("#searchResultDiv")[0]; // 开始要隐藏 Loading data 图片 loadingDataDiv.style.display = "none"; resultDiv.style.dispaly = "none"; // 注意该句不加时,若Ajax跨站点访问会出现 “No Transport” error jQuery.support.cors = true; }); // 处理http://host/_api/contextinfo 返回的结果(提取X-RequestDigest 并发送搜索请求至 SharePoint Search Rest API) function ProcessDigest(xData, status) { if (xData.status == 200) { // Use the $.parseXML throw out unsupported pseudo, so use the beetleheaded way // var xmlDoc = $.parseXML(xData.responseText.replace("d:", "")); // $xml = $(xmlDoc); // var xRequestDigest = $xml.find("FormDigestValue").text(); var xRequestDigest = xData.responseText.SubStringBetween("<d:FormDigestValue>", "</d:FormDigestValue>"); // 取用户输入搜索字符串 var queryText = $("#SearchText")[0].value; // 发送搜索请求至 SharePoint Search Rest API $.ajax( { url: "http://host/_api/search/postquery", type: "Post", dataType: "application/json;odata=verbose", data: JSON.stringify({ 'request': { 'Querytext': queryText, 'StartRow': 1, 'RowLimit': 8, 'SelectProperties': { 'results': ['Title', 'ContentSource', 'DisplayAuthor', 'Path'] }, 'TrimDuplicates': true, 'Refiners': 'companies,contentclass,FileType(filter=6/0/*)', 'RefinementFilters': { 'results': ['filetype:equals("docx")'] } } }), headers: { "accept": "application/json;odata=verbose", "content-type": "application/json;odata=verbose", "X-RequestDigest": xRequestDigest }, complete: ProcessSearchResult }); } else { alert(status + xData.responseText); loadingDataDiv.style.display = "none"; } } // 处理Search Rest API返回的数据,将其转换成 Josn对象并显示在表格中 function ProcessSearchResult(xData, status) { if (xData.status == 200) { // 隐藏 Loading data 图片 loadingDataDiv.style.display = "none"; // 将搜索结果转换成 Josn对象 var josnData = $.parseJSON(xData.responseText); // 清空表格内容 $("#resultTable").empty(); var row = "<tr><td>Title</td><td>ContentSource</td><td>DisplayAuthor</td><td>Path</td></tr>"; $('#resultTable').append(row); // 遍历搜索结果并逐条插入表格 $.each(josnData.d.postquery.PrimaryQueryResult.RelevantResults.Table.Rows.results, function () { var title; var contentSource; var displayAuthor; var path $.each(this.Cells.results, function () { if (this.Key == "Title") title = this.Value; if (this.Key == "ContentSource") contentSource = this.Value; if (this.Key == "DisplayAuthor") displayAuthor = this.Value; if (this.Key == "Path") path = this.Value; }); row = '<tr><td>' + title + '</td><td>' + contentSource + '</td><td>' + displayAuthor + '</td><td>' + path + '</td></tr>'; $('#resultTable').append(row); }); // 显示搜索结果 resultDiv.style.dispaly = "block"; } else { alert(status + xData.responseText); loadingDataDiv.style.display = "none"; } } // String 方法扩展, 由于$.ParseXML方法报错unsupported pseudo,所以采用分割字符串的笨方法来取FormDigestValue的值 String.prototype.SubStringBetween = function (prefix, suffix) { var strArray = this.split(prefix); var strArray1 = strArray[1].toString().split(suffix); return strArray1[0]; }; </script> </head> <body> <div id="inputDiv" > <input id="SearchText" type="text"/> <input id="Search" type="button" value="button" onclick="StartSearch()" /> </div> <div id="dataloadingDiv" > <img src="Loading3.gif" /> </div> <div id="searchResultDiv"> <table id="resultTable" border="1"> </table> </div> </body> </html>