zoukankan      html  css  js  c++  java
  • 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.执行过程测试

     

     

     

  • 相关阅读:
    网络安全分析
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1464 Function
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1014 Cantor表
    java实现 洛谷 P1540 机器
    java实现 洛谷 P1540 机器
  • 原文地址:https://www.cnblogs.com/ricoo/p/11271113.html
Copyright © 2011-2022 走看看