UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题

  最近两天在测试OData服务类方法CREATE_DEEP_ENTITY及GET_EXPANDED_ENTITYSET,刚开始采用ODataModel方式调用没有任何问题,但是ODataModel采用的是异步方式(调整async:false没起到作用,不太清楚oDataModel是否存在同步机制),后来采用jQuery.ajax进行调用,此过程中token问题查询了很多资料(最终通过官网标准文档解决),现将测试过程及相关问题做下备注:

UI5-技术篇-Expand与Deep 服务测试

1.oDataModel方式调用

   oDataModel API文档:https://sapui5.hana.ondemand.com/#/api/sap.ui.model.odata.v2.ODataModel

 oDataModel封装方法与HTTP请求方式的对应关系:

  • read -> get
  • create -> post
  • update -> put
  • remove -> delete

 GET_EXPANDED_ENTITYSET对应的oDataModel请求方式:

 1 var oModel = new sap.ui.model.json.JSONModel();
 2 
 3 this.cModel.read("/ZRICO_USRSet",{
 4     async:false,
 5     urlParameters:{
 6         "$filter":"Usrid eq '" + this.inpusr + "'", //过滤条件
 7         "$expand":"HeaderToItem"            //expand参数
 8     },
 9     success:function(oData,oResponse){
10         oModel.setData(oResponse.data.results[0]);
11     },
12     error:function(oError){
13         //
14     }
15 });

 CREATE_DEEP_ENTITY对应的oDataModel请求方式:

 1 this.saveModel = this.getOwnerComponent().getModel("ZRICO_DEEP_USR");
 2 this.saveData = {
 3     Usrid:this.getView().byId("inp_usrid").getValue(),
 4     Usrname:this.getView().byId("inp_usrname").getValue(),
 5     Usraddr:this.getView().byId("inp_usraddr").getValue(),
 6     HeaderToItem:this.getView().byId("usrTable").getModel().getData().HeaderToItem.results
 7 };
 8 
 9 this.saveModel.create("/ZRICO_USRSet",this.saveData,{
10     async:false,
11     success:function(oData,oResponse){
12         this.oModeldeep.setData(oData);
13     },
14     error:function(oError){
15         return oError;
16     }
17 });

 以上调用过程中都设置了async:false(即同步参数),但是执行过程中没起作用,具体如何设置需进一步查阅资料。

2.JQuery.AJAX方式调用

 采用jQuery.ajax方式请求数据,目前出现最多的问题应该是token验证问题了,在SAP论坛及博客空间查阅了一整天,讨论token问题的帖子很多,但是没找到一个实际有效的方法,最后直接查阅了官方标准文档(https://help.sap.com/viewer/b3d0daf2a98e49ada00bf31b7ca7a42e/2.0.04/en-US/e8a6bc904c0c48a182288604f467e84a.html?q=x-csrf-token)解决该问题。

 JQuery.ajax具体调用过程如下: 

 1 onBTSave: function(oEvent) {
 2     //This code was generated by the layout editor.
 3     //设置oDataModel
 4     this.saveModel = this.getOwnerComponent().getModel("ZRICO_DEEP_USR");
 5     //c
 6     this.saveData = {
 7         Usrid:this.getView().byId("inp_usrid").getValue(),
 8         Usrname:this.getView().byId("inp_usrname").getValue(),
 9         Usraddr:this.getView().byId("inp_usraddr").getValue(),
10         HeaderToItem:this.getView().byId("usrTable").getModel().getData().HeaderToItem.results
11     };
12     
13     this.oModeldeep = this.onBTSaveModel(this.saveData);
14     this.getView().setModel(this.oModeldeep);
15     this.oTable.setModel(this.oModeldeep);
16 },
17         
18 onBTSaveModel: function(fv_data) {
19     var oModel = new sap.ui.model.json.JSONModel();
20     var sUrl = this.getOwnerComponent().getModel("ZRICO_DEEP_USR").sServiceUrl + "/ZRICO_USRSet";
21     //var token = this.getOwnerComponent().getModel("ZRICO_DEEP_USR").getSecurityToken();
22    
23     jQuery.ajax({
24         url:  this.getOwnerComponent().getModel("ZRICO_DEEP_USR").sServiceUrl,
25         type: "GET",
26         async: false,
27         beforeSend: function(xhr) {
28             xhr.setRequestHeader("X-CSRF-Token", "Fetch");            //获取token
29         },
30         success: function(data, textStatus, XMLHttpRequest) {
31             var token = XMLHttpRequest.getResponseHeader('X-CSRF-Token');  //取值token
32             jQuery.ajax({
33                 url: sUrl,
34                 type: "POST",
35                 async: false,
36                 contentType: "application/json",
37                 dataType: "json",
38                 data: JSON.stringify(fv_data),                   //注意JSON格式转换
39                 beforeSend: function(xhr) {
40                     xhr.setRequestHeader("X-CSRF-Token", token);        //赋值token
41                 },
42                 success: function(response, stextStatus, jqXHR) {
43                     oModel.setData(response.d);
44                 },
45                 error: function(xhr, etextStatus, error) {
46                     oModel.state = "";
47                     oModel.errorMessage = xhr ? xhr.status + " - " + xhr.statusText : textStatus;
48                     oModel.errorStack = error && error.stack;
49                 }
50             });        
51         }
52     });
53     return oModel;
54 }
55 });

 错误:解析 XML 流时出错:'value expected at 'Usrid=1&Us''。   主要是JSON格式未转换造成的 JSON.stringify(),如上代码所示。

3.执行过程测试

 UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题

 UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题

 UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题