如何使用 SAPUI5 向 OData v4 ActionImport 发送 POST 请求

问题描述 投票:0回答:2

我想向 OData v4 ActionImport 发送 POST 请求。如何在 SAPUI5 环境中实现这一目标?我查看了 v4 ODataModelODataContextBinding。有执行 ActionImport 的方法,但我不知道如何设置正文。

一般询问:我应该如何提交不一定绑定到 UI 的 OData 请求?例如,如果我只想从后端查询一个值或向后端发送一个文件。现在,我创建一个 ODataContextBinding 并调用 execute/requestObject 方法,但我认为这可能不是最好的方法(而且我无法以这种方式设置请求正文)。也许直接发出 ajax 请求可能会更好?

提前致谢!

sapui5
2个回答
2
投票

我偶然发现了你的问题,因为我遇到了完全相同的问题。我提供我的解决方案,以防它对其他人有帮助。

onValidate: function(oEvent) {
   var oModel = this.getModel("reportService");
   var oActivityCreateContext = this.getCreateContext();
   var oActionODataContextBinding = oModel.bindContext("/validateActivity(...)");
   oActionODataContextBinding.setParameter("activity", oActivityCreateContext.getObject())
   oActionODataContextBinding.execute().then(
      function() {
          var oActionContext = oActionODataContextBinding.getBoundContext();
          console.table(oActionContext.getObject().value);
      }.bind(this)
   );
}

模型“reportService”是一个 sap.ui.model.odata.v4.ODataModel。函数调用是未绑定的,并在我的 service.cds 文件中以这种方式声明:

action validateActivity(activity : Activities) returns many rm.ValidationMessage;

oActionContext.getObject().value 包含对我的函数调用的响应。

这里的关键是设置有效负载上的活动的setParameter。结果请求可能如下所示:

POST http://localhost:8080/api/ReportService/validateActivity
Content-Type: application/json

{"activity": {
    "activityNumber": 1,
    "report_ID": "a3558fce-76bc-49a9-ae23-bd5566fb3bc6",
    "job_code": "160",
    "learningPeriod": 1,
    "salaryAnnex": "D3",
    "workingRegion_code": "08",
    "unionName": "CSD",
    "local": "Local 123",
    "nbWeeksWorked": 8,
    "nbHourSimple": 110,
    "nbHourTimeAndHalf": 5,
    "nbHourDouble": 0,
    "sin": "111222333",
}}

我希望这能帮助其他正在努力做到这一点的人。

问候


0
投票

这篇文章对我帮助很大,但我仍然无法从 CAP 应用程序调用绑定操作/函数。

事实证明,您需要传递服务的完整路径才能解决该操作。另一件事是,由于这是一个延迟调用,因此根据 doco https://sapui5.hana.ondemand.com/sdk/#/topic/b54f7895b7594c61a83fa7257fa9d13f

,“rfresh 被默默忽略”

所以我必须链接一个承诺,并在我的例子中绑定父控件来刷新表控件。

    let path = "/EntityName(" + match[1] + ")/fullnamespace.srv.ServiceName.boundActionName(...)";
let oActionODataContextBinding = this.getModel().bindContext(path);

let parentControl = oEvent.getSource().getParent().getParent();
            let refreshModel = () =>  {
                this.refresh();
            };

oActionODataContextBinding.execute().then((response) => {
  // Handler Code
}).then(refreshModel.bind(parentControl));
© www.soinside.com 2019 - 2024. All rights reserved.