You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
        }
    });
},

问题原因与解决方法

  1. Content-ID的作用:OData批量请求(Batch Request)中,Content-ID用来标识批量里的单个请求,服务端要求它必须是整数。报错根源是默认开启的批量模式与Northwind测试服务的兼容性问题,导致生成的Content-ID不符合要求。

  2. 核心解决步骤:

    • 全局关闭批量模式:在初始化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),避免路径拼接错误引发其他问题。
  3. 临时设置无效的原因:仅在update函数中临时设置setUseBatch(false)时,可能已有批量请求队列在处理,导致之前的请求仍走批量模式,全局初始化时禁用能彻底避免该问题。


内容的提问来源于stack exchange,提问作者sarius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:24:29