"Необъявленное свойство" при попытке создать запись через веб-API
Я получаю ошибку, которую просто не могу отладить. Я пытаюсь создать пользовательский объект активности через пользовательский веб-ресурс HTML/JavaScript.
Пользователь нажимает кнопку и следующие параметры:
var params = {
'rob_faqid@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
Передаются на этот URL:
https://dynamicsorg/api/data/v8.2/rob_quickactions/
Со следующими заголовками:
xhr.setRequestHeader('OData-MaxVersion', '4.0');
xhr.setRequestHeader('OData-Version', '4.0');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.setRequestHeader('Prefer', 'return=representation');
Это дает мне HTTP-код 400 (bad request)
и это сообщение об ошибке:
An undeclared property 'rob_faqid' which only has property annotations in the payload but no property value was found in the payload. In OData, only declared navigation properties and declared named streams can be represented as properties without values.
Интересно, что я получаю эту ошибку, независимо от того, использую ли я фактический GUID или добавляю туда немного тарабарщины (предполагая, что это не связано с передаваемым значением).
Я могу создавать записи вручную через стандартную форму.
Я использую odata.bind
в другом месте в том же проекте без ошибок.
4 ответа
После хорошего сна я поняла свою ошибку. Чтобы установить значение поля поиска, вам нужно использовать имя схемы отношений, а не имя свойства.
Как только я это изменил, все работало нормально.
Если вы хотите установить поле поиска во время создания новой записи через веб-API, вы должны использовать имя схемы поиска, за которым следует аннотация привязки. Это означает, что вы должны использовать верблюжий чехол для своего поля.
var params = {
'rob_FaqId@odata.bind': '/rob_faqs(guid-here)',
'rob_source': 180840000,
'subject': 'Signpost',
'actualstart': new Date(),
'actualend': new Date()
};
Итак, общая структура для создания новой записи с уже установленным полем поиска через веб-API выглядит следующим образом:
{
"schemaNameOfLookup@odata.bind": "/relatedentitys(guid)" //don't forget the plural 's'
}
Или другой пример из официальной документации. Как создать новую учетную запись и напрямую назначить уже существующий контакт в качестве основного.
var newAccountRecordObj = {
"name": "Sample Account",
"primarycontactid@odata.bind": "/contacts(00000000-0000-0000-0000-000000000001)"
}
В данном случае принятый ответ верен, но, похоже, это еще не все. В некоторых случаях необходимо использовать
<logical name>_<entity name>
. Например, при выполнении
POST sharepointdocumentlocations
, Мне пришлось использовать:
"regardingobjectid_contact@odata.bind": "/contacts(xxxx)"
"parentsiteorlocation_sharepointdocumentlocation@odata.bind" "/sharepointdocumentlocations(xxx)"
Это может быть как-то связано с тем фактом, что эти отношения могут указывать на несколько типов сущностей, но я не нашел никакой документации Microsoft по этому поводу.
Ответ @Andy был верным для более эзотерических имен, но я не смог мысленно сопоставить, что они значили для моих данных.
Чтобы найти свою рабочую ценность, я перепробовал все уникальные варианты из более чем 20 ссылок на (а также любые партнерские поля), найденные в xml метаданных:
https://$yourCRMInstance.api.crm.dynamics.com/api/data/v9.2/$metadata
В моем случае ни одно из задокументированных имен схем или имен отношений не сработало - в конечном итоге это было (для поля поиска: new_mylookupfield
/ сущность: new_mycustomentity
):
{new_mylookupfield_new_mycustomentity@odata.bind: "/systemusers(guid)"}