繁体   English   中英

使用 Java 访问 Dynamics NAV Web 服务

[英]Access Dynamics NAV Webservice with Java

我正在尝试从 Java 访问 Dynamics NAV 2013 R2 Web 服务。 Web 服务正在运行,当我在 Internet Explorer 中输入 URL 时,我可以看到 WSDL,但首先会提示我输入用户名和密码。 在 Wireshark 上,我可以看到它使用基于 NTLM 的身份验证。 到目前为止,我只能从 Internet Explorer 打开 WSDL,当我在 Firefox 上打开它时,它给了我一个空白页面并且没有错误。

我想要做的是使用 wsimport 工具从 Java 访问 Web 服务,但我无法进行身份验证。 我已经在~/.metro/auth创建了一个文件夹,并将以下行放在那里:

http://userfoobar:passforbar@192.168.0.170:7047//DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization

我正在尝试使用以下方式访问网页:

wsimport -d generated -s sources http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization

我总是收到错误:

[ERROR] Server returned HTTP response code: 401 for URL: http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization,  "http://@192.168.0.170:7047/DynamicsNAV71/WS/CRONUS%20AG/Page/PageWithCapitalization" needs authorization, please provide authorization file with read access at /home/user/.metro/auth or use -Xauthfile to give the authorization file and on each line provide authorization information using this format : http[s]://user:password@host:port//<url-path>

我已经在 Linux 和运行 NAV Web 服务的 Windows 7 机器上尝试过这个。 我是否必须在 NAV 中执行任何其他配置? 有什么特别的技巧可以让它发挥作用吗?

默认情况下,Nav使用Windows Active Directory授权。 我不确定wsimport在java中做了什么,但url中提供的凭据不太可行。 您需要通过协商过程来授权服务器或更改服务器(或配置文件)中的“ Nav Server Administration管理单元中的授权类型。

这里关于证书类型和这里是如何配置服务器。 另请参阅Freddy博客中关于如何从Java连接到Nav的有用帖子(我相信它仍然与Nav 2009相关)。

soapUI可以处理NTLM授权类型,因此您可以通过协商过程在其日志中查看所有请求和响应。

您可以使用NTLM authentication从任何流行的编程语言访问NAV Web 服务。 在这种情况下,我将使用Node.js

对于 PHP 开发人员,请参阅有关 php ntlm 身份验证的这篇文章 如果需要,我当然可以就此提供更多指导。

对于 Java 开发人员,本书Extending Microsoft Dynamics NAV 2016 Cookbook详细介绍了如何从 Java 使用 NAV Web 服务(第 372 页)。 简而言之,您执行以下操作: http://<username>:pasword>@localhost:7057/NAV2016_WebService/WS/Codeunit/PostCodeInfo

NTLM authentication允许客户端通过为服务器上存在的 Windows 帐户提供凭据来访问服务器上的资源。

因此,如果服务器有一个名为用户GilbertS用密码Gilbert1000 ,您可以通过运行下面的JavaScript代码发送请求到服务器:

const httpntlm = require('httpntlm');

const NAV_DimQuery = "http://junit:7148/BC140/ODataV4/Company('CronusCompany')/MyDimensionQuery";
httpntlm.get({
    url: NAV_DimQuery,
    username: 'GilbertS',
    password: 'Gilbert100',
    domain: 'JUNIT'
}, function(err, res) {
    if(err) {
        throw err;
    } 
    console.log(res);
});

输入以下命令安装必要的库: npm i httpntlm请注意,其他语言(如 PHP 和 Java)也有类似的库。

要获取域名,请从服务器的命令提示符或终端运行: SET查找名为USERDOMAIN的键的值。 请注意,如果服务器是 PC 而不是专用的 Windows Server,则域可以留空。

NAV / 业务中心特定配置

在 NAV 或 Business Central Administration 中,“常规”选项卡中有一个名为“ Use NTLM Authentication的字段,确保选中它(设置为 true)。 如果您无法从 NAV/BC 管理窗口修改它,请编辑路径中的CustomSettings.config文件: C:\\Program Files\\Microsoft Dynamics 365 Business Central\\140\\Service

由于我们使用 NTLM 进行身份验证,因此请确保将 NAV/BC 配置为使用Windows authentication 您可以通过将Credential Type设置为Windows

如果Credential Type设置为其他内容,或者您​​没有勾选Use NTLM Authentication ,则在发送请求时会出现错误,说明诸如服务器不允许 NTLM 之类的内容。

此外,请确保您用于访问 NAV/BC 中数据的 Windows 用户存在于 NAV/BC 中的用户表中,并且该用户已启用。

如果 NAV 服务器正在使用 NavUserPassword 身份验证,您可以创建另一个对同一数据库使用 Windows 身份验证的服务器实例。

最后,当心运行代码使 NAV 服务器停止的某些情况,我仍在试图找出导致这种情况的原因。

您可以在评论中进行查询,以防您的请求仍然失败。

更新

我创建了两个 npm 库来帮助 NAV / BC Web 服务集成。

使创建 URL 以发送到 Web 服务以使用 Odata 的库变得简单且声明式: https : //www.npmjs.com/package/navodata

建立在httpntlm库之上的客户端,用于使用 Windows 身份验证访问 Web 服务。 提供错误处理和 promise 的使用: https : //www.npmjs.com/package/navclient

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM