Microsoft Dynamics CRM 2016 Web API Put请求清除值



我正在尝试使用put请求来更新Dynamics CRM。当我运行下面的python代码时,我得到了一个204响应,但它没有更新值,而是将其清除。例如,firstname被更新为null,而不是"WebApiUpdate"。

import adal
import json
import urllib2
import requests
endpoint = "https://login.microsoftonline.com/00000000-0000-0000-0000-000000000002"
username = "example@example.com"
password = "password"
resource_uri = "https://orgname.crm.dynamics.com"
token_response = adal.acquire_token_with_username_password(endpoint,username,password,resource= resource_uri)
print token_response['accessToken']


payload = { "value": "WebApiUpdate"}
url = "http://xxxxx.crm.dynamics.com/api/data/v8.0/contacts(00000000-0000-0000-0000-000000000001)/firstname"
headers = {"Authorization":"Bearer "+token_response['accessToken']}
r = requests.put(url,data=payload,headers=headers)
print r.content

解决方案:

  1. 将url设置为https://而不是http://
  2. 在请求中将CCD_ 3设置为CCD_。例如:

    r = requests.put(url,json=payload,headers=headers)
    

出了什么问题:

  1. 包含有效载荷的初始调用(不管它是设置为data还是json)收到了HTTP/1.0 301 Moved Permanently的响应。在这个响应中是一个具有新位置的标头。这个位置只是在url中包含了https://。然后,我的代码发出了第二个put请求,该请求指向正确的https url,具有正确的头参数,但不包括有效负载。这导致我的put请求不包括要更新的值,因此Microsoft Dynamics CRM将该值设置为null。

  2. Microsoft Dynamics CRM要求将put请求负载格式化为json。在我将链接更新为https://并包含有效载荷后,它被格式化为x-www-form-urlencoded。这意味着有效载荷被附加到请求中作为value=WebApiUpdate。这引起了HTTP/1.1 400 Bad Request的回复。将有效负载格式化为json意味着有效负载将作为{"value": "WebApiUpdate"}附加到请求中。

我是如何解决的:

  1. 我通过添加下面的代码将程序设置为输出它正在进行的http put调用,这些代码是我从这个堆栈溢出问题中找到的。然后我注意到有两个不完全相同的看跌期权,于是就从那里开始了。

    import logging
    try:
        import http.client as http_client
    except ImportError:
        # Python 2
        import httplib as http_client
    http_client.HTTPConnection.debuglevel = 1
    logging.basicConfig() 
    logging.getLogger().setLevel(logging.DEBUG)
    requests_log = logging.getLogger("requests.packages.urllib3")
    requests_log.setLevel(logging.DEBUG)
    requests_log.propagate = True
    
  2. 我在这里阅读了我在这个堆栈溢出问题上发现的请求方法的文档

最新更新