2016-04-05 100 views
0

我試圖使用放入請求來更新Dynamics CRM。當我運行下面的python代碼時,我得到了一個204響應,但不是更新一個值就清除它。例如firstname會更新爲null而不是「WebApiUpdate」。Microsoft Dynamics CRM 2016 Web API放置請求清除值

import adal 
import json 
import urllib2 
import requests 

endpoint = "https://login.microsoftonline.com/00000000-0000-0000-0000-000000000002" 
username = "[email protected]" 
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 
+2

該請求看起來好像沒什麼問題發現的文檔。您有沒有針對聯繫人註冊的插件或同步工作流程?調查的另一個途徑:在系統級開啓審計,然後開啓審計聯繫,重新發出請求,然後檢查審計日誌以查看記錄。是否顯示「WebApiUpdate」已將其記錄到記錄中,然後被清除? – Polshgiant

回答

1

解決方案:

  1. 設置URL爲的https://代替http://
  2. 在請求設定data = payloadjson = payload。例如:

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

什麼打算錯:

  1. 初始呼叫,其中包括有效載荷(不管它是否被設置爲數據或JSON)的,接收到響應的HTTP/1.0 301 Moved Permanently。在這個迴應是一個標題與新的位置。該位置只包含https://的網址。然後,我的代碼發送了第二個放入請求,轉到正確的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調用它通過添加下面的代碼,我從這個stack overflow question發現決策。然後我注意到有兩個不相同的電話,然後從那裏開始。

    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這是我對這個stack overflow question

相關問題