2016-04-05 1 views
0

Я пытаюсь использовать запрос put для обновления 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 = "example[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 = payload набор для json = payload в запросе. например:

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

Что идет не так:

  1. Первоначальный вызов, который включал полезную нагрузку (независимо от того, если он был установлен в данных или JSON), получил ответ от HTTP/1.0 301 Moved Permanently. В этом ответе был заголовок с новым местоположением. Это место просто включало https:// в URL. Затем мой код отправил второй запрос на отправку, который перешел на правильный https-url, имел правильные параметры заголовка, но не включал полезную нагрузку. Это привело к тому, что мой запрос на размещение не включал значение для обновления, поэтому Microsoft Dynamics CRM установила значение в значение null.

  2. Microsoft Dynamics CRM требует, чтобы полезная нагрузка запроса запроса была отформатирована в json. После того, как я обновил ссылку на https://, и полезная нагрузка была включена, она была отформатирована как x-www-form-urlencoded. Это означает, что полезная нагрузка была добавлена ​​к запросу как value=WebApiUpdate. Это вызвало ответ HTTP/1.1 400 Bad Request. Изменение полезной нагрузки в формате json означает, что полезная нагрузка будет добавлена ​​к запросу как {"value": "WebApiUpdate"}.

Как я ее решил:

  1. Я поставил свою программу для вывода HTTP ставить называют это было сделать, добавив следующий код, который я нашел в этом 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