Создание новых сущностей из PHP с помощью веб-служб Odata в Microsoft Dynamics NAV 2016
В рамках интеграционного проекта мне нужен веб-сайт PHP, чтобы можно было выполнять чтение и запись в службы Microsoft Data NAV 2016 Odata.
Я обнаружил, что получить список существующих клиентов из PHP так же просто, как это:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<CompanyName>\')/customer');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'USERNAME:PASSWORD');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: Keep-Alive',
'Accept: application/json',
'Content-Type: application/json; charset=utf-8',
"Accept: */*"
]);
$response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT);
// Close handle
curl_close($ch);
$response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT);
// Close handle
curl_close($ch);
Я также обнаружил, что выбор одного клиента из PHP так же прост:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<CompanyName>\')/customer(\'<Id>\')');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'USERNAME:PASSWORD');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: Keep-Alive',
'Accept: application/json',
'Content-Type: application/json; charset=utf-8',
"Accept: */*"
]);
$response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT);
// Close handle
curl_close($ch);
Все идет нормально. Теперь моя проблема в том, что я пытаюсь понять, как создать новых клиентов.
Я попробовал это:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<Company>\')/customer');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'Name' => 'WebServiceTestCustomer',
'Address' => 'TestCustomerStreet 55',
'Credit_Limit_LCY' => 0
]);
curl_setopt($ch, CURLOPT_USERPWD, 'USERNAME:PASSWORD');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: Keep-Alive',
'Accept: application/json',
'Content-Type: application/json; charset=utf-8',
"Accept: */*"
]);
$response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT);
// Close handle
curl_close($ch);
Это не сработало.
Поскольку я подумал, что может не хватать некоторых полей, я также попробовал это:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://<Server>:<WebServicePort>/<ServerInstance>/OData/Company(\'<Company>\')/customer');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'Name' => 'WebServiceTestCustomer',
'Phone_No' => '016666666',
'Post_Code' => '3000',
'Country_Region_Code' => 'BE',
'Currency_Code' => 'EUR',
'Language_Code' => 'NL',
'Customer_Posting_Group' => 'BINNENLAND',
'Gen_Bus_Posting_Group' => 'BINNENLAND',
'VAT_Bus_Posting_Group' => 'BINNENLAND',
'Payment_Terms_Code' => '14 DAGEN',
'Reminder_Terms_Code' => 'NEDERLANDS'
]);
curl_setopt($ch, CURLOPT_USERPWD, 'USERNAME:PASSWORD');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Connection: Keep-Alive',
'Accept: application/json',
'Content-Type: application/json; charset=utf-8',
"Accept: */*"
]);
$response = json_decode(curl_exec($ch), TRUE);
echo json_encode($response, JSON_PRETTY_PRINT);
// Close handle
curl_close($ch);
Это тоже не сработало.
Независимо от того, что я установил в качестве полей POST, я получаю это совершенно бесполезное сообщение об ошибке:
{
"odata.error": {
"code": "",
"message": {
"lang": "en-US",
"value": "An error occurred while processing this request."
}
}
}
К сожалению, документация тоже не очень полезна.
У кого-нибудь здесь есть подсказка, как это исправить?
1 ответ
Пройдя через бесчисленные ресурсы и ударившись головой о стену, я, наконец, сумел создать нового клиента.
Я сделал две ошибки нуба:
- Я использовал неверный источник данных для своего веб-сервиса: я использовал Object ID 22 (
Customer List
) вместо идентификатора объекта 21 (Customer Card
). - Данные POST должны быть в кодировке Json. Это не должен быть массив или строка запроса. Итак, замена
curl_setopt($ch, CURLOPT_POSTFIELDS, [...]);
сcurl_setopt($ch, CURLOPT_POSTFIELDS, json_encode[...]));
сделал трюк.
Я надеюсь, что эта информация поможет другим сэкономить время.