У меня есть демонстрационный клиент в Dynamics Business Central, и я работаю с OData, чтобы создавать примеры CRUD для сущности компании, а после этого - для счетов-фактур, предложений, заказов, продуктов и других. Я загрузил файл метаданных, используя этот URL-вызов: https://api.businesscentral.dynamics.com/v2.0/ {tenantid} / Production / ODataV4 / $ metadata
Маркер доступа предоставляется с использованием IConfidentialClientApplication и AuthenticationResult. Токен правильный, и я могу получить список компаний из Business Central при его использовании в почтальоне.
Я передаю токен при каждом вызове оддаты следующим образом:
myNAV.NAV bcContext = new myNAV.NAV(new Uri("https://api.businesscentral.dynamics.com/v1.0/api/beta/"));
bcContext.SendingRequest2 += new EventHandler<SendingRequest2EventArgs>((sender, e) => oDataExtension.OnSendingRequest(sender, e, crmAuthResult.AccessToken));
public class oDataExtension
{
public const string POSTLocationHeaderException = "The response to this POST request did not contain a 'location' header. That is not supported by this client.";
public static void OnSendingRequest(object sender, SendingRequest2EventArgs e, string token)
{
// Add an Authorization header that contains an OAuth WRAP access token to the request.
e.RequestMessage.SetHeader("Authorization", token);
//if (e.RequestMessage.Method.Equals("PUT", System.StringComparison.InvariantCultureIgnoreCase))
//{
// //e.RequestMessage.Method = "PATCH";
//}
if (!e.RequestMessage.Method.Equals("POST", System.StringComparison.InvariantCultureIgnoreCase) && !e.RequestMessage.Method.Equals("PATCH", System.StringComparison.InvariantCultureIgnoreCase))
{
e.RequestMessage.SetHeader("Prefer", "odata.include-annotations=\"*\"");
}
e.RequestMessage.SetHeader("accept-language", "en-US,en;q=0.9,hr;q=0.8");
}
}
Это код моего вызова OData компании GET:
List<myNAV.Company> customQuotes = (await ((DataServiceQuery<myNAV.Company>)bcContext.Company).ExecuteAsync()).ToList();
URL, сгенерированный кодом, выглядит следующим образом: https://api.businesscentral.dynamics.com/v1.0/api/beta/company
, но правильный URL должен выглядеть следующим образом: https://api.businesscentral.dynamics.com/v1.0/api/beta/companies
Почтальон возвращает ошибку 404 с этим URL: https://api.businesscentral.dynamics.com/v1.0/api/beta/company, но тот же вызов в DataServiceQuery возвращает ошибку 401, учетные данные неверны.
После получения файла метаданных из другого URL-адреса (https://api.businesscentral.dynamics.com/v1.0/api/beta $ metadata #) запрос генерирует правильный URL-адрес, но я все еще получаю ошибку что я использую неверные учетные данные, но когда я использую URL и токен доступа в почтальоне, он возвращает 200 Success с правильными значениями компании.