Cette question est liée à Microsoft Dynamics CRM 2015, que j'appelle via une API.
Je crée une entité de contact:
POST [organization URI]/api/data/contacts
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"emailaddress1": "[email protected]",
}
Cela fonctionne, je vois un nouvel enregistrement après que je me suis connecté au panneau. Et je peux l'appeler via l'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]",
....
}
La prochaine chose que je veux faire est d'ajouter un enregistrement d'annotation associé à ce contact. À la suite du guide I call:
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)'
}
Mais cela retourne 400 erreur:
Un 'contact' de propriété non déclarée qui n'a que des annotations de propriété dans la charge utile mais aucune valeur de propriété n'a été trouvée dans la charge utile. Dans OData, seules les propriétés de navigation déclarées et les flux nommés déclarés peuvent être représentés sous forme de propriétés sans valeur.
Quand j'appelle:
POST [organization URI]/api/data/annotations
Content-Type: application/json; charset=utf-8
Accept: application/json
{
"notetext": "TEST",
}
Une nouvelle entité est créée, mais sans relation de contact.
Comment composer correctement cette demande POST? Qu'est-ce qui me manque ici? Je suppose que [email protected]
devrait être présenté de manière différente, j'ai déjà essayé [email protected]
, [email protected]
, [email protected]
- mais aucun effet.
Des idées?
J'ai trouvé cela fonctionne, mais dans deux demandes:
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)"
}
Modifier:
La valeur annotation_id_from_first_request
est prise de la réponse de la première demande.
Au lieu d'utiliser [email protected]
, vous devez utiliser [email protected]
. Ces résultats sont en:
"[email protected]": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"
Pour obtenir la liste des propriétés, recherchez les propriétés de navigation à valeur unique dans documentation .
Partie 1:
Référence MSDN: Deep Insert
Vous pouvez créer des entités liées les unes aux autres en les définissant comme valeurs de propriétés de navigation. Cela s'appelle deep insert . Comme pour une création basique, l'en-tête de réponse
OData-EntityId
contient l'URI de l'entité créée. Les URI des entités associées créées ne sont pas renvoyés.
Le code ci-dessous sert à créer un compte (1), créer + associer un contact principal (2), créer et associer une opportunité (3) et créer + associer une tâche (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" }
]
}
]
}
Partie 2:
L'association d'une annotation à un contact utilise la syntaxe ci-dessous.
note["[email protected]"] = "/contacts(C5DDA727-B375-E611-80C8-00155D00083F)";
Partie 3:
Répondez à votre commentaire sur une autre réponse à propos de annotation_id_from_first_request
:
Pour obtenir l'ID d'enregistrement créé en réponse à la dernière demande, vous pouvez analyser comme ci-dessous:
//get Response from Created Record
entityIdWithLink = XMLHttpRequest.getResponseHeader("OData-EntityId");
//get EntityId from ResponseHeader of Created Record
getEntityId = entityIdWithLink.split(/[()]/);
getEntityId = getEntityId[1];
Vous pouvez lire plus
Vous pouvez composer votre demande POST afin que les données de l'enregistrement créé soient renvoyées avec le statut 201 (Créé).
Pour obtenir ce résultat, vous devez utiliser la préférencereturn=representation
dans les en-têtes de requête. Pour contrôler les propriétés renvoyées, ajoutez l'option de requête $ select à l'URL du jeu d'entités.
L'option de requête $ expand sera ignorée si elle est utilisée. Lorsqu'une entité est créée de cette manière, l'en-têteOData-EntityId
contenant l'URI de l'enregistrement créé n'est pas renvoyé.Remarque : cette fonctionnalité a été ajoutée à la mise à jour de décembre 2016 pour Dynamics 365.
Référence MSDN: Créer avec les données renvoyées
Mise à jour :
Si quelqu'un cherche à insérer profondément un enregistrement + une annotation dans la charge utile, le texte ci-dessous provient de mon projet:
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,
}
]
};
J'utilise ce code C # pour créer et relier (le contenu de Task.Await n'est pas très intelligent, alors ... soyez prudent):
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;
Le JSON ressemble à ceci:
{"NoteText":"Hello World!",
"Subject":"Note Subject",
"ObjectId": {"LogicalName":"account",
"Id":"003CCFC2-4012-DE11-9654-001F2964595C"}
,"ObjectTypeCode":"account"}
Cette réponse s'applique à l'utilisation de l'API Web:
Si la propriété de références a été définie à l'aide de lettres majuscules, vous devez utiliser des lettres majuscules dans la propriété lors de la mise à jour et de l'insertion. Recherchez le nom du schéma dans la liste des propriétés de l'entité principale.
Disons que vous avez une entité appelée myprefix_entity
avec une référence à l'entité de compte, et que vous l'avez nommée Account
, et que le nom du schéma est devenu myprefix_AccountId
, vous devez le référencer comme suit:
"[email protected]":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"
La majuscule A et la majuscule I dans myprefix_AccountId
importent, si c'est ainsi que le nom de schéma a été défini.
Vous pouvez utiliser ce qui suit.
'[email protected]': '/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
Dans la plupart des enregistrements, vous obtiendrez _contactid_value en tant que nom de paramètre. Donc, vous devez passer comme [email protected] en tant que paramètre et dans la valeur, vous devez passer 'EntitySetName' qui serait contacts et le GUID. '/EntitysetName(GUID)'Ainsi la valeur sera'/contacts (f76e4e7c-ea61-e511-80fd-3863bb342b00) '
peut-être un peu tard pour cela, mais la réponse dans le lien suivant explique comment la liaison fonctionne vraiment bien.
en gros, vous devez utiliser le nom du schéma de champ avec le suffixe @ odata.bind et la valeur étant "/ entityschemaname (recordGUID)" il faut se rappeler Le nom d'entité doit avoir un 's' et le recordGUID ne doit pas avoir les accolades.
pour plus d'informations suivez ce lien ci-dessous où j'ai obtenu cette information de
'Une propriété non déclarée' lors de la tentative de création d'un enregistrement via Web API