Microsoft Dynamics CRM 2016 Web API 放置请求清除值

Microsoft Dynamics CRM 2016 Web API Put request clears value

我正在尝试使用放置请求来更新 Dynamics CRM。当我 运行 以下 python 代码时,我收到 204 响应,但它没有更新值而是将其清除。例如,名字被更新为 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. 在请求中将 data = payload 设置为 json = payload。例如:

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

出了什么问题:

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

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

  3. 附加到请求中

我是怎么解决的:

  1. 我通过添加从 stack overflow question 中找到的以下代码,将我的程序设置为输出它进行的 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. 我阅读了关于请求方法的文档here which I found on this stack overflow question