2016-04-05 21 views
0

Dynamics CRMを更新するためにput要求を使用しようとしています。次のPythonコードを実行すると、204の応答が返されますが、値を更新する代わりに、応答がクリアされます。たとえば、firstnameは "WebApiUpdate"の代わりにnullに更新されます。Microsoft Dynamics CRM 2016 Web API Put要求がクリアされます。

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

で見つかったリクエストメソッドhere上のドキュメントを参照してください。連絡先にプラグインまたは同期ワークフローが登録されていますか?調査の別の手段:システムレベルで監査をオンにし、連絡先の監査をオンにして、要求を再発行してから、監査ログでレコードを調べます。それは、 "WebApiUpdate"が記録に残した後、一掃されたことを示していますか? – Polshgiant

答えて

1

ソリューション:

  1. https://代わりのhttp://
  2. するURLを設定し、要求にjson = payloaddata = payloadを設定します。例:間違って何が起こっていたか

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

:ペイロードを含ま

  1. 最初の呼び出しは、(関係なくデータやJSONに設定されていた場合の)、応答を受信しHTTP/1.0 301 Moved Permanentlyです。この応答では、新しい場所のヘッダーがありました。この場所には、単にURLにhttps://が含まれています。次に、私のコードは正しいhttps urlに行き、正しいヘッダーパラメーターを持っていてペイロードを含んでいない2番目のput要求を送信しました。これにより、Microsoft Dynamics CRMが値をnullに設定するように、put要求に更新する値を含めないようにしました。

  2. Microsoft Dynamics CRMでは、put要求のペイロードをjsonでフォーマットする必要があります。リンクをに更新し、ペイロードが含まれていた場合は、x-www-form-urlencodedという形式になっています。これは、ペイロードが要求にvalue=WebApiUpdateとして追加されたことを意味します。これにより、HTTP/1.1 400 Bad Requestの返信が発生しました。ペイロードをjsonとしてフォーマットするように変更すると、ペイロードは{"value": "WebApiUpdate"}という要求に追加されます。私はそれを解決する方法

  1. 私は、http私はこのstack overflow questionから見つかった以下のコードを追加することによって、それが作っていた呼ん置く出力に私のプログラムを設定します。私は、2つの同一ではないプットコールがあり、そこから出てきたことに気付きました。

    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. 私は、要求が私には正常に見えるのはこのstack overflow question

関連する問題