[英]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.