0

我正在尝试使用 put 请求来更新 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
4

1 回答 1

1

解决方案:

  1. 将 url 设置https://http://
  2. data = payloadjson = payload请求中设置。前任:

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

出了什么问题:

  1. 最初的调用,包括有效载荷(不管它是设置为 data 还是 json),收到的响应为HTTP/1.0 301 Moved Permanently. 在此响应中是带有新位置的标头。该位置仅包含https://在 url 中。然后我的代码发送了第二个 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. 我在这里阅读了关于请求方法的文档,我在这个堆栈溢出问题中找到了

于 2016-04-06T13:56:16.803 回答