通过API为Microsoft Dynamics CRM中的联系人实体创建注释

mai*_*her 17 microsoft-dynamics dynamics-crm odata dynamics-crm-webapi microsoft-dynamics-webapi

此问题与我通过API调用的Microsoft Dynamics CRM 2015有关.

我创建联系实体:

POST [organization URI]/api/data/contacts
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "emailaddress1": "myemail@example.com",
}
Run Code Online (Sandbox Code Playgroud)

登录面板后,我看到了新的记录.我可以通过API调用它:

[organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)
{
  "@odata.context":"[organization URI]/api/data/$metadata#contacts/$entity",
  "@odata.etag":"W/\"460199\"",
  ...
  "contactid":"f76e4e7c-ea61-e511-80fd-3863bb342b00",
  "emailaddress1":"myemail@example.com",
  ....
}
Run Code Online (Sandbox Code Playgroud)

我想做的下一件事是添加与该联系人关联的注释记录.按照指南我打电话:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
    'contact@odata.bind': 'contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
}
Run Code Online (Sandbox Code Playgroud)

但它返回400错误:

未声明的属性"contact",其在有效内容中仅包含属性注释,但在有效内容中未找到属性值.在OData中,只有声明的导航属性和声明的命名流可以表示为没有值的属性.

我打电话的时候:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST",
}
Run Code Online (Sandbox Code Playgroud)

创建了新实体,但没有与联系人的关系.

如何正确撰写此POST请求?我在这里错过了什么?我猜想,那contact@odata.bind应该呈现有些不同,我试过contactid@odata.bind,object@odata.bind,objectid@odata.bind-但没有效果.

有任何想法吗?

小智 17

而不是使用objectid@odata.bind,你必须使用objectid_contact@odata.bind.结果如下:

"objectid_contact@odata.bind": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"
Run Code Online (Sandbox Code Playgroud)

要获取属性列表,请查看文档中的单值导航属性.

  • 这比接受的响应更好,因为它仅使用1个调用。我猜测“ _contact”(或类似内容)的添加取决于当前记录是父项还是子项。 (2认同)

mai*_*her 8

我发现这有效,但有两个请求:

POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "notetext": "TEST"
}

POST [organization URI]/api/data/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)/Contact_Annotation/$ref
Content-Type: application/json; charset=utf-8
Accept: application/json
{
    "@odata.id": "[organization URI]/annotations(annotation_id_from_first_request)"
}
Run Code Online (Sandbox Code Playgroud)

编辑:

annotation_id_from_first_request 值来自第一个请求的响应.


Aru*_*oth 7

第1部分:
MSDN参考:深插入

您可以通过将实体定义为导航属性值来创建彼此相关的实体.这被称为深插入.与基本创建一样,响应OData-EntityId头包含已创建实体的Uri.不返回创建的相关实体的URI.

下面的代码是创建帐户(1),创建+关联主要联系人(2),创建和关联机会(3)和创建+关联任务(4)

POST [Organization URI]/api/data/v8.2/accounts HTTP/1.1
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

{
 "name": "Sample Account",
 "primarycontactid":
 {
     "firstname": "John",
     "lastname": "Smith"
 },
 "opportunity_customer_accounts":
 [
  {
      "name": "Opportunity associated to Sample Account",
      "Opportunity_Tasks":
      [
       { "subject": "Task associated to opportunity" }
      ]
  }
 ]
}
Run Code Online (Sandbox Code Playgroud)

第2部分:将
注释与联系人关联使用以下语法.

note["objectid_contact@odata.bind"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)";
Run Code Online (Sandbox Code Playgroud)

参考SO链接博客

第3部分:
回答你对另一个答案的评论annotation_id_from_first_request:

要从上一个请求中获取创建的记录ID,您可以解析如下:

                //get Response from Created Record
                entityIdWithLink = XMLHttpRequest.getResponseHeader("OData-EntityId");

                //get EntityId from ResponseHeader of Created Record  
                getEntityId = entityIdWithLink.split(/[()]/);
                getEntityId = getEntityId[1];
Run Code Online (Sandbox Code Playgroud)

你可以阅读更多

您可以撰写POST请求,以便返回创建记录中的数据,状态为201(已创建).
要获得此结果,您必须return=representation在请求标头中使用首选项.要控制返回哪些属性,请将$ select查询选项附加到实体集的URL.
如果使用$ expand查询选项将被忽略.以这种方式创建实体时,OData-EntityId不会返回包含创建记录的URI 的标头

注意:此功能随2016年12月动态365更新一起添加

MSDN参考:使用返回的数据创建

更新:
如果有人在寻找工作负载示例以深入插入记录+注释,则以下内容来自我的项目:

data = {
        "new_attribute1": "test attribute 1",
        "new_attribute2": "test attribute 2",
        "new_comments": "test comments",
        "new_recordurl": recordURL,
        "new_feedback_Annotations":
            [
                {
                    "notetext": "Screenshot attached",
                    "subject": "Attachment",
                    "filename": file.name,
                    "mimetype": file.type,
                    "documentbody": base64str,
                }
            ]
    };
Run Code Online (Sandbox Code Playgroud)


Kje*_*sen 5

此答案适用于 web api 使用:

如果已使用大写字母定义了references 属性,则必须在更新和插入时在属性中使用大写字母。查看主要实体的属性列表中的架构名称。

假设您有myprefix_entity一个引用帐户实体的实体,您将其命名为Account,架构名称变为myprefix_AccountId,您必须将其引用为:

"myprefix_AccountId@odata.bind":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"
Run Code Online (Sandbox Code Playgroud)

myprefix_AccountId如果架构名称是这样定义的,那么大写 A 和大写 I 很重要。