无法检索csrf令牌以对白名单SAP API进行POST

2020-08-18 13:41发布

         点击此处--->   EasySAP.com群内免费提供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令牌(硬编码的令牌)。

是不是我在这里使用的语法不正确?

         点击此处--->   EasySAP.com群内免费提供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令牌(硬编码的令牌)。

是不是我在这里使用的语法不正确?
付费偷看设置
发送
4条回答
Aaron 3364
1楼 · 2020-08-18 14:13.采纳回答

感谢您指出这一点。 我在您的语句之后进行了调试,实际上,当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);

});

wang628962
2楼-- · 2020-08-18 13:56

这是API本身的代码段提供的解决方案(请参见上面的链接),这就是我选择此解决方案的原因。 您有示例如何使用odatamodel进行发布吗?

me_for_i
3楼-- · 2020-08-18 13:56

var csrfToken = xhr.getResponseHeader('x-csrf-token');

您尚未发送请求,如何获得响应?

xhr.setRequestHeader(" Authorization"," Basic XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");

//发送请求

xhr.send(data);

//执行POST

微wx笑
4楼-- · 2020-08-18 14:14

为什么使用XMLHttpRequest? 不使用odatamodel?

一周热门 更多>