この質問は、APIを通じて呼び出すMicrosoft Dynamics CRM 2015に関連しています。
連絡先エンティティを作成します。
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]",
....
}
次に、その連絡先に関連付けられた注釈レコードを追加します。 ガイド の後に私が呼び出す:
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エラーを返します:
ペイロードにプロパティアノテーションのみがあり、ペイロードにプロパティ値が見つからない、宣言されていないプロパティ 'contact'。 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]
-影響なし。
何か案は?
私はこれが機能していることを発見しましたが、2つのリクエストがあります:
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
値は、最初のリクエストの応答から取得されます。
[email protected]
を使用する代わりに、[email protected]
を使用する必要があります。この結果は次のとおりです。
"[email protected]": "/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)"
プロパティのリストを取得するには、 documentation の単一値ナビゲーションプロパティの下を調べます。
パート1:
MSDNリファレンス: Deep Insert
ナビゲーションプロパティの値として定義することにより、互いに関連するエンティティを作成できます。これはdeep insertとして知られています。基本的な作成と同様に、レスポンスの
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["[email protected]"] = "/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(Created)のステータスで返されるようにすることができます。
この結果を取得するには、リクエストヘッダーでreturn=representation
設定を使用する必要があります。返されるプロパティを制御するには、エンティティセットのURLに$ selectクエリオプションを追加します。
$ 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,
}
]
};
作成とリンクにこの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"}
この回答は、Web APIの使用に適用されます。
参照プロパティが大文字を使用して定義されている場合は、更新および挿入時にプロパティで大文字を使用する必要があります。プライマリエンティティのプロパティリストでスキーマ名を確認します。
アカウントエンティティへの参照を含むmyprefix_entity
というエンティティがあり、それにAccount
という名前を付け、スキーマ名がmyprefix_AccountId
になったとすると、次のように参照する必要があります。
"[email protected]":"/accounts(f76e4e7c-ea61-e511-80fd-000000000000)"
myprefix_AccountId
の大文字のAと大文字のIは、スキーマ名が定義されている方法である場合に重要です。
以下を使用できます。
'[email protected]': '/contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'
ほとんどのレコードでは、パラメーター名として_contactid_valueを取得します。したがって、パラメーターとして[email protected]のように渡し、値にcontactsとGUIDである 'EntitySetName'を渡す必要があります。 '/ EntitysetName(GUID)'したがって、値は '/ contacts(f76e4e7c-ea61-e511-80fd-3863bb342b00)'になります
これには少し遅れるかもしれませんが、次のリンクの答えはバインディングが本当にうまく機能する方法を説明しています。
基本的に、フィールドスキーマ名をサフィックス@ odata.bindとともに使用する必要があり、値は "/ entityschemaname(recordGUID)"entityschemanameには 's'が必要であり、recordGUIDが必要であることに注意してください。中括弧はありません。
詳細については、この情報を以下のリンクから入手してください。