Как удалить записи с помощью веб-сервисов Odata Dynamics NAV 2017
Я разработал php-приложение, которое подключается к веб-службам OData Microsoft Dynamics NAV 2017. Я могу читать (GET) и создавать (POST) без проблем, но для удаления я получаю ошибку 405, Microsoft говорит, что можно удалить:
https://msdn.microsoft.com/es-es/library/dd355398(v=nav.90).aspx
https://msdn.microsoft.com/en-us/library/dn182582(v=nav.90).aspx
Я проверяю, что страница в Dynamics NAV с правильным свойством InsertAllowed, ModifyAllowed или DeleteAllowed, имеет значение Да, и у меня есть разрешения на удаление
После попытки с почтальоном получите ту же ошибку:
Кто-нибудь может мне помочь? Спасибо
1 ответ
Наконец я нашел решение!! Я пишу себе, чтобы помочь другому, кто с такой же проблемой:
Вам нужно только добавить идентификатор в URL запроса, в моем случае - идентификатор таблицы клиентов ('/Customer(No='.$identifier.') ').
Это пример кода на PHP с клиентом и таблицей Dynamics NAV:
$client = new GuzzleHttpClient();
$uri=env('HTTP_URIBASE', '');
$apiRequest = $client->request('DELETE', $uri.'/Customer(No='.$identifier.')',[
'auth' => [env('HTTP_USERNAME', 'usuari'),env('HTTP_PASSWORD', ''), 'ntlm' ],
'headers' => ['Content-Type' => 'application/json',
'Accept' => 'application/json']
]);
$content = json_decode($apiRequest->getBody()->getContents());
для обновлений (PATCH) я должен сначала прочитать etag reccord (@ odata.etag) и добавить заголовки (значениеIf-Match) для обновления:
$client = new GuzzleHttpClient();
$uri=env('HTTP_URIBASE', '');
// get the recordset of the customer
$apiRequest = $client->request('GET', $uri.'/Customer(No='.$identifier.')',[
'auth' => [env('HTTP_USERNAME', 'usuari'),env('HTTP_PASSWORD', ''), 'ntlm' ]
]);
$content = json_decode($apiRequest->getBody()->getContents());
$etag= $content->{'@odata.etag'};
// update description of the customer
$apiRequest = $client->request('PATCH', $uri.'/Customer(No='.$identifier.')',[
'auth' => [env('HTTP_USERNAME', 'usuari'),env('HTTP_PASSWORD', ''), 'ntlm' ],
'headers' => ['Content-Type' => 'application/json',
'Accept' => 'application/json',
'If-Match' =>$etag ],
'body' => '{"Name":"'.$missatge.'"}'
]);
$content = json_decode($apiRequest->getBody()->getContents());