2016-10-25 3 views
1

Je développe une solution de ferme (confiance totale) avec quelques WebParts faits sur commande. Pour un WebPart je veux un peu de comportement ajax, donc j'ai pensé: Pourquoi ne pas utiliser l'API JSOM? Ma partie web veux juste récupérer les nouvelles annonces, donc j'ajouté une nouvelle webpart (Solution Farm), du code HTML et le javascript suivantComment appeler l'API Sharepoint 2013 par javascript en toute confiance?

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script> 

<script type="text/javascript"> 

function retrieveListItems() { 
    SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { 
    var ctx = SP.ClientContext.get_current(); 
    var web = ctx.get_web(); 
    var list = web.get_lists().getByTitle("Announcements"); 
    ctx.load(list); 
    ctx.executeQueryAsync(
      function() { 
       console.log(list.get_title()); 
      }, 
      function (sender, args) { 
       console.log(args.get_message()); 
      } 
     ); 
    }); 
} 

dans mon html j'ai un lien pour appeler le fonction js:

<a onclick="retrieveListItems(); return false;">Call</a> 

Quand j'appelle la fonction que je reçois une erreur 403 INTERDIT, la console Google Chrome me montre les éléments suivants

/_vti_bin/client.svc/ProcessQuery 403 (FORBIDDEN) 
    executeRequest   @ MicrosoftAjax.js:5 
    executeRequest   @ MicrosoftAjax.js:5 
    invoke     @ MicrosoftAjax.js:5 
    $31_0     @ sp.runtime.js:2 
    executeClientRequestAsync @ sp.runtime.js:2 
    executeQueryAsync  @ sp.runtime.js:2 
    retrieveListItems  @ default.aspx:1091 
    onclick    @ default.aspx:1118 

Et dans l'onglet Réseau de la console Google Chrome, dans la PREVIEW (réponse) i voir les suivants

[{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…}] 
    0:{SchemaVersion: "15.0.0.0", LibraryVersion: "15.0.4420.1017", ErrorInfo: {,…},…} 
    ErrorInfo:{,…} 
    ErrorCode:-2130575251 
    ErrorMessage:"A validação de segurança para esta página não é válida e pode estar corrompida. Use o botão Voltar do navegador da Web para tentar realizar a operação novamente." 
    TRANSLATING: The security validation for this page is invalid and might be corrupted. Please use your web browser's Back button to try your operation again. 
    ErrorTypeName:"Microsoft.SharePoint.SPException" 
    ErrorValue:null 
    TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a" 
    LibraryVersion:"15.0.4420.1017" 
    SchemaVersion:"15.0.0.0" 
    TraceCorrelationId:"78edb09d-fb1d-7012-0000-026d47d0154a" 

je fais quelques recherches que j'ai trouvé quelque chose lié avec FormDigest, donc je cherchai mon code HTML pour le __REQUESTDIGEST et copié sa valeur, appelé la fonction et s'est rendu compte que le résumé envoyé est différent. Cela pourrait être la source du problème?

je fais plus de recherche et trouvé cette js fonction qui triche le RequestDigest:

function CustomUpdateFormDigest() { 
    if (window._spPageContextInfo != null) { 
     var $v_2 = window._spPageContextInfo; 
     var $v_3 = $v_2.webServerRelativeUrl; 
     var $v_4 = window._spFormDigestRefreshInterval; 
     UpdateFormDigest($v_3, $v_4); 
    } 
} 

l'appelions appeler avant ma fonction retrieveListItems(), mais il ne fonctionne pas. Tout le monde peut me diriger vers la bonne direction? c'est vraiment un problème de digest?

EDIT: Je me suis rendu compte que si ma page a mon partie Web j'obtiens l'erreur quand je clique dans le lien ET si j'exécute le manuscrit dans la console de google chrome. Si je supprime mon webpart de la page, je peux exécuter le script dans Google Chrome Console avec succès.

+0

J'ai réalisé que si j'appelle ma fonction dans la console Google Chrome dans ma "page d'accueil" je reçois l'erreur interdite, mais je l'appelle dans la page "Contenu du site", cela fonctionne – Ewerton

Répondre

1

Vous ne devez pas instancier un nouveau contexte si vous interrogez le même site mais utilisez plutôt SP.ClientContext.get_current().
Si vous interrogez un autre site Web, vous devrez gérer une certaine authentification et/ou utiliser le proxy d'exécution en fonction de ce que vous faites. Gardez à l'esprit que c'est généralement une mauvaise pratique d'interroger un site différent. Vous devriez plutôt utiliser la recherche à la place.
De même, vous ne devez pas référencer les fichiers js de SharePoint, mais utiliser la structure Script On Demande (SOD) pour attendre que SharePoint soit prêt avant d'appeler votre bibliothèque.

+0

Nice, va essayer de poster mes résultats, peut vous me fournissez des exemples ou des liens sur la façon d'utiliser le SOD que vous avez mentionné? – Ewerton

+0

Modifié, la ligne de contexte du code, même erreur. – Ewerton

+0

si j'exécute ce code dans un autre site, cela fonctionne – Ewerton

1

Trouvé la solution!

je REFERENCEMENT mes scripts dans le mauvais sens je référencement comme ceci:

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script> 
<script type="text/javascript" src="/_layouts/15/sp.runtime.js"> </script> 
<script type="text/javascript" src="/_layouts/15/sp.js"> </script> 
<script type="text/javascript" src="/_layouts/SP.debug.js"></script> 

la manière correcte est:

<script src="//ajax.aspnetcdn.com/ajax/4.0/1/MicrosoftAjax.js" type="text/javascript"></script> 
<script type="text/javascript" src="/Style Library/Js/TopNavigation.js"> </script> 

et charger les scripts SP quand je vais utiliser il, comme ceci:

SP.SOD.executeFunc('sp.js', 'SP.ClientContext', function() { 
    // My code... 
}); 
+0

que plus obtenir le contexte au lieu de créer un nouveau je suppose? – baywet