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

 

 

 

 

转载于:https://www.cnblogs.com/ricoo/p/11271113.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于JAVA调用接口传递参数和接收JSON数据,可以通过以下步骤来实现: 1.导入相关的依赖包,例如Apache HttpClient、FastJSON等。 2.构造请求参数并转换为JSON格式。可以使用FastJSON将Java对象转换为JSON字符串。 3.创建HttpClient对象,并设置请求方法、请求头、请求体等参数。请求方法为POST,请求头需要设置Content-Type为application/json。 4.执行请求并获取响应。可以使用HttpClient执行请求,并获取响应。响应包含了接口返回的JSON数据。 5.解析JSON数据并处理结果。可以使用FastJSONJSON字符串转换为Java对象,然后根据接口返回的数据进行相应的处理。 以下是示例代码: ```java import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpHeaders; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class InterfaceTest { public static void main(String[] args) throws IOException { // 构造请求参数 Map<String, Object> params = new HashMap<String, Object>(); params.put("username", "test"); params.put("password", "123456"); String jsonStr = JSON.toJSONString(params); // 创建HttpClient对象 CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost("http://localhost:8080/api/login"); // 设置请求头 httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); // 设置请求体 StringEntity stringEntity = new StringEntity(jsonStr, "UTF-8"); httpPost.setEntity(stringEntity); // 执行请求并获取响应 CloseableHttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); String responseStr = EntityUtils.toString(httpEntity, "UTF-8"); // 解析JSON数据并处理结果 JSONObject jsonObject = JSON.parseObject(responseStr); int code = jsonObject.getIntValue("code"); String message = jsonObject.getString("message"); if (code == 0) { // 登录成功 String token = jsonObject.getString("token"); System.out.println("登录成功,Token为:" + token); } else { // 登录失败 System.out.println("登录失败,原因:" + message); } // 关闭HttpClient和响应流 httpResponse.close(); httpClient.close(); } } ``` 注意:以上代码仅供参考,具体实现需要根据接口的具体要求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值