# vyung.api.doc **Repository Path**: suojj_admin/vyung.api.doc ## Basic Information - **Project Name**: vyung.api.doc - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-02-17 - **Last Updated**: 2021-09-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 支持online和本地部署 ## 内容 * [请求例子](#请求例子) * [创建记录](#创建记录) * [更新记录](#更新记录) * [更新一个属性值](#更新一个属性的值) * [Upsert记录](#Upsert记录) * [删除记录](#删除记录) * [删除一个属性的值](#删除一个属性的值) * [查询单条记录](#查询单条记录) * [查询多条记录](#查询多条记录) * [查找所有记录](#查找所有记录) * [数量](#数量) * [Count limitation workaround](#count-limitation-workaround) * [关联记录](#关联记录) * [关联记录用单一导航属性](#关联记录用单一导航属性) * [解除关联](#解除关联) * [解除关联用单一属性导航](#解除关联用单一属性导航) * [fetxml查询](#fetxml查询) * [分页](#分页) * [Fetch查询所有记录](#Fetch查询所有记录) * [执行Web API functions](#执行Web-API-functions) * [执行 Web API actions](#执行Web-API-actions) * [使用外键](#使用外键) * [使用实体逻辑名称请求](#使用实体逻辑名称请求) ## 开始 ### vyDynamicswebapi作为Dynamics 365 web resource ### npm使用 npm install vy-dynamics-webapi --save var DynamicsWebApi = require('vy-dynamics-webapi'); ```js var dynamicsWebApi = new vyDynamicswebapi(); dynamicsWebApi.executeUnboundFunction("WhoAmI").then(function (response) { }).catch(function(error){ console.log(error.message); }); ``` ### 配置 #### Web browser ```js var dynamicsWebApi = new vyDynamicswebapi({ webApiVersion: '9.0' }); ``` #### 配置参数 属性名称 | 类型 | 描述 ------------ | ------------- | ------------- impersonate | String | 代理用户的Guid. timeout | Number | 超时时间. useEntityNames | Boolean | 在请求期间是否使用实体逻辑名称而不是集合逻辑名称 webApiUrl | String | https://myorg.api.crm.dynamics.com/api/data/v8.2/. webApiVersion | String | 版本号,默认为8.0 axiosService | Object | axios对象,可以实现路由拦截等功能 作为外部系统调用时,第一次请求时会获取所有实体的元素据,作为web资源不会发生。 ## 请求例子 注意:如果是请求url过长会自动变成批量请求 ### 创建记录 ```js //初始化对象 var lead = { subject: "Test WebAPI", firstname: "Test", lastname: "WebAPI", jobtitle: "Title" }; //调用创建方法 dynamicsWebApi.create(lead, "leads").then(function (id) { }).catch(function (error) { }) ``` 如果你需要你刚才创建的记录的其他字段 ```js //初始化对象 var lead = { subject: "Test WebAPI", firstname: "Test", lastname: "WebAPI", jobtitle: "Title" }; //调用创建方法 dynamicsWebApi.create(lead, "leads", ["return=representation"]).then(function (record) { var subject = record.subject; }).catch(function (error) { }) ``` 当然你也可以添加一些字段的说明 ```js dynamicsWebApi.create(lead, "leads", ["return=representation", "odata.include-annotations=*"]) //... //或者 dynamicsWebApi.create(lead, "leads", "return=representation,odata.include-annotations=*") //... //如果想获取某些字段 dynamicsWebApi.create(lead, "leads", ["return=representation", "odata.include-annotations=*"], ["subject"]) //... ``` #### 高级请求 ```js //初始化对象 var lead = { subject: "Test WebAPI", firstname: "Test", lastname: "WebAPI", jobtitle: "Title" }; var request = { collection: "leads", entity: lead, returnRepresentation: true } //调用方法 dynamicsWebApi.createRequest(request).then(function (record) { var subject = record.subject; }).catch(function (error) { }) ``` ### 更新记录 #### 基本 ```js //潜在客户的id var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; //初始化对象 //初始化需要更新的字段 var lead = { subject: "Test update", jobtitle: "Developer" } //调用更方法 dynamicsWebApi.update(leadId, "leads", lead).then(function () { }) .catch(function (error) { }); ``` #### 高级 ```js var request = { key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70', collection: "leads", entity: { subject: "Test update", jobtitle: "Developer" }, returnRepresentation: true, select: ["fullname"] }; dynamicsWebApi.updateRequest(request).then(function (response) { var fullname = response.fullname; }) .catch(function (error) { }); ``` ### 更新一个属性的值 ```js //潜在客户的id var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; //初始化键值对 var keyValuePair = { subject: "Update Single" }; //调用方法 dynamicsWebApi.updateSingleProperty(leadId, "leads", keyValuePair).then(function () { }) .catch(function (error) { }); ``` ### Upsert记录 #### 基本 ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; var lead = { subject: "Test Upsert" }; //初始化对象 dynamicsWebApi.upsert(leadId, "leads", lead).then(function (id) { }) .catch(function (error) { }); ``` #### 高级 ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; var request = { key: leadId, collection: "leads", returnRepresentation: true, select: ["fullname"], entity: { subject: "Test upsert" }, ifnonematch: "*" //阻止更新 }; dynamicsWebApi.upsertRequest(request).then(function (record) { if (record != null) { //创建完成 } else { //阻止更新 } }) .catch(function (error) { }); ``` ### 删除记录 #### Basic ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; dynamicsWebApi.deleteRecord(leadId, "leads").then(function () { }) .catch(function (error) { }); ``` #### 高级 ```js //乐观并发删除 var request = { key: recordId, collection: "leads", ifmatch: 'W/"470867"' } dynamicsWebApi.deleteRequest(request).then(function (isDeleted) { if (isDeleted){ //如果记录已经删除 } else{ //如果记录没有删除 } }) .catch(function (error) { }); ``` #### 删除一个属性的值 ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; dynamicsWebApi.deleteRecord(leadId, "leads", "subject").then(function () { }) .catch(function (error) { }); ``` ### 查询单条记录 #### 基本 ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; dynamicsWebApi.retrieve(leadid, "leads", ["fullname", "subject"]).then(function (record) { }) .catch(function (error) { }); ``` #### 高级 ```js var request = { key: '7d577253-3ef0-4a0a-bb7f-8335c2596e70', collection: "leads", select: ["fullname", "subject"], ifnonematch: 'W/"468026"', includeAnnotations: "OData.Community.Display.V1.FormattedValue" }; dynamicsWebApi.retrieveRequest(request).then(function (record) { }) .catch(function (error) { }); ``` #### 查找关联实体使用单一值导航属性 基础和高级的都可以使用: `select: ["ownerid/$ref"]`.[单一值导航属性](https://docs.microsoft.com/zh-cn/previous-versions/dynamicscrm-2016/developers-guide/mt607871(v=crm.8)) ```js var leadId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; dynamicsWebApi.retrieve(leadid, "leads", ["ownerid/$ref"]).then(function (reference) { var ownerId = reference.id; var collectionName = reference.collection; // systemusers or teams }) ``` #### 查找关联实体数据使用单一值导航属性 [single-valued navigation property](https://msdn.microsoft.com/en-us/library/mt607990.aspx#Anchor_5) 关联实体属性名称前面必须加/,并且必须放到数组第一位 ```js var recordId = '7d577253-3ef0-4a0a-bb7f-8335c2596e70'; dynamicsWebApi.retrieve(recordId, "new_tests", ["/new_ParentLead", "fullname", "subject"]) .then(function (leadRecord) { var fullname = leadRecord.fullname; }) ``` 高级方法使用 navigationProperty属性 或者和基本方法使用一样 ```js var request = { key: recordId, collection: "new_tests", navigationProperty: "new_ParentLead", //use request.navigationProperty select: ["fullname", "subject"] } //or request = { key: recordId, collection: "new_tests", select: ["/new_ParentLead", "fullname", "subject"] //inline with prefix "/" } dynamicsWebApi.retrieveRequest(request).then(function (leadRecord) { var fullname = leadRecord.fullname; }) ``` ### 查询多条记录 #### 基本 ```js dynamicsWebApi.retrieveMultiple("leads", ["fullname", "subject"], "statecode eq 0").then(function (records) { }) .catch(function (error) { }); ``` #### 高级 如果是lookup字段需要注意使用_`字段名称`_value的格式 ```js var request = { collection: "leads", select: ["fullname", "subject"], filter: "statecode eq 0", maxPageSize: 5, count: true }; dynamicsWebApi.retrieveMultipleRequest(request).then(function (response) { var count = response.oDataCount; var nextLink = response.oDataNextLink; var records = response.value; }) .catch(function (error){ }); ``` ##### 分页 ```js var request = { collection: "leads", select: ["fullname", "subject"], filter: "statecode eq 0", maxPageSize: 5, count: true }; dynamicsWebApi.retrieveMultipleRequest(request).then(function (response) { var count = response.oDataCount; var nextLink = response.oDataNextLink; var records = response.value; dynamicsWebApi.retrieveMultipleRequest(request,nextLink).then(function (response) { var count = response.oDataCount; var nextLink = response.oDataNextLink; var records = response.value; }) .catch(function (error){ }); }) .catch(function (error){ }); ``` #### 查找所有记录 基本 ```js dynamicsWebApi.retrieveAll("leads", ["fullname", "subject"], "statecode eq 0").then(function (response) { var records = response.value; }) .catch(function (error){ }); ``` 高级 ```js var request = { collection: "leads", select: ["fullname", "subject"], filter: "statecode eq 0", maxPageSize: 5 }; dynamicsWebApi.retrieveAllRequest(request).then(function (response) { var records = response.value; }) .catch(function (error){ }); ``` ### 数量 这种解决方法的缺点是,它不仅返回计数数字,而且还返回集合中记录的所有数据。为了做一个小的 优化我添加了第三个参数到函数中,可以用来减少响应的长度。第三个参数表示选择查询选项 ```js dynamicsWebApi.countAll("leads", "statecode eq 0", ["subject"]).then(function (count) { }) .catch(function (error) { }); ``` ### 关联记录 ```js var accountId = '00000000-0000-0000-0000-000000000001'; var leadId = '00000000-0000-0000-0000-000000000002'; dynamicsWebApi.associate("accounts", accountId, "lead_parent_account", "leads", leadId).then(function () { }).catch(function (error) { }); ``` ### 关联记录用单一导航属性 单一盗汗属性可以通过`GET` 请求加上header信息`Prefer:odata.include-annotations=Microsoft.Dynamics.CRM.associatednavigationproperty`, 返回的记录的属性会包含`@Microsoft.Dynamics.CRM.associatednavigationproperty` 就是我们需要的单一导航的属性 通常我们可以用实体的字段的架构名称 例子 ```js var new_testid = '00000000-0000-0000-0000-000000000001'; var leadId = '00000000-0000-0000-0000-000000000002'; dynamicsWebApi.associateSingleValued("new_tests", new_testid, "new_ParentLead", "leads", leadId) .then(function () { }).catch(function (error) { }); ``` ### 解除关联 ```js var accountId = '00000000-0000-0000-0000-000000000001'; var leadId = '00000000-0000-0000-0000-000000000002'; dynamicsWebApi.disassociate("accounts", accountId, "lead_parent_account", leadId).then(function () { }).catch(function (error) { }); ``` ### 解除关联用单一属性导航 [Associate for a single-valued navigation property](#associate-for-a-single-valued-navigation-property). ```js var new_testid = '00000000-0000-0000-0000-000000000001'; dynamicsWebApi.disassociateSingleValued("new_tests", new_testid, "new_ParentLead").then(function () { }).catch(function (error) { }); ``` ### fetxml查询 ```js //声明fetchxml var fetchXml = '' + '' + '' + '' + '' + ''; dynamicsWebApi.executeFetchXml("accounts", fetchXml).then(function (response) { }) .catch(function (error) { }); ``` `dynamicsWebApi.fetch(...)` 一样类似 `executeFetchXml`. #### 分页 ```js //声明fetchxml var fetchXml = '' + '' + '' + '' + '' + ''; dynamicsWebApi.executeFetchXml("accounts", fetchXml).then(function (response) { return dynamicsWebApi .executeFetchXml("accounts", fetchXml, null, response.PagingInfo.nextPage, response.PagingInfo.cookie); }).then(function (response) { return dynamicsWebApi .executeFetchXml("accounts", fetchXml, null, response.PagingInfo.nextPage, response.PagingInfo.cookie); }).then(function (response) { }) ``` #### Fetch查询所有记录 获取全部的记录 ```js var fetchXml = '' + '' + '' + '' + '' + ''; dynamicsWebApi.executeFetchXmlAll("accounts", fetchXml).then(function (response) { }) ``` `dynamicsWebApi.fetchAll(...)`一样类似`executeFetchXmlAll`. ### 执行Web API functions [function列表](https://docs.microsoft.com/zh-cn/dynamics365/customer-engagement/web-api/functions?view=dynamics-ce-odata-9) #### Bound functions ```js var teamId = "00000000-0000-0000-0000-000000000001"; dynamicsWebApi.executeBoundFunction(teamId, "teams", "Microsoft.Dynamics.CRM.RetrieveTeamPrivileges") .then(function (response) { }).catch(function (error) { }); ``` #### Unbound functions ```js var parameters = { LocalizedStandardName: 'Pacific Standard Time', LocaleId: 1033 }; dynamicsWebApi.executeUnboundFunction("GetTimeZoneCodeByLocalizedName", parameters).then(function (result) { var timeZoneCode = result.TimeZoneCode; }).catch(function (error) { }); ``` ### 执行Web API actions #### Bound actions [系统标准action列表](https://docs.microsoft.com/zh-cn/dynamics365/customer-engagement/web-api/actions?view=dynamics-ce-odata-9) ```js var queueId = "00000000-0000-0000-0000-000000000001"; var letterActivityId = "00000000-0000-0000-0000-000000000002"; var actionRequest = { Target: { activityid: letterActivityId, "@odata.type": "Microsoft.Dynamics.CRM.letter" } }; dynamicsWebApi.executeBoundAction(queueId, "queues", "Microsoft.Dynamics.CRM.AddToQueue", actionRequest) .then(function (result) { var queueItemId = result.QueueItemId; }) .catch(function (error) { }); ``` #### Unbound actions ```js var opportunityId = "b3828ac8-917a-e511-80d2-00155d2a68d2"; var actionRequest = { Status: 3, OpportunityClose: { subject: "Won Opportunity", "opportunityid@odata.bind": "opportunities(" + opportunityId + ")" } }; dynamicsWebApi.executeUnboundAction("WinOpportunity", actionRequest).then(function () { }).catch(function (error) { }); ``` #### 限制 [Execute batch operations using the Web API](https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/execute-batch-operations-using-web-api). ## 格式化值和lookup字段 For example: ```js var doNotPostEmailFormatted = response.donotpostalmail_Formatted; var customerName = response._customerid_value_Formatted; var customerEntityLogicalName = response._customerid_value_LogicalName; var customerNavigationProperty = response._customerid_value_NavigationProperty; ``` OData Annotation | Property Suffix ------------ | ------------- `@OData.Community.Display.V1.FormattedValue` | `_Formatted` `@Microsoft.Dynamics.CRM.lookuplogicalname` | `_LogicalName` `@Microsoft.Dynamics.CRM.associatednavigationproperty` | `_NavigationProperty` ## 使用外键 使用外键可以增删改查 [More Info](https://msdn.microsoft.com/en-us/library/mt607871.aspx#Retrieve%20using%20an%20alternate%20key) ### Basic usage ```js var alternateKey = "key='keyValue'"; //or var alternateKey = "key='keyValue',anotherKey='keyValue2'"; //执行查询操作 dynamicsWebApi.retrieve(alternateKey, "leads", ["fullname", "subject"]).then(function (record) { }) .catch(function (error) { }); ``` ### 高级请求对象 ```js var request = { key: "alternateKey='keyValue'", collection: 'leads', select: ['fullname', 'subject'] }; dynamicsWebApi.retrieveRequest(request).then(function (record) { }) .catch(function (error) { }); ``` ```js var request = { key: '00000000-0000-0000-0000-000000000001', collection: 'leads', select: ['fullname', 'subject'] }; dynamicsWebApi.retrieveRequest(request).then(function (record) { }) .catch(function (error) { }); ``` ## 使用实体逻辑名称请求 ```js var dynamicsWebApi = new vyDynamicswebapi({ useEntityNames: true }); dynamicsWebApi.retrieve(leadId, 'lead', ['fullname', 'subject']).then(function (record) { }) .catch(function (error) { }); var request = { collection: 'lead', key: leadId, select: ['fullname', 'subject'] }; dynamicsWebApi.retrieveRequest(request).then(function (record) { }) .catch(function (error) { }); ``` ```js var account = { name: 'account name', 'primarycontactid@odata.bind': 'contact(00000000-0000-0000-0000-000000000001)' } dynamicsWebApi.create(account, 'account').then(function(accountId)){ }).catch(function (error) { }); ``` ```js var collectionName = dynamicsWebApi.utility.getCollectionName('account'); ```