我想向 OData v4 ActionImport 发送 POST 请求。如何在 SAPUI5 环境中实现这一目标?我查看了 v4 ODataModel 和 ODataContextBinding。有执行 ActionImport 的方法,但我不知道如何设置正文。
一般询问:我应该如何提交不一定绑定到 UI 的 OData 请求?例如,如果我只想从后端查询一个值或向后端发送一个文件。现在,我创建一个 ODataContextBinding 并调用 execute/requestObject 方法,但我认为这可能不是最好的方法(而且我无法以这种方式设置请求正文)。也许直接发出 ajax 请求可能会更好?
提前致谢!
我偶然发现了你的问题,因为我遇到了完全相同的问题。我提供我的解决方案,以防它对其他人有帮助。
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",
}}
我希望这能帮助其他正在努力做到这一点的人。
问候
这篇文章对我帮助很大,但我仍然无法从 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));