【问题标题】:Get Response from CREATE_STREAM从 CREATE_STREAM 获得响应
【发布时间】:2021-07-02 15:38:31
【问题描述】:

我们使用 ABAP 中 oData 服务的 CREATE_STREAM 方法将文档从 SAPUI5 上传到我们的 SAP 系统。文档的创建工作正常。 我们想要实现的是将响应返回给 SAPUI5。尤其是在后端创建文档的过程中出现错误。

在前端我们使用uploadSet 控件。

...oUploadSet.uploadItem(oItem);

在后端我们创建一个消息

...lo_message_container->add_message( iv_msg_type = /iwbep/cl_cos_logger=>error
iv_msg_number = '018'
iv_msg_id = lv_msg_id
iv_add_to_response_header = abap_true
)....

我们可以在网关服务器的错误协议(/IWFND/ERROR_LOG)中找到创建的消息。但是如何在 SAPUI5 中检索到这条消息并在 MessageManger 控件中使用呢?

我们尝试了 onUploadCompleted 控件,但在那里找不到任何响应数据。

有人可以解释如何在 SAPUI5 中使用来自 CREAT_STREAM 方法的响应或消息头吗?

【问题讨论】:

  • 您可以自己访问该消息,但如果您愿意使用消息管理器,那么一切都是开箱即用的。 help.sap.com/viewer/468a97775123488ab3345a0c48cadd8f/7.52.8/…
  • 如何自己访问消息?我没有设法在 onUploadCompleted 中看到它。或者我怎样才能让这一切开箱即用? UploadSet 绑定到 DocumentList 实体集。但是单个 Document 项绑定到 UploadItemSet....

标签: odata sapui5


【解决方案1】:

“新”UploadSet 控件在 imo 中有点半生不熟。响应将在某些内部方法中丢失。然后这个内部方法会触发onUploadCompleted,你得到的只是无用的信息。

幸运的是,我们可以轻松覆盖这些内部内容。 UploadSet 有一个聚合 Uploader。我们必须提供我们自己的上传器。问题解决了。 Here is the line 需要修改。

sap.ui.define([
    "sap/m/upload/Uploader",
    ...
], function (Uploader, ...) {

    return Uploader.extend("my.custom.control.Uploader", {

        uploadItem: function (oItem, aHeaders) {
            // beginning of the method. take it from the official sources

            oXhr.onreadystatechange = function () {
                const oHandler = that._mRequestHandlers[oItem.getId()];
                if (this.readyState === window.XMLHttpRequest.DONE && !oHandler.aborted) {
                    // we need to return the xhr object. it contains the response!
                    that.fireUploadCompleted({ item: oItem, xhr: oXhr });
                }
            };

            // .. rest of the method
        }
    });
});

这样使用


<mvc:View xmlns:custom="my.custom.control" ....>
    <UploadSet items="....">
        .....
        <uploader>
            <custom:Uploader uploadUrl="......"
                uploadCompleted=".onUploadCompleted"
                uploadStarted=".onUploadStarted" />
        </uploader>
    </UploadSet>

编辑:您自己的上传器也意味着实现您自己的事件处理程序(uploadAborteduploadCompleteduploadProgresseduploadStarted)。有关活动的更多信息,请参阅official documentation

【讨论】:

  • 惊人的解决方案。谢谢你,马克!我现在收到 CREATE_STREAM 的回复。不幸的是,进度指示器不再工作了。正如建议的那样,我使用 uploadItem 方法的完整代码。调用“fireUploadProgressed”事件。缺少什么?
  • 我想我需要更多的前端代码。您现在如何调用事件处理程序?
  • 我从标准 Uploader.js 复制的代码似乎负责进度指示器:oXhr.upload.addEventListener("progress", function (oEvent) { that.fireUploadProgressed({ item: oItem, loaded: oEvent.loaded, total: oEvent.total, aborted: false }); }); 在调试标准和调试扩展时,该部分看起来与我相似,但在扩展中什么都没有发生。
  • 不,我的意思是.. 你现在对事件有反应吗? &lt;custom:Uploader uploadProgressed="myMethod"&gt; 或者这个进度指示在更改之前是否开箱即用?
  • 从阅读源代码看来,一旦您使用自己的上传器,您还必须实现自己的事件处理程序。这行here 可能永远不会被调用,因为您不再使用隐式上传器。解决方案应该很简单:将these 3 lines 复制到您自己的事件处理程序中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2021-06-19
  • 2021-07-18
  • 2017-08-16
  • 2018-02-20
  • 2020-12-11
相关资源
最近更新 更多