我正在尝试使用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
解决方案:
- 将url设置为
https://
而不是http://
-
在请求中将CCD_ 3设置为CCD_。例如:
r = requests.put(url,json=payload,headers=headers)
出了什么问题:
-
包含有效载荷的初始调用(不管它是设置为data还是json)收到了
HTTP/1.0 301 Moved Permanently
的响应。在这个响应中是一个具有新位置的标头。这个位置只是在url中包含了https://
。然后,我的代码发出了第二个put请求,该请求指向正确的https url,具有正确的头参数,但不包括有效负载。这导致我的put请求不包括要更新的值,因此Microsoft Dynamics CRM将该值设置为null。 -
Microsoft Dynamics CRM要求将put请求负载格式化为json。在我将链接更新为
https://
并包含有效载荷后,它被格式化为x-www-form-urlencoded
。这意味着有效载荷被附加到请求中作为value=WebApiUpdate
。这引起了HTTP/1.1 400 Bad Request
的回复。将有效负载格式化为json意味着有效负载将作为{"value": "WebApiUpdate"}
附加到请求中。
我是如何解决的:
-
我通过添加下面的代码将程序设置为输出它正在进行的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
-
我在这里阅读了我在这个堆栈溢出问题上发现的请求方法的文档