Подтвердить что ты не робот

Создание аннотации к контактному объекту в 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] - но никаких эффектов.

Любые идеи?

4b9b3361

Ответ 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 имеет значение, если именно так определено имя схемы.