как я могу использовать функцию CREATE в веб-сервисе мыла в Navision в PHP?

Здесь вы можете просмотреть документацию. Это на С#. Я попытался сделать рабочий пример с использованием PHP. Мне удалось выполнить функции Read & ReadMultiple в PHP. Это моя попытка:

   require ("./NTLMSoapClient.php");
    $client = new NTLMSoapClient(null, array(
        'cache_wsdl' => WSDL_CACHE_NONE,
        'trace' => true,
        'location' => "http://83.166.204.26:7147/TEST/WS/Harmont%20Blaine_TEST/Page/WebItem",
        'uri' => "urn:microsoft-dynamics-schemas/page/webitem",

    ));
    $client->user = "xxxxxx";
    $client->password = "xxxxxxxxx";
 try{

    $resp = $client->Create(new SoapVar('555554', XSD_STRING, null, null, 'ns1:No' ));
    echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
}catch(SoapFault $sf){
    //echo "REQUEST:\n" . htmlentities($client->__getLastRequest()) . "\n";
    print '<pre>';
    print_r($sf); 
    print '</pre>'; 
}
print '<pre>';var_dump($resp);  print '</pre>';

По какой-то причине он возвращает мне NULL. Любая идея, почему не работает?


person Jozsef Naghi    schedule 27.11.2014    source источник


Ответы (2)


Фредди Кристиансен сделал замечательную серию сообщений в блоге с подробным объяснением того, как подключаться к веб-сервисам Nav из разных сред.

Первая часть здесь: Подключение к веб-сервисам NAV из…

Вторая часть: Подключение к веб-сервисам NAV из PHP

Клиент может получить ответ NULL по нескольким причинам. Первая из них - клиентское приложение не может аутентифицироваться на веб-сервисе. Это может произойти, если на стороне сервера вместо NTLM используется протокол SPNEGO. Вам нужно установить ключ «ServicesUseNTLMAuthentication» в CustomSettings.config, как описал Фредди в первом из своих сообщений.

Если вы можете прочитать данные из сервиса, но не можете создать запись, это означает, что запрос успешно проходит аутентификацию, и проблема, скорее всего, в формате SOAP-сообщения.

Это то, что Nav ожидает получить в запросе на создание

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <Create xmlns="urn:microsoft-dynamics-schemas/page/customer">
            <Customer>
                <No>555554</No>
                <Name>NewCustomer</Name>
            </Customer>
        </Create>
    </soap:Body>
</soap:Envelope>

Чтобы добиться такого результата, вы можете заменить стандартную оболочку потока HTTP на обертку NTLMStream (см. пост «Подключение к веб-сервисам NAV из PHP» выше.

Теперь это все, что вам нужно сделать, чтобы прочитать запись клиента:

$client = new NTLMSoapClient("http://192.168.0.101:7047/DynamicsNAV71/WS/".rawurlencode($company)."/Page/Customer");
$resp = $client -> Read(array('No' => '10000'));

Создание новых записей также становится намного проще:

$client = new NTLMSoapClient("http://192.168.0.101:7047/DynamicsNAV71/WS/".rawurlencode($company)."/Page/Customer");

class CustomerWrapper
{
    public $Customer;
}

$cw = new CustomerWrapper;
$cw -> Customer -> No = "555554";
$cw -> Customer -> Name = "NewCustomerName";
$cw -> Customer -> E_Mail = "[email protected]";
$resp = $client -> Create($customer);
person Alexander Drogin    schedule 27.11.2014
comment
Я использовал эту ссылку: code.google.com/p/php -ews/source/browse/NTLMSoapClient.php. Мне удалось прочитать данные, но не создать данные. - person Jozsef Naghi; 28.11.2014
comment
Я не понимаю, куда мне добавить эту строку кода: ‹add key=WebServicesUseNTLMAuthentication value=true›‹/add› . У меня нет доступа к серверу, только к клиенту - person Jozsef Naghi; 28.11.2014

ЭТО решение:

$resp = $client->Create(new SoapVar('5555195', XSD_STRING, null, null, 'ns1:WebItem' ));

Мне нужно изменить Нет на WebItem.

глянь сюда:

<xsd:element name="Create">
<xsd:complexType>
<xsd:sequence>
<xsd:element minOccurs="1" maxOccurs="1" name="WebItem" type="tns:WebItem"/></xsd:sequence></xsd:complexType>
</xsd:element>
person Jozsef Naghi    schedule 28.11.2014