SAPUI5操作Northwind OData服务CRUD时遇Content-ID错误求助
SAPUI5 OData CRUD操作报错:Content-ID头无效
我已经用SAPUI5的List控件实现了Northwind API数据展示,以下是读取数据的代码:
var odataModel = new sap.ui.model.odata.v2.ODataModel("https://services.odata.org/V2/(S(c0...))/OData/OData.svc/"); odataModel.read("/Categories", { success: function (oData, oResponse) { MessageBox.success("Success"); }, error: function (oError) { MessageBox.error("Error"); } }); this.getView().setModel(odataModel);
读取功能正常,能看到三类数据及其ID。但尝试实现CRUD的其他操作时,所有操作都触发相同错误,比如删除条目时:
Request failed with status code 400: DELETE Categories(2) - "code":"","message":"'id-1677075...' is not a valid value for the 'Content-ID' header. In batch requests, the 'Content-ID' header must be an integer value."
我不清楚Content-ID的含义,也没找到有效解决方案,请求帮助。
删除函数代码
deleteData: function () { var list = this.getView().byId("list"); var selItem = list.getSelectedItem(); var title = selItem.getTitle(); var path = "/Categories(" + title + ")"; ///Categories(2); var odataModel = this.getView().getModel(); odataModel.remove(path, { success: function (data, response) { MessageBox.success("Deleted data"); }, error: function (error) { MessageBox.error("Deletion failed"); } }) }
更新函数代码
updateData: function () { var list = this.getView().byId("list"); var selItem = list.getSelectedItem(); var title = selItem.getTitle(); // ID, Name from two Input fields var ID = this.getView().byId("idinput").getValue(); var Name = this.getView().byId("nameinput").getValue(); // Setting up payload var payload = { ID: parseInt(ID), Name: Name }; // Defining path where to perform update var path = "/Categories(" + title + ")"; var odataModel = this.getView().getModel(); this.getView().getModel().setUseBatch(false); // Request update odataModel.update(path, payload, { success: function (data, response) { MessageBox.success("Successfully Updated"); }, error: function (error) { MessageBox.error("Error while updating the data"); } }); },
问题原因与解决方法
Content-ID的作用:OData批量请求(Batch Request)中,Content-ID用来标识批量里的单个请求,服务端要求它必须是整数。报错根源是默认开启的批量模式与Northwind测试服务的兼容性问题,导致生成的Content-ID不符合要求。
核心解决步骤:
- 全局关闭批量模式:在初始化ODataModel时就禁用批量,从根源避免批量请求触发的报错:
var odataModel = new sap.ui.model.odata.v2.ODataModel("https://services.odata.org/V2/(S(c0...))/OData/OData.svc/", { useBatch: false // 全局禁用批量请求 }); - 删除函数同步禁用批量:在deleteData函数中也添加禁用批量的设置,确保删除请求不走批量流程:
deleteData: function () { var list = this.getView().byId("list"); var selItem = list.getSelectedItem(); var title = selItem.getTitle(); var path = "/Categories(" + title + ")"; var odataModel = this.getView().getModel(); odataModel.setUseBatch(false); // 禁用批量 odataModel.remove(path, { success: function (data, response) { MessageBox.success("Deleted data"); }, error: function (error) { MessageBox.error("Deletion failed"); } }) } - 验证路径正确性:确认
title确实是Categories实体的主键(ID),避免路径拼接错误引发其他问题。
- 全局关闭批量模式:在初始化ODataModel时就禁用批量,从根源避免批量请求触发的报错:
临时设置无效的原因:仅在update函数中临时设置
setUseBatch(false)时,可能已有批量请求队列在处理,导致之前的请求仍走批量模式,全局初始化时禁用能彻底避免该问题。
内容的提问来源于stack exchange,提问作者sarius
相关产品推荐
相关产品推荐

