Dynamics365 ExportPdfTemplate&ExportWordTemplate两个Action调用的body构造

这两天在用ExportPdfTemplate做pdf导出功能时,遇到了如下问题InnerException : Microsoft.OData.ODataException: An unexpected 'StartArray' node was found when reading from the JSON reader. A 'PrimitiveValue' node was expected.

我的场景是使用power automate根据单据的状态变化触发,向特定用户发送带pdf附件的邮件通知,pdf附件是基于Word模版生成而来

主要是通过ExportPdfTemplate这个Action,在automate中一个http请求拿到base64的文件流后赋值给send mail操作的附件里

参考的是这篇文章,在构造body的时候忽略了SelectedRecords这个参数的格式,浪费了我很多时间去解决问题

如下是最初的错误body

javascript 复制代码
{
  "SelectedTemplate": {
    "documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342",
    "@odata.type": "Microsoft.Dynamics.CRM.documenttemplate"
  },
  "EntityTypeCode": 10629,
  "SelectedRecords": [
    "8b59ddeb-b00a-f011-bae3-000d3aa1971f"
  ]
}

SelectedRecords接受的是一个字符串,而我设置成了数组,正确的是下面这样

javascript 复制代码
{
  "SelectedTemplate": {
    "documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342",
    "@odata.type": "Microsoft.Dynamics.CRM.documenttemplate"
  },
  "EntityTypeCode": 10629,
  "SelectedRecords": "[\"8b59ddeb-b00a-f011-bae3-000d3aa1971f"\]"
}

下面是一段前端示例代码,在你登录D365的情况下,可以打开F12,在console中直接可以用,只需要把body中的EntityTypeCode,documenttemplateid, SelectedRecords中的参数替换成你的就行,可以用来测试

javascript 复制代码
(async function () {

    const url = "https://xx-dev.crm5.dynamics.com/api/data/v9.2/ExportPdfDocument"; // 替换组织域名

var body={
  "EntityTypeCode": 10629,
  "SelectedTemplate": {
    "@odata.type": "Microsoft.Dynamics.CRM.documenttemplate",
    "documenttemplateid": "5aac6ad6-af13-f011-998a-002248582342"
  },
  "SelectedRecords": "[\"{8b59ddeb-b00a-f011-bae3-000d3aa1971f}\"]"
}

    const response = await fetch(url, {
        method: "POST",
        headers: {
            "Content-Type": "application/json",
            "OData-MaxVersion": "4.0",
            "OData-Version": "4.0",
            "Accept": "application/json"
        },
        body: JSON.stringify(body)
    });

    if (!response.ok) {
        const errorText = await response.text();
        console.error("Error exporting PDF:", errorText);
    } else {
        const result = await response.json();
        console.log("PDF Exported:", result);
        // 可选:将结果中的 PDF 下载到本地
        const link = document.createElement('a');
        link.href = "data:application/pdf;base64," + result.PdfFile;
        link.download = "exported-document.pdf";
        link.click();
    }
})();

如下是后端C#代码中的代码示例,主要关注body的构造

cs 复制代码
 public void ExportPDF()
 {
     string actionParams = "{    " +
         "\"EntityTypeCode\": 106029,    " +
         "\"SelectedTemplate\": {        " +
             "\"@odata.type\": \"Microsoft.Dynamics.CRM.documenttemplate\",        " +
             "\"documenttemplateid\": \"eb6b70cf-542e-ed11-9daf-0017fa02473a\"    " +
         "},    " +
         "\"SelectedRecords\": \"[\"{72AFD26F-F337-ED11-9DAF-0017FA055BEE}\"]\"" +
         "}";

     var _service = new MSCRMService();

     string result = _service.CallCrmAction("", "", "ExportPdfDocument", actionParams);

 }

如下是power automate中的的body的构造参考

相关推荐
Vic.Tang7 个月前
Power Automate 设置流Owner不生效的bug
flow··power automate·owner
李少兄1 年前
poi-tl:基于Apache POI的轻量级Word模板引擎
java·word模版
→_→BéLieve1 年前
Java把列表数据导出为PDF文件,同时加上PDF水印
java·pdf·pdf导出·pdf添加水印·itextpdf外部字体引入
Lucky Monkey .1 年前
微软 Power Apps Canvas App 画布应用将上传的附件转化为base64编码操作
数据库·microsoft·crm·dynamic·power apps·power automate·powerplatform
Lucky Monkey .1 年前
微软 Power Platform 零基础 Power Pages 网页搭建高阶实际案例实践(四)
微软·power platform·power pages·power apps·power automate