使用 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)
有谁知道如何使用 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)