使用 Rest API 在 MS Dynamics 中添加附件

Add attachment to lead in MS Dynamics using Rest API

有谁知道如何使用 Rest API 将附件上传到 MS Dynamics 中的现有领导实体? 我尝试使用 python 代码来遵循此 post,但收到一条错误消息

<响应 [400]> b'{"error":{"code":"0x0","message":"验证输入参数时发生错误:System.ArgumentException:流不可读。\r\n 在 [=28= ..ctor(Stream stream, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize, Boolean leaveOpen)\r\n at System.IO.StreamReader..ctor(Stream stream, Encoding encoding)\r\n at Microsoft.OData.JsonLight.ODataJsonLightInputContext.CreateTextReader(流消息流,编码编码)\r\n 在 Microsoft.OData.JsonLight.ODataJsonLightInputContext..ctor(ODataMessageInfo messageInfo,ODataMessageReaderSettings messageReaderSettings)\r\n 在 Microsoft.OData.Json.ODataJsonFormat.CreateInputContext(ODataMessageInfo messageInfo,ODataMessageReaderSettings messageReaderSettings)\r\n 在 Microsoft.OData.ODataMessageReader.ReadFromInput[T](Func`2 readFunc, ODataPayloadKind[] payloadKinds)\r\n 在 System.Web.OData.Formatter.Deserialization.ODataResourceDeserializer.Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)\r\n 在System.Web.OData.Formatter.ODataMediaTypeFormatter.ReadFromStream(Type类型, Stream readStream, HttpContent内容, IFormatterLogger formatterLogger)"}}'

Python代码

def upload_file_to_entity(url, attachment_data, version, file_name, entity_id, auth_token):
file_upload_url = f'{url}/api/data/{version}/annotations'

header_values = {
    'Authorization': auth_token,
    'Content-Type': 'application/json'
}

file_body = {
    'subject': 'Attachment Upload',
    'filename': file_name,
    'objectid_lead@odata.bind': f'/leads({entity_id})',
    'documentbody': attachment_data
}

file_upload_res = requests.post(file_upload_url, headers=header_values, data=file_body)
print(file_upload_res)
print(file_upload_res.content)


attachment_object = s3.get_object(Bucket=bucket_name, Key=attachment_file_location)
                attachment_data = attachment_object.get('Body').read()
                attachment_data_base64 = base64.b64encode(attachment_data) 
                base64_string = attachment_data_base64.decode('utf-8')



upload_file_to_entity(f'https://{org}.crm.dynamics.com',base64_string,'v9.2',file_name,lead_id,prm_auth_token)

重要说明:注释 实体中的 documentbody 属性是文本,因此您应该放置 Base64 编码值,例如,如果您想要存储包含 The quick brown fox jumps over the lazy dog 的文本文件,Base64 值为 VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==

您可以使用我的工具 Dataverse REST Builder 生成请求,可作为托管解决方案或 XrmToolBox 工具使用,在存储库中有指向视频和博客的链接 post 解释了如何使用它.

创建请求并测试它是否在 Dataverse REST Builder 中按预期工作。

我的工具不提供 Python 语法,但您可以将集合导出到 Postman。 在 Postman 中导入后,您可以从请求中生成 Python 代码(您可以在右侧菜单中看到 /> 按钮)。

请记住,您需要提供 Bearer Token 才能通过 Web API 执行请求(可能您已经在这样做了,因为您收到的错误发生在身份验证通过后)

好的,我成功了。

除了请求对象中的 json 参数外,一切都正确。正确的要求如下

file_upload_res = requests.post(file_upload_url, headers=header_values, json=file_body)