根据此处的信息http://docs.valence.desire2learn.com/res/course.html#actions我希望“更新”一个 courseOffering 我会指定一个带有 CourseOfferingInfo 块的 PUT,它只包含一些属性. 每次我尝试这个时,我都会得到一个 404,找不到 - 即使使用相同的路线成功获得 GET(404 表示 org 不存在或 org 不是一个产品 - 两者都不是真的)。但是,如果我指定一个 CreateCourseOffering 块(直接来自以前的 GET),则 PUT 可以正常工作。这是正确的,文档不是吗?还是在这种情况下我应该寻找其他东西?文档说使用 CreateCourseOffering 为 POST 创建一个产品......我只是想更新该产品的一个属性,因此认为 PUT 是要走的路。
1 回答
如果您使用带有块的“创建” POST 路由CreateCourseOffering
,这将创建一个新的课程设置,并将新创建的课程设置的 CourseOffering 块发送回(这将包括您已创建的新组织单位的组织单位 ID 值建)。
如果您想更新现有的课程,您应该像您所怀疑的那样使用带有块的“更新”PUT 路线。CourseOfferingInfo
请注意,您必须为此块中的所有字段提供有效信息,因为成功使用后,LMS 将使用您在该块中指定的所有属性作为组织单位的新值。StartDate
andEndDate
字段特别挑剔:如果字段不适用,您必须提供有效值(注意这些值中UTCDateTime
的三位毫秒说明符是强制性的)或JSONnull
值。
为什么是404?您所看到的 404 和您传递的数据可能取决于后端服务进行数据绑定的方式。它会尝试将您提供的 JSON 数据(和查询参数)反序列化为它可以读取/操作的数据对象——如果您提供的 JSON 块包含它所期望的属性的超集,那么这可能会起作用(例如,如果CourseOffering
当你被期望提供一个块时,你提供了一个块CourseOfferingInfo
) 因为绑定层可能会忽略它不需要的字段。如果绑定过程失败,因为您提供的属性值无法绑定到预期的数据类型,或者因为您未能提供预期的 JSON 属性字段,那么这可能会导致服务返回 404 (因为绑定/反序列化传入的参数化数据与将 URL 路由匹配到底层服务处理程序同时发生)。
如果您提供 Web 服务可以绑定到其预期数据对象的 JSON 结构(和查询参数),但您提供的值无效或无意义,那么这可能会导致底层服务处理程序响应 400(表示无效的请求)。但为了做到这一点,您的参数化数据仍然需要正确反序列化并绑定到数据对象中,以供底层服务检查。
我们将更新文档以更明确地得出这一事实。从调用客户端的角度来看,最安全的策略是传递有效的 JSON 结构,这正是各个路由所期望的,尤其是因为底层后端服务实现可能会改变它处理传入请求的方式。