我们使用Sharepoint 2013 REST API从Sharepoint获取所有新闻项。 我们制作了一个自定义ContentType“Newsitem”,其中包含一些属性,包括发布图像字段。
var contentTypeId = "0x01100018B03AC7E8312648AEA00851DEDBCAF802";
var standardUri = "https://examplesite.com/blog/_api/lists/getbytitle('Messages')/items?$top=7&$filter=startswith(ContentTypeId,'" + contentTypeId + "')";
var selectiveUri = "https://examplesite.com/blog/_api/lists/getbytitle('Messages')/items?$top=7&$filter=startswith(ContentTypeId,'" + contentTypeId + "')&$Select=Title,Teaser,Body,ShowAt,TeaserImg";
使用standardUri进行我的REST调用,我检索所有属性但没有TeaserImg。 明确选择TeaserImg会使呼叫失败。
为什么我找不到TeaserImg,使用Sharepoint 2013 REST Api不是这样,我应该使用CSOM吗?
答案 0 :(得分:12)
似乎无法使用List Item Collection端点检索Publishing Image
字段。
有一种解决方法,可以通过SharePoint REST端点使用ListItem.FieldValuesAsHtml
属性检索发布字段,如下所示
限制:它需要执行两个请求。
function getJson(endpointUri, success, error)
{
$.ajax({
url: endpointUri,
type: "GET",
processData: false,
contentType: "application/json;odata=verbose",
headers: {
"Accept": "application/json;odata=verbose"
},
success: success,
error: error
});
}
function getPublishingPage(webUrl,listName,listItemId,publishingProperties, success, failure)
{
var itemUri = webUrl + "/_api/web/lists/getbytitle('" + listName + "')/items(" + listItemId + ")";
getJson(itemUri,
function(data){
var pageItem = data.d;
var selectProperties = [];
for(var idx in publishingProperties){
if(!pageItem.hasOwnProperty(publishingProperties[idx])){
selectProperties.push(publishingProperties[idx]);
}
}
if(selectProperties.length > 0) {
//construct an additional query
var query = '/FieldValuesAsHtml?$select=' + selectProperties.join(',');
var endpointUri = pageItem['__metadata'].uri + query;
getJson(endpointUri,
function(data){
for(var property in data.d){
if(property == "__metadata") continue;
pageItem[property] = data.d[property];
}
success(pageItem);
},
failure);
}
else {
success(pageItem);
}
},
failure);
}
<强>用法强>
以下示例演示了如何检索包含发布字段的页面字段,例如PublishingRollupImage
:
getPublishingPage(_spPageContextInfo.webAbsoluteUrl,'Pages',3,['PublishingRollupImage','PublishingPageImage'],printPageDetails,logError);
function printPageDetails(pageItem)
{
console.log('Page Content: ' + pageItem.PublishingPageContent);
console.log('Page Title: ' + pageItem.Title);
console.log('Page Rollup Image ' + pageItem.PublishingRollupImage);
}
function logError(error){
console.log(JSON.stringify(error));
}
这里最好的解决方案可能是利用CSOM
function getListItems(listTitle,success,error)
{
var ctx = SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle(listTitle);
var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
ctx.load(items);
ctx.executeQueryAsync(function() {
success(items);
},error);
}
getListItems('Pages',printPageItemsDetails,logError);
function printPageItemsDetails(pageItems)
{
for(var i = 0; i < pageItems.get_count();i++) {
var pageItem = pageItems.getItemAtIndex(i);
console.log(pageItem.get_fieldValues()['PublishingPageContent']);
console.log(pageItem.get_fieldValues()['PublishingRollupImage']);
}
}
答案 1 :(得分:6)
不幸的是,发布图像字段在技术上不能通过REST返回(至少,根据this article)。
但是我发现(使用Advanced REST client)你可以通过发出两个请求来实际检索发布图像字段的html。一个用于检索您尝试获取发布图像的列表项,另一个用于通过返回结果的FieldValuesAsHtml
属性检索发布图像html。
getPublishingImage(listname, id){
var publishingImage = '';
$.ajax({
url: _spPageContextInfowebroot.webAbsoluteUrl + '/_api/web/lists/getbytitle(\'' + listname + '\')/items(' + id + ')',
method: 'GET',
headers: {
Accept: 'application/json; odata=verbose'
},
success: function(data, request){
// List item retrieved. Fetch the Publishing Image.
var publishingImageUri = data.d.0.FieldValuesAsHtml.__deferred.uri;
// Query SharePoint
$.ajax({
url: publishingImageUri,
method: 'GET',
headers: {
Accept: 'application/json; odata=verbose'
},
success: function(data, request){
publishingImage = data.d.Image;
}
});
}
});
// Return the Publishing Image html
return publishingImage;
};
虽然不理想,但至少使用html,您可以使用jQuery或其他方法从html元素中提取图像uri。或者您可以简单地将元素插入DOM中。
希望这有帮助!
答案 2 :(得分:0)
function LoadArticle(item) {
return GetPublishingPageImage(item, ["DCCAIContentImage"]).then(function(
pub
) {
for (var property in pub.d) {
if (property == "__metadata") continue;
item.DCCAIContentImage(pub.d[property]);
}
});
}
function GetPublishingPageImage(curItem, publishingProperties) {
var query = "/FieldValuesAsHtml?$select=" + publishingProperties;
//debugger;
var endpointUri = curItem["__metadata"].uri + query;
// var endpointUri = curItem.__metadata().uri + query;
return $.ajax({
url: endpointUri,
type: "GET",
processData: false,
contentType: "application/json;odata=verbose",
headers: {
Accept: "application/json;odata=verbose"
}
}).then(function(response) {
return response;
});
}
答案 3 :(得分:0)
我找到了一种在一次调用中获取所有数据的方法:使用RenderListDataAsStream POST REST call:
this._webAbsoluteUrl +
"/_api/web/GetList(@listUrl)/RenderListDataAsStream?
@listUrl=%27%2Fsites%2F<scName>%2Flists%2F<listUrlName>%27";
它提供了所有简单的文本字段数据,可用于更复杂的字段,例如托管元数据和查找字段,但更重要的是,在这种情况下,它为您提供了用于“发布图像”列的图像的url。
您确实需要从以下结构进行解析:
"<div dir="" class="ms-rtestate-field"><img alt="" src="/sites/<scName>/SiteAssets/<myImageOnSharepoint>.jpg" style="BORDER:0px solid;" /></div>"
代码示例(带有TypeScript的SPFx):
const requestHeaders: Headers = new Headers();
requestHeaders.append("Content-type", "application/json");
requestHeaders.append("Accept", "application/json");
var body =
{ parameters:
{
DatesInUtc: "true"
}
};
const httpClientOptions: IHttpClientOptions = {
body: JSON.stringify(body),
headers: requestHeaders
};
const queryUrlGetAllItems: string =
this._webAbsoluteUrl +
`/_api/web/GetList(@listUrl)/RenderListDataAsStream?@listUrl=%27%2Fsites%2F<scName>%2Flists%2F<listUrlName>%27`;
return this._webPartContext.spHttpClient
.post(queryUrlGetAllItems, SPHttpClient.configurations.v1, httpClientOptions)
.then((response: any) => {
if (response.status >= 200 && response.status < 300) {
return response.json();
} else {
return Promise.reject(new Error(JSON.stringify(response)));
}
})
.then((data: any) => {
if (data) {
for (let i = 0; i < data.Row.length; i++) {
let item = data.Row[i];
// ... process data
}
}
// ... return value
});