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)
要获取属性列表,请查看文档中的单值导航属性.
我发现这有效,但有两个请求:
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 值来自第一个请求的响应.
第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)
第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)
此答案适用于 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 很重要。
| 归档时间: |
|
| 查看次数: |
10164 次 |
| 最近记录: |