Python Пакет Dynamics 365 для чтения и записи данных - PullRequest
0 голосов
/ 27 мая 2020

Нам удалось подключиться к нашему облачному экземпляру Dynamics 365 с авторизацией по токену. Однако мы надеялись найти такой пакет, как « pydynamics ».

Пакет «https://libraries.io/pypi/dynamics365crm-python» кажется более новым, но, похоже, он может обрабатывать только стандартные объекты, а не настраиваемые объекты.

Наше текущее решение работает с REST только.

import requests
import json

#set these values to retrieve the oauth token
crmorg = 'https://org.crm4.dynamics.com' #base url for crm org
clientid = '<id>' #application client id
client_secret = '<secret>'
username = 'dynamics-api@org.com' #username
userpassword = 'pw' #password
tokenendpoint = 'https://login.microsoftonline.com/bb23defa-be1d-4137-969b-324f8468f15a/oauth2/token' #oauth token endpoint
authorizationendpoint = 'https://login.microsoftonline.com/bb23defa-be1d-4137-969b-324f8468f15a/oauth2/authorize'

#build the authorization token request
tokenpost = {
    'client_id':clientid,
    'resource':crmorg,
    'client_secret':client_secret,
    'username':username,
    'password':userpassword,
    'grant_type':'password',
    'oauthUrl':authorizationendpoint
}

#make the token request
tokenres = requests.post(tokenendpoint, data=tokenpost)

#set accesstoken variable to empty string
accesstoken = ''

#extract the access token
try:
    accesstoken = tokenres.json()['access_token']
except(KeyError):
    #handle any missing key errors
    print('Could not get access token')

#set these values to query your crm data
crmwebapi = 'https://<org>.crm4.dynamics.com/api/data/v9.1' #full path to web api endpoint
crmwebapiquery = '/new_households' #web api query (include leading /)


#prepare the crm request headers
crmrequestheaders = {
    'Authorization': 'Bearer ' + accesstoken,
    'OData-MaxVersion': '4.0',
    'OData-Version': '4.0',
    'Accept': 'application/json',
    'Content-Type': 'application/json; charset=utf-8',
    'Prefer': 'odata.maxpagesize=500',
    'Prefer': 'odata.include-annotations=OData.Community.Display.V1.FormattedValue'
}

#make the crm request
crmres = requests.get(crmwebapi+crmwebapiquery, headers=crmrequestheaders)

try:
    #get the response json
    crmresults = crmres.json()['value'][0]

    #loop through it
    for key,value in crmresults.items():
        print (key, value)

except KeyError:
    #handle any missing key errors
    print('Could not parse CRM results')

Кто-нибудь знает пакет?

1 Ответ

0 голосов
/ 28 мая 2020

REST API - это путь к go.

Мы используем их каждый раз с JavaScript и разделяем ответ как Json.

Ниже приведен пример вызова, который я выполняю в crm вы увидите, что ответ был преобразован в Json

Не беспокойтесь о деталях, для вас важна эта строка var results = JSON.parse(this.response);

var req = new XMLHttpRequest();
req.open("GET", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/accounts?$select=accountcategorycode,accountclassificationcode,accountid,accountnumber,accountratingcode", false);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.setRequestHeader("Prefer", "odata.include-annotations=\"*\",odata.maxpagesize=10");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 200) {
            var results = JSON.parse(this.response);
            for (var i = 0; i < results.value.length; i++) {
                var accountcategorycode = results.value[i]["accountcategorycode"];
                var accountcategorycode_formatted = results.value[i]["accountcategorycode@OData.Community.Display.V1.FormattedValue"];
                var accountclassificationcode = results.value[i]["accountclassificationcode"];
                var accountclassificationcode_formatted = results.value[i]["accountclassificationcode@OData.Community.Display.V1.FormattedValue"];
                var accountid = results.value[i]["accountid"];
                var accountnumber = results.value[i]["accountnumber"];
                var accountratingcode = results.value[i]["accountratingcode"];
                var accountratingcode_formatted = results.value[i]["accountratingcode@OData.Community.Display.V1.FormattedValue"];
            }
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send();
...