【问题标题】:How to Consume Nav Dynamics Soap Webservice in php or jquery?如何在 php 或 jquery 中使用 Nav Dynamics Soap Webservice?
【发布时间】:2019-12-05 08:21:01
【问题描述】:

我想通过 PHP 或 jquery 使用 Navision 2016 肥皂网络服务。 我试过这个解决方案PHP with Dynamics NAV webservices

我有以下soap PHP代码:

<?php
if (extension_loaded('soap'))
{
    // Request parameters :
    // Exemple is a Nav Code unit GetSalesPrices, method GetPrice(CodPCustomerNo, CodPItemNo)
    $NavUsername = "superUser";
    $NavAccessKey = "passworddrowssap";
    $CodeunitMethod = "CallMethod";
    $params = array(
        "employeeNo" => "CUSTOMER_1",
        "leaveType" => "ITEM_1",
    );
    // SOAP request header
    $url = "http://DESKTOP-H5GFAKH:7047/DynamicsNAV100/WS/MyCompany/Codeunit/webportals";

    $options = array(
        'authentication' => SOAP_AUTHENTICATION_BASIC,
        'login' => $NavUsername,
        'password' => $NavAccessKey,
        'trace' => 1,
        'exception' => 0,
    );
    try
    {
        $client = new SoapClient(trim($url), $options);

        $soap_response = $client->__soapCall($CodeunitMethod, array('parameters' => $params));
        echo "SOAP REQUEST SUCESS :";
        var_dump($soap_response);
    }
    catch (SoapFault $soapFault)
    {
        echo "SOAP REQUEST FAILED :<br>";
        var_dump($soapFault);
        echo "Request :<br>" . htmlentities($soap_client->__getLastRequest()) . "<br>";
        echo "Response :<br>" . htmlentities($soap_client->__getLastResponse()) . "<br>";
    }
}
else
{
    echo "Php SOAP extention is not available. Please enable/install it to handle SOAP communication.";
}
?>

这样我得到:

SOAP-ERROR:解析 WSDL:无法从 'http://DESKTOP-H5GFAKH:7047/DynamicsNAV100/WS/MyCompany/Codeunit/webportals' : 加载外部实体失败

【问题讨论】:

    标签: php jquery web-services soap navision


    【解决方案1】:

    对于初学者,您可以使用 POSTMAN,并且可以获得您应该使用的代码。话虽如此,请参阅下面的代码。您不必使用 SoapClient,只需在 PHP 中使用 cURL。确保在 Navision 中使用 Basic Auth 身份验证。下面的示例是向 NAV 请求从 NAV 列表中获取数据

    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://URL:PORT/WebService/WS/COMPANY%20NAME/Page/WebService",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "GET",
        CURLOPT_POSTFIELDS =>"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Envelope xmlns=\"http://schemas.xmlsoap.org/soap/envelope/\">\n<Body>\n<Read xmlns=\"urn:microsoft-dynamics-schemas/page/WebService\">\n<No>" .$entry_no. "</No>\n</Read>\n</Body>\n</Envelope>",
        CURLOPT_HTTPHEADER => array(
            "Content-Type: text/xml; charset=utf-8",
            "SoapAction: urn:microsoft-dynamics-schemas/page/WebService",
            "Authorization: Basic " .base64_encode('username:password'). ""
        ),
    ));
    $response = curl_exec($curl);
    $err = curl_error($curl);
    
    $xml = simplexml_load_string($response, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
    $xml->registerXPathNamespace('soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
    $xml->registerXPathNamespace('xmlns', 'urn:microsoft-dynamics-schemas/page/webservice');
    $xmlinfo = $xml->xpath('Soap:Body');
    

    来自 Chrome 商店或 Firefox 扩展的用户 Wizdler 使您能够解析 WSDL 并生成 SOAP 消息。

    对于 jQuery,您可以使用 POSTMAN 生成所需的代码,或者您应该考虑使用 AJAX

    【讨论】:

    • 这是 POST 还是 GET? (你有一个 GET CURLOPT_CUSTOMREQUESTCURLOPT_POSTFIELDS
    • 它是 GET。你可以在 POSTMAN 上试试。
    • Wizdler 扩展真的很棒,我可以很容易地提出我的 SOAP Web 服务请求!但不幸的是,它可以在浏览器中使用,如果我通过 POSTMAN 提交相同的有效负载,它会返回我的 wsdl 定义而不是响应 :(。虽然响应非常有帮助。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多