【问题标题】:Access to REST Sharepoint data from another domain从另一个域访问 REST Sharepoint 数据
【发布时间】:2018-01-26 14:47:33
【问题描述】:

有这个问题:我如何从另一台主机(比方说,另一台服务器,但在同一个域中)对 Sharepoint 2013/2016 REST api 进行 REST 调用。

默认情况下,CORS 策略将拒绝任何不是来自同一主机的请求。

我正在尝试从另一台主机通过 AJAX REST 请求检索一些信息。

谢谢!!

【问题讨论】:

    标签: rest sharepoint cors


    【解决方案1】:

    启用 SharePoint 配置以启用跨域访问。

    以下脚本由 Ingo Karstein here分享

    Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0
    
    $localFarm = Get-SPFarm
    
    $webapp = Get-SPWebApplication "http://sp:12001"
    
    # Remove old web.config modifications of MyAuthenticationProvider
    $oldMods = @();
    $webapp.WebConfigModifications | ? { $_.Owner -eq "CrossSiteScripting" } | % { 
        $oldMods = $oldMods + $_
    }
    
    $oldMods | % { 
        $webapp.WebConfigModifications.Remove($_) 
    }
    
    # update the Web Application and apply all existing web.config modifications - this executes the "remove" actions from above
    $webapp.Update()
    [Microsoft.SharePoint.Administration.SPWebService]::ContentService.ApplyWebConfigModifications()
    
    #Wait until web.config modifications finished by timer job
    while( (Get-SPTimerJob | ? { $_.Name -eq "job-webconfig-modification"}) -ne $null ) {
        Write-Host "." -NoNewline
        Start-Sleep 1
    }
    
    # New web.config modifications for MyAuthenticationProvider
    $myModification1 = new-object Microsoft.SharePoint.Administration.SPWebConfigModification
    $myModification1.Path = "configuration/system.webServer/httpProtocol/customHeaders"
    $myModification1.Name = "add[@name='Access-Control-Allow-Origin'][@value='http://wfm:13002']"
    $myModification1.Sequence = 0
    $myModification1.Owner = "CrossSiteScripting"
    #0 = for the enum value "SPWebConfigModification.SPWebConfigModificationType.EnsureChildNode"
    $myModification1.Type = 0
    $myModification1.Value = "<add name='Access-Control-Allow-Origin' value='http://wfm:13002' />"
    $webapp.WebConfigModifications.Add($myModification1)
    
    $myModification1 = new-object Microsoft.SharePoint.Administration.SPWebConfigModification
    $myModification1.Path = "configuration/system.webServer/httpProtocol/customHeaders"
    $myModification1.Name = "add[@name='Access-Control-Request-Method'][@value='GET,POST,HEAD,OPTIONS']"
    $myModification1.Sequence = 0
    $myModification1.Owner = "CrossSiteScripting"
    $myModification1.Type = 0
    $myModification1.Value = "<add name='Access-Control-Request-Method' value='GET,POST,HEAD,OPTIONS' />"
    $webapp.WebConfigModifications.Add($myModification1)
    
    $myModification1 = new-object Microsoft.SharePoint.Administration.SPWebConfigModification
    $myModification1.Path = "configuration/system.webServer/httpProtocol/customHeaders"
    $myModification1.Name = "add[@name='Access-Control-Request-Headers'][@value='Content-Type,Authorization']"
    $myModification1.Sequence = 0
    $myModification1.Owner = "CrossSiteScripting"
    $myModification1.Type = 0
    $myModification1.Value = "<add name='Access-Control-Request-Headers' value='Content-Type,Authorization' />"
    $webapp.WebConfigModifications.Add($myModification1)
    
    $myModification1 = new-object Microsoft.SharePoint.Administration.SPWebConfigModification
    $myModification1.Path = "configuration/system.webServer/httpProtocol/customHeaders"
    $myModification1.Name = "add[@name='Access-Control-Allow-Credentials'][@value='true']"
    $myModification1.Sequence = 0
    $myModification1.Owner = "CrossSiteScripting"
    $myModification1.Type = 0
    $myModification1.Value = "<add name='Access-Control-Allow-Credentials' value='true' />"
    $webapp.WebConfigModifications.Add($myModification1)
    
    $webapp.Update()
    [Microsoft.SharePoint.Administration.SPWebService]::ContentService.ApplyWebConfigModifications()
    
    #Wait until web.config modifications finished by timer job
    while( (Get-SPTimerJob | ? { $_.Name -eq "job-webconfig-modification"}) -ne $null ) {
        Write-Host "." -NoNewline
        Start-Sleep 1
    }
    

    我的测试结果:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8" />
    </head>
    <body>
        <input id="Button1" type="button" onclick="getListItems()" value="button" />
        <script type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
        <script type="text/javascript">
            function getListItems() {
                var dataEndPoint = "http://sp:12001/_api/web/lists/getbytitle('Versions')/items";
                        $.ajax({
                            url: dataEndPoint,
                            type: "GET",
                            headers: {
                                "Accept": "application/json;odata=verbose"                                                     
                            },
                crossDomain: true,
                xhrFields: { withCredentials: true },
                            success: function (data) {
                                alert(data.d.results.length);
                            },
                            error: function (response) {
                                alert("Error");
                            }
                        })
            }
        </script>
    </body>
    </html>
    

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2020-08-09
      • 1970-01-01
      • 2015-01-25
      • 2013-08-23
      • 1970-01-01
      • 2011-01-17
      • 2020-02-22
      • 2019-01-05
      相关资源
      最近更新 更多