设为首页 收藏本站
查看: 1075|回复: 0

[经验分享] SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-27 12:02:01 | 显示全部楼层 |阅读模式
  虽然 JQuery 也能通过授权header实现跨域, 但SharePoint 提供了更简单的方法,它被实现在SP.RequestExecutor里 。它能访问跨域的服务包括REST API, 本示例将使用它在auto-hosted的app里从远程web site去访问SharePoint。 SP.RequestExecutor 对象包含了一个独立的客户端对象的 JavaScript 库。RequestExecutor 的使用非常像 JQuery ajax() function。它用js 代码管理请求和响应。实事上  RequestExecutor能替代JQuery , 因为它也能很好的实现功能,甚至是没有跨域的情况。
  
  针对下列情况,RequestExecutor 是非常有用的:      
1. 从web browser 访问REST API .      
2. 需要跨域, 像从远程的 web 页面到SharePoint app web.      
3. 在SharePoint farm外访问 web service .
  当使用RequestExecutor去访问外部的 web services时,远程的 web service应该要注册在 AppManifest 文件里,以便在安装app时让用户授权。本例 RequestExecutor 没有直接访问 service,它通过一个内建在SharePoint里代理页面去请求service并返回响应到页面,要让JavaScript允许跨域service的调用,否则就会被web bowser阻塞。
  本例,我们将演示怎么使用它。我们将在auto-hosted 的app,然后加入一个输入框到它的default 页面,最后我们将增加一个view-model去请求REST并显示结果。  
1. 打开Visual Studio 2012.     
2. 创建一个新的SharePoint 2013 app.     
3. 选择auto-hosted  
4. 打开 Default.aspx 页面( Pages 文件夹)     
5. 增加Microsoft AJAX toolkit  引用,SP.RequestExecutor将用到它:
  
<script type=&quot;text/javascript&quot; src=&quot;//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js&quot;></script>
  6. 添加 JQuery 和Knockout.
  


<script type=&quot;text/javascript&quot; src=&quot;../Scripts/jquery-1.7.1.min.js&quot;></script>
<script type=&quot;text/javascript&quot; src=&quot;//ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js&quot; ></script>

  
7. 替换form里的内容如下:
  


<form id=&quot;form1&quot; runat=&quot;server&quot;>
<div>
<input type=&quot;text&quot; data-bind=&quot;value: url&quot; size=&quot;100&quot; />
<br />
<br />
<select data-bind=&quot;value: format&quot;>
<option value=&quot;application/json;odata=verbose&quot;>application/json;odata=verbose</option>
<option value=&quot;application/atom-xml&quot;>application/atom-xml</option>
</select>
<br />
<br />        
<input data-bind=&quot;click: onRunRequest&quot; type=&quot;button&quot; value=&quot;Execute the REST Request&quot; />
<br />
<br />
<h1 data-bind=&quot;text: status&quot;></h1>
<p data-bind=&quot;text: message&quot; />
</div>
</form>

  
8. 保存Default.aspx.
9. 打开Default.aspx.cs .
10. 注释掉  Page_Load 里的代码.
11. 保存Default.aspx.cs .
12. 在远程 web site 项目的Script文件夹里, 创建一个文件  App.js .
  13. 替换下面的view-model 代码
  


var appweburl = decodeURIComponent(getQueryStringParameter(&quot;SPAppWebUrl&quot;));
var hostweburl = decodeURIComponent(getQueryStringParameter(&quot;SPHostUrl&quot;));
$().ready(function () {
$.getScript(hostweburl + '/_layouts/15/sp.runtime.debug.js',
function () {
$.getScript(hostweburl + '/_layouts/15/sp.debug.js',
function () {
$.getScript(hostweburl + '/_layouts/15/sp.RequestExecutor.js',
function () {
ko.applyBindings(new defaultViewModel());
});
})
})
});
function defaultViewModel() {
var self = this;
self.status = ko.observable();
self.message = ko.observable();
self.url = ko.observable(&quot;/_api/SP.AppContextSite(@target)/web/lists?@target='&quot; + hostweburl + &quot;'&quot;);
self.format = ko.observable();
self.result = null;
self.onRunRequest = function () {
var executor = new SP.RequestExecutor(appweburl);
executor.executeAsync(

{
url: appweburl + self.url(),
method: &quot;GET&quot;,
headers: {
&quot;accept&quot;: self.format(),
},
success: Function.createDelegate(self, self.onComplete),
error: Function.createDelegate(self, self.onComplete)
}
);
};
self.onComplete = function (data) {
self.status(data.statusText);
self.message(data.body);
if (self.format() == 'application/atom-xml')
self.result = $(data.body)[1];
else
self.result = JSON.parse(data.body).d;
}
}
// Utility routine
function getQueryStringParameter(paramToRetrieve) {
var params =
document.URL.split(&quot;?&quot;)[1].split(&quot;&&quot;);
var strParams = &quot;&quot;;
for (var i = 0; i < params.length; i = i + 1) {
var singleParam = params.split(&quot;=&quot;);
if (singleParam[0] == paramToRetrieve)
return singleParam[1];
}
}

  
      这段代码首先从SharePoint里加载几个JavaScript 库,这些库不能放到ASP文件里,因为它们属于SharePoint,而这个页面是在SharePoint app web外面运行的,因此不能通直接在ASPX里引用。实际上,每个文件的URL是在加载时拼出来的,一旦所有需要的script被加载,view-model 对象就和以前一样被创建并被绑定到form。下一个变化是default的 REST URL:
  


self.url = ko.observable(&quot;/_api/SP.AppContextSite(@target)/web/lists?@target='&quot; + hostweburl + &quot;'&quot;);

  这一行是使用SP.AppContextSite让URL去访问host web site里的list列表
onRunRequest() function 很像JQuery.Ajax,只不过它要先创建SP.RequestExecutor 对象.

  


var executor = new SP.RequestExecutor(appweburl);

  
当从我们的ap访问SharePoint REST API 时, 我们将使用app web作为目的地,这仅仅是表明请求应该送到哪,并不是最终的目的地。本例我们将使用SP.AppContextSite 对象访问host site. 如果在executeAsyn() function里提供的URL是在SharePoint外面,app web上的跨域代理将被转发请求。



self.onComplete = function (data) {
self.status(data.statusText);
self.message(data.body);
if (self.format() == 'application/atom-xml')
self.result = $(data.body)[1];
else
self.result = JSON.parse(data.body).d;
}
  RequestExecutor 返回了一个 JavaScript 对象,包含status 和 body 。返回的结果是字符串,而不考虑请求的格式,这个字符串里的数据是JSON或XML格式。
14. 保存App.js file.
如果我们这时去运行这个solution,它将fail,因为它不能找到app web。一个 app web 仅仅被创建于需要时,因为我们创建了的是 auto-hosted app ,还没有在app web项目里添加任何lists或其它对象, 所以当app安装时没有app web 会被创建。因为我们需要从app web访问REST API,这不会运行正常,为了强制创建一个最小的 app web, 我们将添加一个空的element到这个项目里。
15. 右击 SharePoint app项目(不是web项目)
16. Select Add ➤ New Item….
17. 选择Empty Element item 并点击 Add, 名字不重要,随便填。
18. 按F5 运行 app.
运行的结果应该跟上一个示例差不多,不同的是这个请求是在远程web app(SharePoint farm外面)执行的,你将会看到自动加上了access token。
  
  SharePoint 2013 APP 开发示例 系列

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119456-1-1.html 上篇帖子: 转载:Sharepoint 2010 Form 身份认证的实现(基于SQL) 下篇帖子: SharePoint 2010列表新增的评分功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表