我正在使用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
不应该主机被url编码吗? – flup 2014-11-23 21:34:19
编码有助于将某些字符转换为正确的url格式..但也有其他字符由于安全原因被阻塞(如sql注入等)。所以,在这种情况下,编码无法帮助 - 您需要关闭机制,以便在编码或不编码时允许有风险的字符 – ymz 2014-11-23 22:31:27
这是一个共享点托管的应用程序。不是供应商托管的应用程序,所以这意味着没有web.config – 2014-11-24 10:03:44