如何在SAPUI5中向OData v4 ActionImport发送POST请求
SAPUI5 OData V4 ActionImport POST请求及非绑定场景请求方案
一、OData V4 ActionImport 设置请求Body参数
你不需要通过ODataContextBinding来执行ActionImport,直接调用ODataModel内置的executeActionImport方法即可设置请求Body参数,方法的第二个入参mParameters会直接作为POST请求的Body负载自动序列化:
// 示例代码 const oV4Model = this.getView().getModel("你的ODataV4模型别名"); oV4Model.executeActionImport( "你的服务命名空间/目标ActionImport名称", // ActionImport的全限定名 { // 此处写入你要传递的Body参数 "字段1": "值1", "数字字段": 200, "复杂结构字段": { "子字段": "子值" } }, undefined, // 集团参数,无特殊需求可传undefined false, // 是否跳过缓存 true // 启用Promise返回模式 ).then((oResponse) => { // 处理Action返回结果 }).catch((oError) => { // 统一处理异常 });
该方法会自动遵循OData V4规范组装请求,自动携带CSRF令牌、处理请求头,无需手动拼接Body内容。
二、非UI绑定场景的OData请求方案
不建议直接发起原生Ajax请求,原生Ajax会跳过SAPUI5 OData模型内置的CSRF令牌管理、EDM类型校验、会话保持、服务端错误统一解析、跨域适配等能力,反而会增加额外的适配工作量。针对不同非绑定场景可以选择以下更简洁的方案:
- 调用Action/FunctionImport:直接使用上述的
executeActionImport/executeFunctionImport方法,无需创建任何绑定对象即可完成请求 - 单值/实体查询:直接调用
ODataModel#requestObject方法,传入目标资源路径即可获取返回值,示例:
oV4Model.requestObject("/物料集(guid'xxxx-xxxx-xxxx')/物料名称") .then((sMaterialName) => { // 直接拿到查询结果 })
- 文件上传场景:如果后端OData服务支持媒体资源操作,调用
ODataModel#createMedia方法,可直接传入文件二进制内容作为请求Body,框架会自动处理上传相关的请求头配置:
const oUploadFile = oFileUploaderInstance.getFiles()[0]; oV4Model.createMedia("/附件媒体集", oUploadFile, { "Content-Type": oUploadFile.type, "Slug": encodeURIComponent(oUploadFile.name) }).then(() => { // 上传成功逻辑 })
如果存在极端特殊的自定义请求场景,OData模型内置方法无法覆盖,也可以调用ODataModel#getHttpClient()获取框架内置的HTTP客户端实例发起请求,该实例已集成所有OData模型的基础适配能力,比原生Ajax更适配SAPUI5环境。
内容的提问来源于stack exchange,提问作者Marvin
相关产品推荐
相关产品推荐

