You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python 3写入Dynamics CRM 2013数据?已实现读取功能

解决方案:Dynamics CRM 2013 数据写入实现(基于OrganizationData.svc)

明确说明:Dynamics CRM 2013的OrganizationData.svc(OData 2.0端点)完全支持数据写入,包括创建、更新、删除操作,和读取使用相同的NTLM认证方式即可,无需额外配置。

核心操作步骤

1. 准备请求头

除NTLM认证所需配置外,写入操作需额外指定以下请求头:

  • Content-Type: application/json; charset=utf-8
  • Accept: application/json
  • X-HTTP-Method: 更新/删除操作时需要,创建操作无需设置

2. 数据创建(POST请求)

以创建联系人(Contact实体)为例,注意OrganizationData.svc的实体集为复数形式(Contacts):

import requests
from requests_ntlm2 import HttpNtlmAuth

# 基础配置
crm_url = "http://your-crm-server/XRMServices/2011/OrganizationData.svc"
username = "DOMAIN\\user"
password = "your-password"

# 待创建的实体数据(字段为OrganizationData.svc逻辑名称,而非显示名)
contact_data = {
    "FirstName": "John",
    "LastName": "Doe",
    "EmailAddress1": "john.doe@example.com",
    "Telephone1": "1234567890"
}

# 构建请求
create_url = f"{crm_url}/Contacts"
headers = {
    "Content-Type": "application/json; charset=utf-8",
    "Accept": "application/json"
}

# 发送请求(建议先在测试环境验证)
response = requests.post(
    create_url,
    json=contact_data,
    auth=HttpNtlmAuth(username, password),
    headers=headers
)

# 结果验证
if response.status_code == 201:
    print("创建成功,返回数据:", response.json())
else:
    print(f"创建失败,状态码:{response.status_code},错误信息:{response.text}")

3. 数据更新(MERGE/PUT请求)

更新需指定实体的__metadata(包含uri),或直接拼接实体ID到URL:

# 假设已知联系人GUID为contact_id
contact_id = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
update_url = f"{crm_url}/Contacts(guid'{contact_id}')"

# 待更新字段
update_data = {
    "FirstName": "John Updated",
    "__metadata": {"uri": update_url}  # 必须包含该元数据字段
}

headers["X-HTTP-Method"] = "MERGE"  # MERGE仅更新指定字段,PUT会覆盖所有字段

response = requests.post(
    update_url,
    json=update_data,
    auth=HttpNtlmAuth(username, password),
    headers=headers
)

if response.status_code == 204:
    print("更新成功")
else:
    print(f"更新失败,状态码:{response.status_code},错误信息:{response.text}")

4. 数据删除(DELETE请求)

delete_url = f"{crm_url}/Contacts(guid'{contact_id}')"
headers["X-HTTP-Method"] = "DELETE"

response = requests.post(
    delete_url,
    auth=HttpNtlmAuth(username, password),
    headers=headers
)

if response.status_code == 204:
    print("删除成功")
else:
    print(f"删除失败,状态码:{response.status_code},错误信息:{response.text}")

生产环境注意事项

  • 先在测试环境验证:复刻生产环境的CRM版本、权限配置,完整测试所有写入逻辑,确保实体集名称、字段逻辑名称正确,账号权限足够。
  • 权限检查:确认认证账号拥有对应实体的创建/更新/删除权限(通过CRM安全角色配置)。
  • 字段逻辑名称:OrganizationData.svc使用实体和字段的逻辑名称,而非显示名,可通过CRM自定义工具(设置→自定义→自定义系统→实体→字段)查看。
  • 错误处理:生产环境需捕获网络异常、权限错误、字段验证错误等情况,避免数据异常。

内容的提问来源于stack exchange,提问作者Admir Ljubijankić

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:05:20