Как удалить записи с помощью веб-сервисов 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());
Другие вопросы по тегам