点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
我正在使用定义为XMLHttpRequest的对象来执行GET并检索我在应用程序中显示的信息。 这样做时,我试图在同名的变量中检索csrfToken。 但是,这将返回null。 该令牌是必需的,因为稍后我将进行POST。
第二个问题是,当我在对象setRequestHeader属性中传递硬编码令牌时,为什么返回消息" CSRF验证失败"?
可以在SAP API Business Hub中找到示例代码: https: //api.sap.com/api/API_MANAGE_WORKFORCE_TIMESHEET/资源
当我尝试在Postman中执行调用时,它可以正常工作,因此我希望它也可以在我的UI5控制器中工作。
任何帮助将不胜感激!
onInit:函数(){
//创建并设置视图模型
var model = this.getView()。getModel(" manageTimesheet");
this.getView()。setModel(model);
var sUrl = this.getView()。getModel(" manageTimesheet")。sServiceUrl;
var userResults = new JSONModel({" data":{}});
var self = this; self.getView()。setModel(userResults," results");
//执行GET操作var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = false;
xhr.addEventListener(" readystatechange",function(){if(this.readyState === this.DONE){console.log(this.responseText);}
var jsonResults = JSON.parse(this.response).d.results;
self.getView()。getModel(" results")。setProperty("/img/data",jsonResults); });
//设置请求方法
xhr.open(" GET",sUrl +"/img/TimeSheetEntryCollection?= PersonWorkAgreementExternalID eq'D000012'");
//添加请求标头
xhr.setRequestHeader(" Content-Type"," application/json");
xhr.setRequestHeader(" Accept"," application/json");
xhr.setRequestHeader(" X-CSRF-Token"," Fetch");
//API沙箱的API密钥
xhr.setRequestHeader(" APIKey"," XXXXXXXXXXXXXXXXXXXXXXX");
var csrfToken = xhr.getResponseHeader('x-csrf-token');
xhr.setRequestHeader(" Authorization"," Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
//发送请求
xhr.send(data);
//执行POST
var dataPost = null;
var xhrPost = new XMLHttpRequest();
xhrPost.withCredentials = false;
xhrPost.addEventListener(" readystatechange",function(){if(this.readyState === this.DONE){console.log(this.responseText);}});
//设置请求方法
//API沙箱的API端点
xhrPost.open(" POST",sUrl +"/img/TimeSheetEntryCollection",true);
//添加请求标头
xhrPost.setRequestHeader(" Content-Type"," application/json");
xhrPost.setRequestHeader(" Accept"," application/json");
//API沙箱的API密钥xhrPost.setRequestHeader(" APIKey"," FW0iwPf79VVtyqdo6PTTok6BdjHAk1hB"); xhrPost.setRequestHeader('x-csrf-Token'," CeMsHcQ2bv6Pg-tJX0-CjQ ==");;
//基本身份验证
xhrPost.setRequestHeader(" Authorization"," Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
//发送请求
xhrPost.send(dataPost); }
对于GET,我期望返回csrfToken,而不是null。
对于POST(即使我使用空白有效负载发送它),我也希望它读取CSRF令牌(硬编码的令牌)。
是不是我在这里使用的语法不正确?
感谢您指出这一点。 我在您的语句之后进行了调试,实际上,当GET语句到达csrfToken变量时,它仍然处于挂起状态。
因此,我在执行GET之后添加了getResponseHeader,并设法获得了csrfToken,因此以后我可以正确执行POST了。
xhr.addEventListener(" readystatechange",函数(){
if(this.readyState === this.DONE){console.log(this.responseText); }
var jsonResults = JSON.parse(this.response).d.results; self.getView()。getModel(" results")。setProperty("/img/data",jsonResults);
var csrfToken = xhr.getResponseHeader('x-csrf-token'); console.log(csrfToken);
});
这是API本身的代码段提供的解决方案(请参见上面的链接),这就是我选择此解决方案的原因。 您有示例如何使用odatamodel进行发布吗?
var csrfToken = xhr.getResponseHeader('x-csrf-token');
您尚未发送请求,如何获得响应?
xhr.setRequestHeader(" Authorization"," Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
//发送请求
xhr.send(data);
//执行POST
为什么使用XMLHttpRequest? 不使用odatamodel?
一周热门 更多>