【发布时间】:2016-07-08 05:25:45
【问题描述】:
我正在使用 Dynamics CRM 2016 Online,我想使用 Web API (odata 4.0) 端点更新实体(例如联系人)。
我使用 Fiddler 来测试请求。以下是请求的详细信息:
PATCH https://XXXXXXXXXXX/api/data/v8.0/contacts(6b902ae1-19ed-e511-80e3-5065f3890551)
User-Agent: Fiddler
Host: XXXXXXXXX
Content-Length: 54
Accept: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
Content-Type: application/json
Authorization: Bearer XXXXXXXX
{
"firstname": "John",
"lastname": "Doe"
}
效果很好。问题是客户端不支持 PATCH 动词。
odata 端点可以通过使用 POST 和附加的 HTTP 标头来处理此限制。引用文档:
为了帮助解决此限制,OData 服务器可以 支持通过 POST 的方法隧道。可以的方法 通过隧道执行的有 MERGE、PUT 和 DELETE。
要使用隧道方法发出请求,客户端会设置一个请求 根据需要使用正文和标头,但使用 POST 作为 HTTP 方法 而不是实际需要的。然后它再添加一个标题, “X-HTTP-Method”,并赋予其值 MERGE、PUT 或 DELETE。
服务器必须检查 POST 请求是否设置了 X-HTTP-Method 标头 到有效值之一,如果是,则执行请求的其余部分 就好像标头值是它的实际 HTTP 方法一样。
但是当我尝试使用 POST 而不是 PATCH 并使用附加标头执行相同的请求时,我收到一个错误:
message=Unmapped Request found, PathTemplate:~/entityset/key, HttpVerb:POST
我也尝试了 X-HTTP-Method-Override 标头,如 here 所述,但结果相同。
是我的错误还是端点不支持此功能?谢谢。
【问题讨论】:
-
CRM 的 Web API 端点绝对不是 OData 协议的完整实现,因此如果您的 POST 请求收到该响应,则强烈表明该端点不支持该部分协议。 ://
标签: odata dynamics-crm dynamics-crm-online