2014-11-14 53 views
2

我正在使用ng-resource模块在我的angular js应用中调用rest服务。我将我的角度js代码用于另一个我使用跨域库的Sharepoint托管应用程序。使用ng-resource在angular js中使用Sharepoint REST服务时的错误请求

旧的代码是这样的:

现在在我的新的角度js代码如下所示:

我ProductResource.js

我不得不使用一个子,因为它的应用程序一个SPA和路由添加了一个#最后,所以这也有一个不好的要求,但我相信最好删除它。

(function() { 
    "use strict"; 

    angular 
     .module("common.services") 
     .factory("productResource", 
       ["$resource", 
       productResource]); 

    function productResource($resource) { 
     var listName = "Products"; 

     var n = SPAppWebUrl.indexOf("#"); 
     var resUrl = SPAppWebUrl.substring(0, n); 


     // the url to use for the REST call. 
     var url = resUrl + "/_api/SP.AppContextSite(@target)" + 

     // this is the location of the item in the parent web. This is the line 
     // you would need to change to add filters, query the site etc 
     // "/web/lists/getbytitle('" + listName + "')/items?" + 
      "/web/lists/getbytitle('" + listName + "')/items?$select=Id,productName,productCode,releaseDate,description,cost,price,category,tags,imageUrl" + 
      "&@target='" + SPHostUrl + "'"; 

     //return $resource(url); 
     //return $resource("/api/products/:productId") 

     return $resource(url, {}, { 
      query: { 
       method: 'GET', 
       headers: { "Accept": "application/json; odata=verbose" } 
      }, 
      create: { method: 'POST' } 
     }); 
    } 

}()); 

ProductListCtrl,它使用的查询方法

(function() { 
    "use strict"; 
    angular 
     .module("productManagement") 
     .controller("ProductListCtrl", 
        ["productResource", 
        ProductListCtrl]); 

    function ProductListCtrl(productResource) { 
     var vm = this; 

     productResource.query(function (data) { 
      vm.products = data; 
     }); 

     vm.showImage = false; 

     vm.toggleImage = function() { 
      vm.showImage = !vm.showImage; 
     } 
    } 
}()); 

和App.js这可能不是相关

var SPHostUrl; 
var SPAppWebUrl; 
var ready = false; 

$(document).ready(function() { 
    var params = document.URL.split("?")[1].split("&"); 
    for (var i = 0; i < params.length; i = i + 1) { 
     var param = params[i].split("="); 
     switch (param[0]) { 
      case "SPAppWebUrl": 
       SPAppWebUrl = decodeURIComponent(param[1]); 
       break; 
      case "SPHostUrl": 
       SPHostUrl = decodeURIComponent(param[1]); 
       break; 
     } 
    } 
}); 

(function() { 
    "use strict"; 
    var app = angular.module("productManagement", 
          ["common.services", 
          "ui.router", 
          "ui.mask", 
          "ui.bootstrap"]); 

    app.config(["$stateProvider", 
       "$urlRouterProvider", 
     function ($stateProvider, $urlRouterProvider) { 
      $urlRouterProvider.otherwise("/"); 

      $stateProvider 
       .state("home", { 
        url: "/", 
        templateUrl: "../Scripts/app/welcomeView.html" 
       }) 
       // Products 
       .state("productList", { 
        url: "/products", 
        templateUrl: "../Scripts/app/products/productListView.html", 
        controller: "ProductListCtrl as vm" 
       }) 
       .state("productEdit", { 
        abstract: true, 
        url: "/products/edit/:productId", 
        templateUrl: "../Scripts/app/products/productEditView.html", 
        controller: "ProductEditCtrl as vm", 
        resolve: { 
         productResource: "productResource", 

         product: function (productResource, $stateParams) { 
          var productId = $stateParams.productId; 
          return productResource.get({ productId: productId }).$promise; 
         } 
        } 
       }) 
       .state("productEdit.info", { 
        url: "/info", 
        templateUrl: "../Scripts/app/products/productEditInfoView.html" 
       }) 
       .state("productEdit.price", { 
        url: "/price", 
        templateUrl: "../Scripts/app/products/productEditPriceView.html" 
       }) 
       .state("productEdit.tags", { 
        url: "/tags", 
        templateUrl: "../Scripts/app/products/productEditTagsView.html" 
       }) 

       .state("productDetail", { 
        url: "/products/:productId", 
        templateUrl: "../Scripts/app/products/productDetailView.html", 
        controller: "ProductDetailCtrl as vm", 
        resolve: { 
         productResource: "productResource", 

         product: function (productResource, $stateParams) { 
          var productId = $stateParams.productId; 
          return productResource.get({ productId: productId }).$promise; 
         } 
        } 
       }) 

     }] 
    ); 
}()); 

的错误是错误的请求,但我不能找到什么REST网址错误。

https://levalencia-00346f286827fc.sharepoint.com/sites/dev/CoreAngularJSCRUDSPList/_api/SP.AppContextSite(@target)/web/lists/getbytitle( '产品')/项目?$选择=编号,产品名称,产品代码,RELEASEDATE,说明,成本,价格,类别,标签,IMAGEURL & @ TARGET = 'https://levalencia.sharepoint.com/sites/dev'”

见我控制台错误的位置:

http://screencast.com/t/uxNh781s

回答

0

这可能是因为你在你的请求发送有问题的数据(例如:一个https://开头内您的网址)。尝试修改您的配置文件,如下所示:

<configuration> 
    <system.web> 
    <pages validateRequest="false"/> 
+0

不应该主机被url编码吗? – flup 2014-11-23 21:34:19

+1

编码有助于将某些字符转换为正确的url格式..但也有其他字符由于安全原因被阻塞(如sql注入等)。所以,在这种情况下,编码无法帮助 - 您需要关闭机制,以便在编码或不编码时允许有风险的字符 – ymz 2014-11-23 22:31:27

+0

这是一个共享点托管的应用程序。不是供应商托管的应用程序,所以这意味着没有web.config – 2014-11-24 10:03:44

相关问题