La lecture RESTE avec SAPUI5
Je suis en train d'essayer d'accéder à un Service REST avec SAPUI5. Je vous envoie une Requête GET avec l'aide de jQuery et de s'attendre à un JSON répondre, mais tout ce que j'obtiens est un vide d'Objet JSON. Cependant le RESTE de service testés avec un RESTClient me donne le bon de répondre.
Ici c'est le code que j'utilise jusqu'à présent:
Vue
sap.ui.jsview("sapui5_test.SAPUI5_Test", {
getControllerName : function() {
return "sapui5_test.SAPUI5_Test";
},
createContent : function(oController) {
var text = new sap.ui.commons.TextField( {
width : "100%"
});
//arrange controls on the page with a matrix layout
var ml = new sap.ui.commons.layout.MatrixLayout( {
columns : 2,
layoutFixed : true,
width : "500px"
});
ml.addRow(new sap.ui.commons.layout.MatrixLayoutRow( {
cells : [
new sap.ui.commons.layout.MatrixLayoutCell( {
content : [ text ]
})]
}));
var model = oController.initTodoModel();
text.setValue(model.getJSON());
return [ ml ];
}
});
Contrôleur
sap.ui.controller("sapui5_test.SAPUI5_Test", {
initTodoModel : function() {
var oModel = new sap.ui.model.json.JSONModel();
var aData = jQuery.ajax({
type : "GET",
contentType : "application/json",
url : "http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/",
dataType : "json",
success : function(data,textStatus, jqXHR) {
oModel.setData({modelData : data});
alert("success to post");
}
});
return oModel;
}
}
});
index.html
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<script src="resources/sap-ui-core.js"
id="sap-ui-bootstrap"
data-sap-ui-libs="sap.ui.commons,sap.ui.table,sap.ui.ux3"
data-sap-ui-theme="sap_goldreflection">
</script>
<!-- add sap.ui.table,sap.ui.ux3 and/or other libraries to 'data-sap-ui-libs' if required -->
<script>
sap.ui.localResources("sapui5_test");
var view = sap.ui.view({id:"idSAPUI5_Test1", viewName:"sapui5_test.SAPUI5_Test", type:sap.ui.core.mvc.ViewType.JS});
view.placeAt("content");
</script>
</head>
<body class="sapUiBody" role="application">
<div id="content"></div>
</body>
Comme déjà mentionné, lorsque je lance la même URL, comme dans le jQuery dans une RESTClient, je suis rempli d'Objet JSON comme un résultat, mais le résultat dans la UI5 page est vide JSON obejct {}.
J'ai aussi essayé la solution suivante:
var oModel = new sap.ui.model.json.JSONModel("http://sapm04.ibsolution.local:50000/demo.sap.com~d337_resttest_web/rest/todo/init/");
mais cela n'a pas aide.
OriginalL'auteur DI MI | 2013-11-20
Vous devez vous connecter pour publier un commentaire.
Bien, la raison en est évidente. l'instruction de retour dans le contrôleur est fait avant que l'objet json est rempli avec des données. C'est parce que le $.appel ajax est asynchrone, ce qui signifie que le JavaScript ne l'appel vers le serveur d'arrière-plan et ne pas attendre la réponse est envoyée, plutôt JavaScript va droit à l'instruction suivante, qui est de retour oModel avant d'avoir le oModel rempli avec des données. Si vous faites une synchrone demande pour le backend de votre problème sera résolu, vous pouvez le faire de cette façon:
Cependant, en utilisant des appels synchrones n'est pas recommandé, imaginez l'arrêt de votre demande jusqu'à l'appel est terminé. Ce ne serait pas une bonne affaire pour le peu de demandes, mais si vous avez une grande application qui nécessite beaucoup d'interaction avec un backend fournisseur de données, puis ce sera un problème majeur.
Si c'est à moi, je voudrais conception de l'application, de sorte que je suis capable d'enregistrer des fonctions de rappel dans la requête ajax. De sorte que la demande serait de suivre une chaîne de responsabilité comme le modèle de conception, et lorsque les données sont prêtes, le module selon qu'il sera exécuté, et de ne pas interrompre les autres modules de l'application.
En termes simples, faites tout ce que vous voulez faire avec les données par l'appel d'une fonction au sein de la réussite de la fonction et non à l'extérieur de l'appel ajax.
démarrer un autre thread à propos de cette question avec plus d'infos. J'ai la démo en jsfiddle serait parfait et je vais essayer de l'aider.
OriginalL'auteur MedAli