[英]Create annotation to a contact entity in Microsoft Dynamics CRM by API
这个问题与我通过 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",
}
它有效,我在登录面板后看到新记录。 我可以通过 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",
....
}
接下来我要做的是添加与该联系人关联的注释记录。 按照指南,我打电话给:
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)'
}
但它返回 400 错误:
未声明的属性“contact”在有效负载中只有属性注释,但在有效负载中找不到属性值。 在 OData 中,只有声明的导航属性和声明的命名流可以表示为没有值的属性。
当我打电话时:
POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"notetext": "TEST",
}
新实体已创建,但与联系人无关。
如何正确编写此 POST 请求? 我在这里错过了什么? 我怀疑contact@odata.bind
应该以某种不同的方式呈现,我已经尝试过contactid@odata.bind
, object@odata.bind
, objectid@odata.bind
- 但没有效果。
有任何想法吗?
而不是使用的objectid@odata.bind
,你必须使用objectid_contact@odata.bind
。 结果是:
"objectid_contact@odata.bind": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"
要获取属性列表,请查看文档中的单值导航属性。
我发现这有效,但有两个请求:
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)"
}
编辑:
annotation_id_from_first_request
值取自第一个请求的响应。
第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" }
]
}
]
}
第2部分:
将注释与联系人相关联使用以下语法。
note["objectid_contact@odata.bind"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)";
第 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];
你可以阅读更多
您可以编写您的 POST 请求,以便来自已创建记录的数据将以 201(已创建)状态返回。
要获得此结果,您必须在请求标头中使用return=representation
首选项。 要控制返回哪些属性,请将 $select 查询选项附加到实体集的 URL。
如果使用 $expand 查询选项将被忽略。 以这种方式创建实体时,不会返回包含所创建记录的 URI 的OData-EntityId
标头注意:此功能是随 Dynamics 365 的 2016 年 12 月更新添加的
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,
}
]
};
此答案适用于 web api 使用:
如果已使用大写字母定义了references 属性,则必须在更新和插入时在属性中使用大写字母。 查看主要实体的属性列表中的架构名称。
假设您有一个名为myprefix_entity
的实体,并引用了帐户实体,并将其命名为Account
,架构名称变为myprefix_AccountId
,您必须将其引用为:
"myprefix_AccountId@odata.bind":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"
myprefix_AccountId
的大写 A 和大写 I myprefix_AccountId
重要,如果架构名称是这样定义的。
我使用这个 C# 代码来创建和链接(Task.Await 的东西不是很聪明,所以......小心):
dynamic testAno = new ExpandoObject();
testAno.NoteText = "Hello World!";
testAno.Subject = "Note Subject";
dynamic refAccount = new ExpandoObject();
refAccount.LogicalName = "account";
refAccount.Id = "003CCFC2-4012-DE11-9654-001F2964595C";
testAno.ObjectId = refAccount;
testAno.ObjectTypeCode = refAccount.LogicalName;
var demo = JsonConvert.SerializeObject(testAno);
HttpContent content = new StringContent(demo, Encoding.UTF8, "application/json");
var handler = new HttpClientHandler { UseDefaultCredentials = true };
HttpClient client = new HttpClient(handler);
var test = client.PostAsync(new Uri("http://crm/.../XRMServices/2011/OrganizationData.svc/AnnotationSet"), content).Result;
JSON 看起来像这样:
{"NoteText":"Hello World!",
"Subject":"Note Subject",
"ObjectId": {"LogicalName":"account",
"Id":"003CCFC2-4012-DE11-9654-001F2964595C"}
,"ObjectTypeCode":"account"}
您可以使用以下内容。
'contactid_contact@odata.bind': '/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
在大多数记录中,您将获得 _contactid_value 作为参数名称。 所以你必须像contactid_entityname@odata.bind一样传递一个参数,在你必须传递的值中,你必须传递'EntitySetName',这将是联系人和GUID。 '/EntitysetName(GUID)' 所以值将是 '/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
对此可能有点晚,但以下链接中的答案解释了绑定如何真正有效地工作。
基本上,您需要使用带有后缀@odata.bind的字段架构名称,并且值为“/entityschemaname(recordGUID)”记住entityschemaname 需要有一个's'并且recordGUID不应该有大括号.
有关更多信息,请点击下面的链接,我是从那里获得此信息的
如果你使用 OData,那么你可以这样做......
在您的注释数据 model 中:
[DataContract(Name = "annotations")]
public record Annotation
{
[DataMember(Name = "objectid_rd_servicerequestsession")]
public ServiceRequestSession ObjectId { get; set; } = default!;
[DataMember(Name = "objecttypecode")]
public string ObjectTypeCode { get; set; } = default!;
其中 rd_servicerequestsession 是您的实体名称。 那么你只需要新建一个 object 注解 object
var annotation = new Annotation
{
ObjectId = serviceRequestSession,
ObjectTypeCode = "rd_servicerequestsession",
并简单地调用 InsertEntry 方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.