Come abbiamo detto, il modello App-oriented inserito all'interno di questa nuova versione di SharePoint, è stato pensato in modo tale da girare in un contesto isolato (attraverso l'utilizzo di un nuovo dominio).
Questo fa si che tutte le chiamate HTTP fatte a risorse esterne al contesto dell'App, tramite Javascript, siano in effetti delle chiamate cross-site. Le chiamate cross-site di questo tipo sono espressamente vietate, proprio nel senso che è il browser stesso a bloccarvele.
Ovviamente, se facciamo richieste di questo tipo da una Provider-Hosted App o da una Auto-Hosted App, sfruttando quindi .NET e la parte di code-behind delle nostre pagine, non abbiamo questo problema.
Il problema viene fuori, come vi dicevo, quando si effettuano queste chiamate dalla parte front-end della nostra applicazione (quindi dal codice Javascript che decidiamo di scrivere).
SharePoint ha però una soluzione per questo, che è quella di fare per noi la chiamata cross-site.
Che significa "fare per noi"?
Significa che attraverso due particolari classi Javascript (la classe SP.WebRequestInfo e la classe SP.WebProxy) abbiamo la possibilità di passare a SharePoint l'endpoint remoto che vogliamo chiamare (sfruttando quindi una chiamata al servizio Client.svc nello stesso dominio dell'App ed evitando la chiamata cross-site) e farci ritornare il risultato nel formato richiesto.
Il codice per la chiamata è veramente semplice:

'use strict';


window.D4S = window.D4S || {};
window.D4S.RssReader = window.D4S.RssReader || {};

D4S.RssReader.RssFeedViewModel = function () {
var self = this;

self.feedItems = ko.observableArray([]);

self.loadFeed = function () {

//wrong method, because throws a cross-domain exception! //$.ajax({ // url: 'http://www.peppedotnet.it/Rss.aspx', // type: 'GET', // success: function (data) { // //we can't go here // }, // error: function (jqXHR, textStatus, errorThrown) { // } //});
//right method, using SharePoint WebRequestInfo var context = SP.ClientContext.get_current();
var request = new SP.WebRequestInfo();
request.set_url('http://www.peppedotnet.it/Rss.aspx'); request.set_method("GET");
var response = SP.WebProxy.invoke(context, request); //SharePoint makes the cross-domain call for you! context.executeQueryAsync(function () {
if (response.get_statusCode() == 200) {
var rss = response.get_body();
var items = $(rss).find('item');
$.each(items, function (index, item) {
self.feedItems.push({
Id: $(item).find('guid').text(),
Title: $(item).find('title').text(),
Url: 'http://www.peppedotnet.it' + $(item).find('guid').text(), Category: $(item).find('category').text(),
Body: $(item).find('description').text()
});
});
}
}, function (sender, args) {
alert('error');
});
};
};

$(document).ready(function () {
var model = new D4S.RssReader.RssFeedViewModel();
ko.applyBindings(model);

model.loadFeed();
});

Ho utilizzato KnockoutJs per fare questo esempio. Non è niente di complicato, ma vi rimando cmq al sito ufficiale di questa libreria perchè è veramente utile: http://knockoutjs.com.
Come potete vedere, le due classi utili ad effettuare la chiamata all'endpoint remoto fanno parte del Client Object Model di SharePoint 2013 e quindi seguono le sue stesse regole e la sua sintassi. Infatti, se guardiamo la chiamata che viene fatta con uno sniffer qualsiasi, vediamo che viene chiamato il servizio Client.svc e che gli vengono passati dei dati in formato XML, all'interno dei quali riconosciamo la nostra URL remota che abbiamo detto a SharePoint di chiamare per noi.

Come chiamare un endpoint remoto da un App SharePoint 2013

L'unica cosa che dobbiamo ricordarci di fare è quella di inserire all'interno dell'AppManifest.xml della nostra App, l'endpoint remoto che la stessa App richiama per il suo corretto funzionamento. Questo lo possiamo fare utilizzando l'editor che Visual Studio 2012 ci mette a disposizione (una volta installati i tool per lo sviluppo di applicazioni per SharePoint 2013).

Come chiamare un endpoint remoto da un App SharePoint 2013

Così facendo, una volta che l'utente ha acconsentito al fatto che la nostra App effettua delle chiamate ad endpoint remoti, SharePoint è in grado di effettuare la chiamata in tutta tranquillità.