Создание аннотации к контактному объекту в Microsoft Dynamics CRM по API
Этот вопрос связан с Microsoft Dynamics CRM 2015, который я вызываю через API.
Я создаю контактную сущность:
POST [organization URI]/api/data/contacts
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"emailaddress1": "[email protected]",
}
Он работает, я вижу новую запись после входа в панель.
И я могу назвать это через 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":"[email protected]",
....
}
Следующее, что я хочу сделать, - добавить запись аннотации, связанную с этим контактом.
Следуя guide, я вызываю:
POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"notetext": "TEST",
'[email protected]': 'contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
}
Но он возвращает 400 ошибок:
В полезной нагрузке обнаружено неотключенное свойство "контакт", которое имеет только аннотации свойств в полезной нагрузке, но не имеет значения свойства. В OData только объявленные свойства навигации и объявленные именованные потоки могут быть представлены как свойства без значений.
Когда я звоню:
POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"notetext": "TEST",
}
Создается новый объект, но без отношения к контакту.
Как правильно составить этот запрос POST? Что мне здесь не хватает?
Я подозреваю, что [email protected]
должен быть представлен как-то иначе, я пробовал [email protected]
, [email protected]
, [email protected]
- но никаких эффектов.
Любые идеи?
Ответы
Ответ 1
Я нашел эту работу, но в двух запросах:
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)"
}
Edit:
annotation_id_from_first_request
значение принимается в форме запроса первого запроса.
Ответ 2
Вместо [email protected]
вы должны использовать [email protected]
. Полученные результаты:
"[email protected]": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"
Чтобы получить список свойств, ознакомьтесь с однозначными свойствами навигации в документации .
Ответ 3
Часть 1:
Ссылка MSDN: Глубокая вставка
Вы можете создавать объекты, связанные друг с другом, определяя их как значения свойств навигации. Это называется глубокой вставкой. Как и в случае с базовым созданием, заголовок ответа OData-EntityId
содержит Uri созданного объекта. URI для связанных объектов, созданных arent, возвращены.
Ниже код должен создать учетную запись (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["[email protected]"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)";
Обратитесь SO link и blog
Часть 3:
Ответьте на свой комментарий о другом ответе о annotation_id_from_first_request
:
Чтобы получить созданный идентификатор записи в ответ от последнего запроса, вы можете выполнить синтаксический анализ, как показано ниже:
//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 query к URL-адресу в набор объектов.
Опция запроса $expand будет проигнорирована, если используется. Когда объект создается таким образом, заголовок OData-EntityId
, содержащий URI для созданной записи, не возвращается
Примечание. Эта возможность была добавлена с обновлением в декабре 2016 года для Dynamics 365
Ссылка MSDN: Создать с возвращенными данными
Ответ 4
Я использую этот код С# для создания и компоновки (задача 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"}
Ответ 5
Этот ответ применяется для использования веб-api:
Если свойство ссылок определено с помощью прописных букв, вы должны использовать заглавные буквы в свойстве при обновлении и вставке. Посмотрите на имя схемы в списке свойств первичного объекта.
Предположим, что у вас есть объект с именем myprefix_entity
со ссылкой на объект учетной записи, и вы назвали его Account
, а имя схемы стало myprefix_AccountId
, вам нужно было бы называть его как:
"[email protected]":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"
В верхнем регистре A и в верхнем регистре я в myprefix_AccountId
имеет значение, если именно так определено имя схемы.