• 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.执行过程测试

     

     

     

  • 相关阅读:
    工商银行:应用多k8s集群管理及容灾实践
    鸿蒙轻内核源码分析:掌握信号量使用差异
    云图说|ASM灰度发布,让服务发布变得更敏捷、更安全
    解读多云跨云下的容器治理与实践
    互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
    带你深入理解Java的IO到底是个啥
    毕业季offer怎么拿?收下这份非典型求职面试指南
    CKEditor 5 摸爬滚打(一)—— 从零构建定制化工程项目
    说起来你可能不信,一个正则就能让页面卡死
    sklearn中的pipeline的创建与访问
  • 原文地址:https://www.cnblogs.com/ricoo/p/11271113.html
Copyright © 2020-2023  润新知