如何在SAPUI5中获取CREATE_STREAM方法返回的响应及错误消息
解决方案
1. 调整UploadSet控件的事件绑定
首先确保你给UploadSet控件绑定了uploadCompleted和uploadFailed两个事件,默认uploadItem方法触发的事件本身携带完整响应数据,之前未获取到数据大概率是没有正确从事件参数中提取对应字段。
视图层配置示例:
<UploadSet id="myUploadSet" uploadCompleted="onUploadCompleted" uploadFailed="onUploadFailed" ...其余原有配置> </UploadSet>
控制器层上传逻辑保持原有代码即可:
const oUploadSet = this.byId("myUploadSet"); oUploadSet.uploadItem(oItem);
2. 从事件参数中提取响应头与后端消息
SAP OData服务返回的业务消息默认会放在sap-message响应头中,你可以通过上传项实例的响应头获取方法提取内容:
上传完成事件处理逻辑
onUploadCompleted: function(oEvent) { const oUploadedItem = oEvent.getParameter("item"); // 提取SAP返回的业务消息头 const sSapMessage = oUploadedItem.getResponseHeader("sap-message"); // 解析并推送消息到MessageManager if (sSapMessage) { const oMessage = JSON.parse(sSapMessage); const oMessageManager = sap.ui.getCore().getMessageManager(); oMessageManager.addMessages( new sap.ui.core.message.Message({ message: oMessage.message, type: oMessage.severity === "error" ? sap.ui.core.MessageType.Error : sap.ui.core.MessageType.Success, target: "", processor: this.getView().getModel() }) ); } }
上传失败事件处理逻辑
如果后端返回HTTP错误状态码(4xx/5xx类),消息会触发uploadFailed事件,处理逻辑如下:
onUploadFailed: function(oEvent) { const oFailedItem = oEvent.getParameter("item"); const sSapMessage = oFailedItem.getResponseHeader("sap-message"); if (sSapMessage) { const oMessage = JSON.parse(sSapMessage); const oMessageManager = sap.ui.getCore().getMessageManager(); oMessageManager.addMessages( new sap.ui.core.message.Message({ message: oMessage.message, type: sap.ui.core.MessageType.Error, target: "", processor: this.getView().getModel() }) ); } }
3. 后端配置校验(针对消息取不到的异常场景)
如果按照上述逻辑还是无法获取sap-message头,检查两个后端配置项:
- 确保
lo_message_container->add_message方法的iv_add_to_response_header = abap_true参数配置在CREATE_STREAM方法返回逻辑之前执行,没有被后续业务逻辑覆盖 - 如果是跨域部署场景,需要在SICF事务码中找到你的OData服务配置,添加响应头
Access-Control-Expose-Headers: sap-message,否则浏览器会默认阻止前端读取自定义响应头
内容的提问来源于stack exchange,提问作者Cruncher
相关产品推荐
相关产品推荐

