IBM Domino 10 - 通过 Domino 数据服务集成资源预留 API
IBM Domino 10 - integrating with Resource Reservations via Domino Data Services API
我们正在尝试通过 REST API 与 IBM Domino 集成,以提取特定房间中有关 reservations/events 的信息,并且还能够远程创建新的 events/reservations。我们已经与 Microsoft Exchange 等其他服务集成,但 IBM 似乎是其中最难的。
我深入研究了它,阅读了数千篇文章和堆栈溢出问题,并且已经走了很远,但仍然无法真正利用它。
我目前打算做的是:
从 /api/data/collections/name/($Reservations) 或 ($Calendar)
中提取有关预订的信息
使用文档 api 创建 events/reservations,POSTing 到 /api/data/documents?form=Reservation,我已经尝试这样做和我的预订甚至显示在 Domino Admin 中(虽然不是在 Notes 客户端中),但它有一些错误(可能只是我这边的一些 json 问题)
虽然它看起来有点清晰和简单,但实际上并非如此。我有几个问题:
如何获得 reservations/calendar 的 特定 房间? ($Calendar) returns 数据库中的所有事件,甚至不包括它在哪个房间,要获取该信息,我需要另外查询每个预订的唯一性,这可能会杀死整个应用程序
有什么方法可以 filter/search /api/data/documents 到 return 只有 form
字段值为 [=17= 的文档] 或任何其他值?这样我就可以获取所有预订文档而无需直接查询每个文档(/api/data/documents 只有 return 没有任何有趣数据的文档的 href),我也不需要另外启用 DAS对于我想使用的每个视图。
</code> return 之类的字段在 json 中是什么,如果它们没有任何实际意义,我怎么知道它们的用途名称?它们通常包含有趣的数据,例如房间名称。</p></li>
</ol>
<p>我还查看了 FreeBusy api 服务,它非常有趣,我可以轻松地使用它来查找我想要的房间的预订(/忙碌时间),如果有的话 return编辑 resource/reservation 导致繁忙时间的原因。它只是显示开始和结束时间,没有别的..</p>
<p>我还阅读了关于应该创建一个 'main' 用户来处理预订并使用他的日历 api (/api/calendar/events) 的建议,但据我所知这是不可能的方法。
但是,我尝试在指定房间的用户日历中创建事件,并通过在 json |(PHP 语法,实际上)中添加以下参与者来让它工作:</p>
<pre><code>'organizer' => [ 'email' => 'admin/test@test.com' ],
'attendees' => [
[
'role' => 'req-participant',
'userType' => 'room',
'status' => 'accepted',
'rsvp' => true,
'email' => 'testroom@test.com',
],
],
但它并没有真正显示在房间预订中,这与在 IBM Notes 中创建的正常事件不同。在IBM Notes 中也无法编辑或删除,并且在主题前面有"Accepted: ",上面写着"attendance is delegated for admin"。要删除它,我需要直接通过它的 unid 通过 API 删除它。 x-lotus-noticetype 被设置为 A 所以我猜它不是被视为会议而是被视为通知,但不知道为什么。
我真的很想得到一些关于如何让这个工作的帮助或建议,还有其他任何有意义的方法吗?
编辑:
经过一番努力并阅读了 Dave 的回复后,我认为让一个用户通过日历 api 进行预订是一个很好的解决方案,因为直接数据 api 可能不起作用。我只能从 Rooms 数据库($Calendar)或($Reservations)视图中提取所有预订的列表,或者创建某种我自己的视图。
但是! 我无法在本地 IBM Domino 服务器上使用日历方法。 Dave 指出我需要指定组织者的有效电子邮件(互联网地址),因此我将用户的互联网地址设置为 testmail@test.test
(test.test 在主机文件中映射到 127.0.0.1) .现在,只要我尝试像那样使用该地址:
"organizer": {
"email": "testmail@test.test"
}
我什至无法创建 event/reservation(通过 /mail/admin.nsf/api/calendar/events
),它是 returning 500 内部错误,cserror 1026,Domino 记录
[CS API]> Error | calendarapi.c(379) : There was an error sending out notices to meeting participants. (0x8E4)
Error connecting to server test/test: The remote server is not a known TCP/IP host.
所以发送通知有问题,根本没有创建事件。我认为它可能不适用于本地主机,所以我将我的用户电子邮件设置为外部邮件服务,我什至收到了电子邮件,但事件仍然创建不正确(x-lotus-noticetype A
正在自动添加并覆盖我发送的任何内容作为值),它在客房预订数据库中不可见。
这是通过 Notes 客户端创建的事件的 json object:
"events": [
{
"href":"\/mail\/admin.nsf\/api\/calendar\/events\/2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated",
"id":"2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated",
"summary":"Notes client meeting",
"location":"Test room\/Test site@test",
"start": {
"date":"2019-03-13",
"time":"09:30:00",
"tzid":"Central European Standard Time"
},
"end": {
"date":"2019-03-13",
"time":"10:30:00",
"tzid":"Central European Standard Time"
},
"class":"public",
"transparency":"opaque",
"sequence":0,
"last-modified":"20190313T082436Z",
"attendees": [
{
"role":"chair",
"status":"accepted",
"rsvp":false,
"displayName":"admin\/test",
"email":"testmail@test.test"
},
{
"role":"req-participant",
"userType":"room",
"status":"needs-action",
"rsvp":true,
"displayName":"Test room\/Test site",
"email":"room@test.test"
}
],
"organizer": {
"displayName":"admin\/test",
"email":"testmail@test.test"
},
"x-lotus-broadcast": {
"data":"FALSE"
},
"x-lotus-notesversion": {
"data":"2"
},
"x-lotus-appttype": {
"data":"3"
}
}
]
如您所见,Notes 能够成功创建 testmail@test.test
事件。
现在这是用我的 API 创建的活动,但使用 admin/test@test.test
作为组织者的电子邮件(因为普通电子邮件不允许我创建活动):
"events": [
{
"href":"\/mail\/admin.nsf\/api\/calendar\/events\/E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated",
"id":"E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated",
"summary":"Api reservation test",
"location":"Test room\/Test site@test\r\nCN=Test room\/O=Test site",
"description":"API Generated event\r\n",
"start": {
"date":"2019-03-20",
"time":"11:00:00",
"utc":true
},
"end": {
"date":"2019-03-20",
"time":"15:00:00",
"utc":true
},
"class":"public",
"transparency":"opaque",
"sequence":0,
"last-modified":"20190313T084201Z",
"attendees": [
{
"role":"chair",
"status":"accepted",
"rsvp":false,
"displayName":"admin\/test",
"email":"testmail@test.test"
},
{
"role":"req-participant",
"userType":"room",
"status":"needs-action",
"rsvp":true,
"displayName":"Test room\/Test site",
"email":"room@test.test"
}
],
"organizer": {
"displayName":"admin\/test",
"email":"testmail@test.test"
},
"x-lotus-broadcast": {
"data":"FALSE"
},
"x-lotus-notesversion": {
"data":"2"
},
"x-lotus-noticetype": {
"data":"A"
},
"x-lotus-appttype": {
"data":"3"
}
}
]
如您所见,Lotus 自动将组织者和主席的电子邮件更新为 testmail@test.test
,理论上一切都应该有效,但事实并非如此。在 Notes 中,我将事件视为 'Accepted: Api reservation test' 并且我无法修改诸如房间之类的东西,或者不要 h有从右键单击菜单中删除它的选项(不过我可以使用 Del 键盘按钮删除它)
唯一不同的是 x-lotus-noticetype
得到了添加,我什至不知道为什么
编辑 2:
我得到它的工作! Dave 指出我可能有一些配置问题,所以我 re-installed 服务器并重新设置所有内容(包括邮件服务),我使用 admin@test.test
并且会议成功创建并添加到房间预订中。服务器控制台仅显示消息已送达。
然而!我可以根据需要创建尽可能多的 相同 会议,它们没有添加到预订数据库中,但它们在我的日历中成功创建(分配给它们的房间)没有任何错误(甚至在服务器控制台中也没有),这显然很糟糕。有没有办法检查(外部,通过 API)预订是否成功创建,如果房间当时很忙,则阻止创建? Notes客户端在房间繁忙时提示错误。我可能会使用 FreeBusy api,但是在每次预订尝试之前都需要另一个 HTTP 请求,但如果这是唯一的方法,那么我会接受它。我看到出席房间的 status
字段设置为 declined
,但来自 POST 的响应仍然包含 needs-action
所以我需要做一些延迟请求一次再次检查状态是否已更改为拒绝。
此外,虽然它有效,但我仍然不知道如何获得所选房间的预订列表? Reservations 数据库中已有的视图没有提供很多细节,它们需要专门启用 DAS 服务才能工作。还有其他方法可以正常工作吗?
另一件事是,有什么方法可以获取当前用户的电子邮件地址用于预订,还是只能手动 'hardcode'?房间的电子邮件也是如此。目前,我需要:
- 用户名
- 用户密码
- 用户邮件数据库(
/mail/admin.nsf/
)
- 用户邮箱
- 房间邮箱
如果我想直接从 Reservations 数据库中读取一些数据,那么我还需要知道该数据库的路径。这不是真的 user-friendly,如果可能的话,我想自动化一些事情。否则可能无法整合。
预订数据库旨在通过 (1) 直接通过它自己的 UI 或 (2) 通过自动处理来自日历用户的通知间接管理预订。通过使用 DAS 数据 API,您断言您可以以编程方式管理预订 (3) —— 通过操纵低级文档项。您可能会让它起作用,但我认为预订数据库在设计时并未考虑到这一点。
这就是为什么我认为 是最佳选择。它利用自动处理(上面的#2)并使您免于处理预订文档的内部设计。如果您使用这种方法,您应该给 DAS 日历 API 一个 attendees
的列表,如下所示:
"attendees":[
{
"role":"req-participant",
"userType":"room",
"status":"needs-action",
"rsvp":true,
"email":"room@mycorp.com"
}
]
换句话说,status
必须是 "needs-action"
-- 而不是 "accepted"
,如您原来的 post 所示。此外,请确保您为组织者和目标房间使用了正确的电子邮件地址。上面的示例显示了房间的 Internet 样式地址,但管理员并不总是为房间提供 Internet 地址。
我们正在尝试通过 REST API 与 IBM Domino 集成,以提取特定房间中有关 reservations/events 的信息,并且还能够远程创建新的 events/reservations。我们已经与 Microsoft Exchange 等其他服务集成,但 IBM 似乎是其中最难的。 我深入研究了它,阅读了数千篇文章和堆栈溢出问题,并且已经走了很远,但仍然无法真正利用它。
我目前打算做的是:
从 /api/data/collections/name/($Reservations) 或 ($Calendar)
中提取有关预订的信息
使用文档 api 创建 events/reservations,POSTing 到 /api/data/documents?form=Reservation,我已经尝试这样做和我的预订甚至显示在 Domino Admin 中(虽然不是在 Notes 客户端中),但它有一些错误(可能只是我这边的一些 json 问题)
虽然它看起来有点清晰和简单,但实际上并非如此。我有几个问题:
如何获得 reservations/calendar 的 特定 房间? ($Calendar) returns 数据库中的所有事件,甚至不包括它在哪个房间,要获取该信息,我需要另外查询每个预订的唯一性,这可能会杀死整个应用程序
有什么方法可以 filter/search /api/data/documents 到 return 只有
form
字段值为 [=17= 的文档] 或任何其他值?这样我就可以获取所有预订文档而无需直接查询每个文档(/api/data/documents 只有 return 没有任何有趣数据的文档的 href),我也不需要另外启用 DAS对于我想使用的每个视图。</code> return 之类的字段在 json 中是什么,如果它们没有任何实际意义,我怎么知道它们的用途名称?它们通常包含有趣的数据,例如房间名称。</p></li> </ol> <p>我还查看了 FreeBusy api 服务,它非常有趣,我可以轻松地使用它来查找我想要的房间的预订(/忙碌时间),如果有的话 return编辑 resource/reservation 导致繁忙时间的原因。它只是显示开始和结束时间,没有别的..</p> <p>我还阅读了关于应该创建一个 'main' 用户来处理预订并使用他的日历 api (/api/calendar/events) 的建议,但据我所知这是不可能的方法。 但是,我尝试在指定房间的用户日历中创建事件,并通过在 json |(PHP 语法,实际上)中添加以下参与者来让它工作:</p> <pre><code>'organizer' => [ 'email' => 'admin/test@test.com' ], 'attendees' => [ [ 'role' => 'req-participant', 'userType' => 'room', 'status' => 'accepted', 'rsvp' => true, 'email' => 'testroom@test.com', ], ],
但它并没有真正显示在房间预订中,这与在 IBM Notes 中创建的正常事件不同。在IBM Notes 中也无法编辑或删除,并且在主题前面有"Accepted: ",上面写着"attendance is delegated for admin"。要删除它,我需要直接通过它的 unid 通过 API 删除它。 x-lotus-noticetype 被设置为 A 所以我猜它不是被视为会议而是被视为通知,但不知道为什么。
我真的很想得到一些关于如何让这个工作的帮助或建议,还有其他任何有意义的方法吗?
编辑: 经过一番努力并阅读了 Dave 的回复后,我认为让一个用户通过日历 api 进行预订是一个很好的解决方案,因为直接数据 api 可能不起作用。我只能从 Rooms 数据库($Calendar)或($Reservations)视图中提取所有预订的列表,或者创建某种我自己的视图。 但是! 我无法在本地 IBM Domino 服务器上使用日历方法。 Dave 指出我需要指定组织者的有效电子邮件(互联网地址),因此我将用户的互联网地址设置为
testmail@test.test
(test.test 在主机文件中映射到 127.0.0.1) .现在,只要我尝试像那样使用该地址:"organizer": { "email": "testmail@test.test" }
我什至无法创建 event/reservation(通过
/mail/admin.nsf/api/calendar/events
),它是 returning 500 内部错误,cserror 1026,Domino 记录[CS API]> Error | calendarapi.c(379) : There was an error sending out notices to meeting participants. (0x8E4) Error connecting to server test/test: The remote server is not a known TCP/IP host.
所以发送通知有问题,根本没有创建事件。我认为它可能不适用于本地主机,所以我将我的用户电子邮件设置为外部邮件服务,我什至收到了电子邮件,但事件仍然创建不正确(
x-lotus-noticetype A
正在自动添加并覆盖我发送的任何内容作为值),它在客房预订数据库中不可见。这是通过 Notes 客户端创建的事件的 json object:
"events": [ { "href":"\/mail\/admin.nsf\/api\/calendar\/events\/2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated", "id":"2B35FABBC50EA4D0C12583BC002E26FA-Lotus_Notes_Generated", "summary":"Notes client meeting", "location":"Test room\/Test site@test", "start": { "date":"2019-03-13", "time":"09:30:00", "tzid":"Central European Standard Time" }, "end": { "date":"2019-03-13", "time":"10:30:00", "tzid":"Central European Standard Time" }, "class":"public", "transparency":"opaque", "sequence":0, "last-modified":"20190313T082436Z", "attendees": [ { "role":"chair", "status":"accepted", "rsvp":false, "displayName":"admin\/test", "email":"testmail@test.test" }, { "role":"req-participant", "userType":"room", "status":"needs-action", "rsvp":true, "displayName":"Test room\/Test site", "email":"room@test.test" } ], "organizer": { "displayName":"admin\/test", "email":"testmail@test.test" }, "x-lotus-broadcast": { "data":"FALSE" }, "x-lotus-notesversion": { "data":"2" }, "x-lotus-appttype": { "data":"3" } } ]
如您所见,Notes 能够成功创建
testmail@test.test
事件。现在这是用我的 API 创建的活动,但使用
admin/test@test.test
作为组织者的电子邮件(因为普通电子邮件不允许我创建活动):"events": [ { "href":"\/mail\/admin.nsf\/api\/calendar\/events\/E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated", "id":"E1D1F752203FC2DFC12583BC002FCB12-Lotus_Auto_Generated", "summary":"Api reservation test", "location":"Test room\/Test site@test\r\nCN=Test room\/O=Test site", "description":"API Generated event\r\n", "start": { "date":"2019-03-20", "time":"11:00:00", "utc":true }, "end": { "date":"2019-03-20", "time":"15:00:00", "utc":true }, "class":"public", "transparency":"opaque", "sequence":0, "last-modified":"20190313T084201Z", "attendees": [ { "role":"chair", "status":"accepted", "rsvp":false, "displayName":"admin\/test", "email":"testmail@test.test" }, { "role":"req-participant", "userType":"room", "status":"needs-action", "rsvp":true, "displayName":"Test room\/Test site", "email":"room@test.test" } ], "organizer": { "displayName":"admin\/test", "email":"testmail@test.test" }, "x-lotus-broadcast": { "data":"FALSE" }, "x-lotus-notesversion": { "data":"2" }, "x-lotus-noticetype": { "data":"A" }, "x-lotus-appttype": { "data":"3" } } ]
如您所见,Lotus 自动将组织者和主席的电子邮件更新为
testmail@test.test
,理论上一切都应该有效,但事实并非如此。在 Notes 中,我将事件视为 'Accepted: Api reservation test' 并且我无法修改诸如房间之类的东西,或者不要 h有从右键单击菜单中删除它的选项(不过我可以使用 Del 键盘按钮删除它) 唯一不同的是x-lotus-noticetype
得到了添加,我什至不知道为什么编辑 2: 我得到它的工作! Dave 指出我可能有一些配置问题,所以我 re-installed 服务器并重新设置所有内容(包括邮件服务),我使用
admin@test.test
并且会议成功创建并添加到房间预订中。服务器控制台仅显示消息已送达。 然而!我可以根据需要创建尽可能多的 相同 会议,它们没有添加到预订数据库中,但它们在我的日历中成功创建(分配给它们的房间)没有任何错误(甚至在服务器控制台中也没有),这显然很糟糕。有没有办法检查(外部,通过 API)预订是否成功创建,如果房间当时很忙,则阻止创建? Notes客户端在房间繁忙时提示错误。我可能会使用 FreeBusy api,但是在每次预订尝试之前都需要另一个 HTTP 请求,但如果这是唯一的方法,那么我会接受它。我看到出席房间的status
字段设置为declined
,但来自 POST 的响应仍然包含needs-action
所以我需要做一些延迟请求一次再次检查状态是否已更改为拒绝。此外,虽然它有效,但我仍然不知道如何获得所选房间的预订列表? Reservations 数据库中已有的视图没有提供很多细节,它们需要专门启用 DAS 服务才能工作。还有其他方法可以正常工作吗?
另一件事是,有什么方法可以获取当前用户的电子邮件地址用于预订,还是只能手动 'hardcode'?房间的电子邮件也是如此。目前,我需要:
- 用户名
- 用户密码
- 用户邮件数据库(
/mail/admin.nsf/
) - 用户邮箱
- 房间邮箱
如果我想直接从 Reservations 数据库中读取一些数据,那么我还需要知道该数据库的路径。这不是真的 user-friendly,如果可能的话,我想自动化一些事情。否则可能无法整合。
预订数据库旨在通过 (1) 直接通过它自己的 UI 或 (2) 通过自动处理来自日历用户的通知间接管理预订。通过使用 DAS 数据 API,您断言您可以以编程方式管理预订 (3) —— 通过操纵低级文档项。您可能会让它起作用,但我认为预订数据库在设计时并未考虑到这一点。
这就是为什么我认为 attendees
的列表,如下所示:
"attendees":[
{
"role":"req-participant",
"userType":"room",
"status":"needs-action",
"rsvp":true,
"email":"room@mycorp.com"
}
]
换句话说,status
必须是 "needs-action"
-- 而不是 "accepted"
,如您原来的 post 所示。此外,请确保您为组织者和目标房间使用了正确的电子邮件地址。上面的示例显示了房间的 Internet 样式地址,但管理员并不总是为房间提供 Internet 地址。