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

时间:2023-02-08 19:34:50

  最近两天在测试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请求方式:

 var oModel = new sap.ui.model.json.JSONModel();

 this.cModel.read("/ZRICO_USRSet",{
async:false,
urlParameters:{
"$filter":"Usrid eq '" + this.inpusr + "'", //过滤条件
"$expand":"HeaderToItem"            //expand参数
},
success:function(oData,oResponse){
oModel.setData(oResponse.data.results[0]);
},
error:function(oError){
//
}
});

 CREATE_DEEP_ENTITY对应的oDataModel请求方式:

 this.saveModel = this.getOwnerComponent().getModel("ZRICO_DEEP_USR");
this.saveData = {
Usrid:this.getView().byId("inp_usrid").getValue(),
Usrname:this.getView().byId("inp_usrname").getValue(),
Usraddr:this.getView().byId("inp_usraddr").getValue(),
HeaderToItem:this.getView().byId("usrTable").getModel().getData().HeaderToItem.results
}; this.saveModel.create("/ZRICO_USRSet",this.saveData,{
async:false,
success:function(oData,oResponse){
this.oModeldeep.setData(oData);
},
error:function(oError){
return oError;
}
});

 以上调用过程中都设置了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具体调用过程如下: 

 onBTSave: function(oEvent) {
//This code was generated by the layout editor.
//设置oDataModel
this.saveModel = this.getOwnerComponent().getModel("ZRICO_DEEP_USR");
//c
this.saveData = {
Usrid:this.getView().byId("inp_usrid").getValue(),
Usrname:this.getView().byId("inp_usrname").getValue(),
Usraddr:this.getView().byId("inp_usraddr").getValue(),
HeaderToItem:this.getView().byId("usrTable").getModel().getData().HeaderToItem.results
}; this.oModeldeep = this.onBTSaveModel(this.saveData);
this.getView().setModel(this.oModeldeep);
this.oTable.setModel(this.oModeldeep);
}, onBTSaveModel: function(fv_data) {
var oModel = new sap.ui.model.json.JSONModel();
var sUrl = this.getOwnerComponent().getModel("ZRICO_DEEP_USR").sServiceUrl + "/ZRICO_USRSet";
//var token = this.getOwnerComponent().getModel("ZRICO_DEEP_USR").getSecurityToken();
  
jQuery.ajax({
url: this.getOwnerComponent().getModel("ZRICO_DEEP_USR").sServiceUrl,
type: "GET",
async: false,
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRF-Token", "Fetch");           //获取token
},
success: function(data, textStatus, XMLHttpRequest) {
var token = XMLHttpRequest.getResponseHeader('X-CSRF-Token');  //取值token
jQuery.ajax({
url: sUrl,
type: "POST",
async: false,
contentType: "application/json",
dataType: "json",
data: JSON.stringify(fv_data),                   //注意JSON格式转换
beforeSend: function(xhr) {
xhr.setRequestHeader("X-CSRF-Token", token);        //赋值token
},
success: function(response, stextStatus, jqXHR) {
oModel.setData(response.d);
},
error: function(xhr, etextStatus, error) {
oModel.state = "";
oModel.errorMessage = xhr ? xhr.status + " - " + xhr.statusText : textStatus;
oModel.errorStack = error && error.stack;
}
});
}
});
return oModel;
}
});

 错误:解析 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格式传值问题

UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题的更多相关文章

  1. JQuery Ajax执行过程AOP拦截

    JQuery Ajax过程AOP:用于在Ajax请求发送过程中执行必备操作,比如加载数据访问令牌. $.ajaxSetup({ type: "POST", error: funct ...

  2. [JQuery] Ajax使用过程中的问题总结

    JQuery提供的ajax函数,在使用过程中,因为对参数的不了解,导致了很多错误,现在总结如下,以便时常温固,不犯同样的错误. 1.我在项目中使用到的ajax请求格式如下: $.ajax({ url: ...

  3. 统一处理jquery ajax请求过程中的异常错误信息的机制

    当jQuery ajax向服务器发送请求,服务器发生异常,比如:400.403.404.500等异常,服务器将异常响应给客户端,此时的ajax可以获取异常信息并进行处理,但此时我们一般是跳转到与异常编 ...

  4. Ajax请求过程中显示“进度”的简单实现

    Ajax在Web应用中使用得越来越频繁.在进行Ajax调用过程中一般都具有这样的做法:显示一个GIF图片动画表明后台正在工作,同时阻止用户操作本页面(比如Ajax请求通过某个按钮触发,用户不能频繁点击 ...

  5. SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误

       今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误:         消息1222,级别16,状态18,第1 行         已超过了锁请求超时时段.        ...

  6. jQuery实现动画过程中尽量避免出现网页滚动条

    jQuery实现动画过程中尽量避免出现网页滚动条,不然可能会出现动画效果异常.

  7. Deepin下phpunit安装,以及执行过程中所遇到的问题

    Deepin下phpunit安装,以及执行过程中所遇到的问题 安装phpunit步骤 wget https://phar.phpunit.de/phpunit.phar chmod +x phpuni ...

  8. jquery.ajax的url中传递中文乱码问题的解决方法

    jquery.ajax的url中传递中文乱码问题的解决方法   JQuery JQuery默认的contentType:application/x-www-form-urlencoded 这才是JQu ...

  9. 【已解决】Makefile执行过程中出错:make: *** No rule to make target ` ‘, needed by xxx. Stop(转载)

    转自: http://www.crifan.com/makefile_error_make_no_rule_to_make_target_needed_by_stop/ [问题] 有个已有的Makef ...

随机推荐

  1. NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版

    nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...

  2. Mongo使用脚本更新数据

    SQL Server中我们经常要使用脚本来刷一些数据,在mongo中我们也可以使用mongo的脚本来刷mongo的数据 首先在命令窗口中链接到本地的mongo库 load("[脚本的地址]& ...

  3. C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类

    StrBlob是一个管理string的类,借助标准库容器vector,以及动态内存管理类shared_ptr,我们将vector保存在动态内存里,这样就能在多个对象之间共享内存. 定义StrBlob类 ...

  4. php 环境变量收集

    常用的PHP环境变量和系统常量列表 是一个包含服务器端相关信息的PHP全局环境变量,在PHP4.1.0之前的版本使用$HTTP_SERVER_VARS.更多信息可以参考这里. $_SERVER['PH ...

  5. Asp.net禁用页面缓存的方法

    方法1.在Asp页面首部<head>中添加如下代码 Response.Buffer = True Response.ExpiresAbsolute = Now() - 1 Response ...

  6. 让Cocos2dx中的TestCPP中的Box2dTest运行起来

    一般而言,如果你导入TestCPP到VS2012中去后,会编译十几分钟才会出现窗口界面,这是包含Cocos2dx所有功能的一个demo,功能非常齐全强大,里面有两个关于Box2d的测试案例,一个是Bo ...

  7. Struts2开山篇【引入Struts、自定义MyStruts框架】

    前言 这是Strtus的开山篇,主要是引入struts框架-为什么要引入struts,引入struts的好处是什么-. 为什么要引入struts? 首先,在讲解struts之前,我们来看看我们以前写的 ...

  8. Shell排序(改良的插入排序)

    Shell排序算法最初是由D.L Shell于1959年提出,假设要排序的元素有n个,则每个进行插入排序是并不是所偶的元素同时进行,而是去一段间隔. Shell首先将间隔设定为n/2,然后跳跃的进行插 ...

  9. List集合remove元素的问题

    import java.util.*; public class object { public static void main(String[] args) { String str1 = new ...

  10. leecode第二十一题(合并两个有序链表)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...