我有一个 .Net 网站,托管在 Intranet Web 服务器上。在 .Net 站点上,我对我们的 mirth 机器进行了基本的 jquery ajax 调用。我正在尝试访问随 mirth 基本安装提供的客户端 api。
我们正在运行 mirth 3.9.1,具有默认的 mirth.properties 页面,因此 CORS 设置应该是正确的。
我已经尝试了 mirth.properties 中的各种设置(并在更改之间重新启动了 mcservice)和各种 $.ajax 设置,但似乎找不到正确的组合。
根据这个答案:( https://stackoverflow.com/a/47096927/505829 ),我应该能够使用基本身份验证,但即使我必须打两个电话,我也可以,我只需要一些有用的东西。虽然最好打一个电话。
这是ajax调用
$.ajax
({
type: "GET",
url: "https://ngmaintst01:8443/api/channels",
dataType: 'json',
// username: username,
// password: password,
// crossDomain: true,
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + ":" + password));
},
xhrFields: {
withCredentials: true
},
// headers: {
// "Authorization": "Basic " + btoa(username + ":" + password)
// },
success: function () {
alert('success');
}
});
这是欢乐属性:# CORS headers
server.api.accesscontrolalloworigin = *
server.api.accesscontrolallowcredentials = false
server.api.accesscontrolallowmethods = GET, POST, DELETE, PUT
server.api.accesscontrolallowheaders = Content-Type
server.api.accesscontrolexposeheaders =
server.api.accesscontrolmaxage =
如果我在 chromes 开发控制台中采用上面所示的单一调用方法,我会得到:(failed)net::ERR_FAILED
如果我采用两次调用方法(如下),第一个调用成功(代码 200),第二个调用与单调用方法'(failed)net::ERR_FAILED' 相同,这次出现第二个调用不带 cookie session 数据,这就是为什么单调用方法可能是理想的。$.ajax({
type: 'POST',
url: 'https://' + APPLIANCE+':8443/api/users/_login',
contentType: 'application/x-www-form-urlencoded',
dataType: 'xml',
data: { username: username, password: password },
success: function (data, textStatus, jqXHR) {
//alert(textStatus);
$.ajax({
type: 'GET',
url: 'https://' + APPLIANCE + ':8443/api/channels/' + channelid + '/statistics',
dataType: 'xml',
crossDomain: true,
xhrFields: { withCredentials: true },
//data: data,
//success: function(data, textStatus, jqXHR){ alert(textStatus); },
//error: function(jqXHR, textStatus, errorThrown){ alert(textStatus);}
});
},
error: function (jqXHR, textStatus, errorThrown) { alert(textStatus); }
});
最佳答案
在 slack 上的欢乐人士的帮助下,我能够完成这项工作。有一个“问题”,据我所知,它只支持一个 Web 服务器。所以我要么需要在这台服务器上同时拥有我的测试和生产站点,要么不需要测试。
或者,我将仅使用代理后端服务来完全绕过 cors。所以我的本地 js 将调用我的本地代理服务器,并将请求转发到 mirths api。
尽管如此,对于后代,这里是如何让 cors 工作。
(实现 mirth 的一个可能功能是动态 accesscontrolalloworigin,您可以在其中提供域的“访问列表”,只要请求来自这些域之一,它就会动态地吐出该服务器名称。这将使我能够有多个服务器调用这些 api。ala Access-Control-Allow-Origin Multiple Origin Domains? )
# CORS headers
server.api.accesscontrolalloworigin = https://MyDomainServer
server.api.accesscontrolallowcredentials = true
server.api.accesscontrolallowmethods = GET,HEAD,OPTIONS,POST,PUT
server.api.accesscontrolallowheaders = Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, Authorization
server.api.accesscontrolexposeheaders =
server.api.accesscontrolmaxage =
$.ajax
({
type: "GET",
url: "https://MirthAppliance:8443/api/channels",
dataType: 'json',
xhrFields: {
withCredentials: true
},
headers: {
"Authorization": "Basic " + btoa(username + ":" + password)
},
success: function () {
//alert('success');
},
error: function (xhr, status, error) {
var errorMessage = xhr.status + ': ' + xhr.statusText
// alert('Error - ' + errorMessage);
}
});
关于javascript - 从 jquery 调用 Mirth 'client api' 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64051966/