I try to writing code to send data to create incident to Dynamics 365 with Python Requests post() Method but I have issue. I use python 3.6, I use this code but it give me this error
{'error': {'code': '', 'message': "The requested resource does not support http method 'POST'."}}
the code:
import requests
import json
#set these values to retrieve the oauth token
crmorg = 'https://xxxxxx.crm4.dynamics.com/' #base url for crm org
clientid = 'xxxxxxxxxxx' #application client id
tokenendpoint = 'https://login.microsoftonline.com/xxxxxxxxxx/oauth2/token' #oauth token endpoint
secret = 'xxxxxxxxxxxxxxxxx'
#set these values to query your crm data
crmwebapi = 'https://xxxxxx.api.crm4.dynamics.com/api/data/v9.1/Incident' #full path to web api endpoint
#crmwebapiquery = 'contacts?$select=fullname,contactid' #web api query (include leading /)
#build the authorization token request
tokenpost = {
'client_id':clientid,
'resource':crmorg,
'client_secret' : secret,
'grant_type':'client_credentials',
}
#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')
#if we have an accesstoken
if(accesstoken!=''):
#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'
}
incidentdata={
"title": "test",
"customerid_account": "xxxxxxxxxxxxxxx",
"forte_casetypeid": "xxxxxxxxxxxxx",
"forte_casecategoryid": "xxxxxxxxxxxxxxxxxxx",
"primarycontactid": "xxxxxxxxxxxxxxxxx",
"entitlementid": "xxxxxxxxxxxxxxxxxxxxx",
}
#make the crm request
crmres = requests.post(crmwebapi, headers=crmrequestheaders, data=json.dumps(incidentdata))
try:
#get the response json
crmresults = crmres.json()
print(crmresults)
except KeyError:
#handle any missing key errors
print('Could not parse CRM results')
Let me suggest few things to fix and test the code.
Both of the below endpoints should work, but incidents
is the right entity name.
crmwebapi = 'https://xxxxxx.api.crm4.dynamics.com/api/data/v9.1/incidents'
crmwebapi = 'https://xxxxxx.crm4.dynamics.com/api/data/v9.1/incidents'
Prefer
headers, as they are only needed for GET
requestsTry the below headers.
crmrequestheaders = {
'Authorization': 'Bearer ' + accesstoken,
'OData-MaxVersion': '4.0',
'OData-Version': '4.0',
'Accept': 'application/json',
'Content-Type': 'application/json; charset=utf-8',
}
@odata.bind
Check below and adjust accordingly.
incidentdata={
"title": "test",
"customerid_account@odata.bind": "/accounts(xxxxxxxxxxxxxxx)",
"forte_casetypeid": "xxxxxxxxxxxxx",
"forte_casecategoryid": "xxxxxxxxxxxxxxxxxxx",
"primarycontactid@odata.bind": "/contacts(xxxxxxxxxxxxxxxxx)",
"entitlementid@odata.bind": "/entitlements(xxxxxxxxxxxxxxxxxxxxx)",
}