Dynamics CRM Online和Web API:方法通过POST进行隧道传输

时间:2016-03-21 15:42:34

标签: odata dynamics-crm dynamics-crm-online

我正在使用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。

     

要使用方法隧道发出请求,客户端会设置请求   根据需要使用body和header,但使用POST作为HTTP方法   而不是实际需要的。然后再添加一个标题,   “X-HTTP-Method”,并为其赋值MERGE,PUT或DELETE。

     

服务器必须检查POST请求是否设置了X-HTTP-Method标头   到其中一个有效值,如果是,则执行其余的请求   好像标头值是它的实际HTTP方法。

但是当我尝试使用POST而不是PATCH以及附加标头执行相同的请求时,我收到错误:

message=Unmapped Request found, PathTemplate:~/entityset/key, HttpVerb:POST

我也尝试了here描述的X-HTTP-Method-Override标题,但结果相同。

我方是否有错误或端点不支持此功能?感谢。

1 个答案:

答案 0 :(得分:1)

使用PATCH(但你说这个不受支持)。

使用PUT(注意PUT你必须指定属性URL / {attribute},这会强制你为PUT调用每个属性,而不是完美的方式,但它的东西)

这对我有用,而不是POST。

https://msdn.microsoft.com/en-us/library/mt607664.aspx