快速背景。
CFHTTP 不支持 Windows NTLM/Authenticate 身份验证,仅支持基本身份验证。我需要发出必须针对 NTLM 进行身份验证的 http 请求,因此我最终推出了自己的 CFHTTP 版本。
我发现Terry Ryan 的文章使用 apache httpclient 3.1 版执行摘要身份验证,并在此基础上使用 4.1.2 版而不是包含 NTLM 功能。
我有一个函数将执行一个 get 请求,然后是其他函数来处理返回一个看起来像 cfhttp 结果集的结构。我所做的更改基于身份验证教程示例。
public any function httpRequest(url,username,password,domain) {
var httpClient = createObject("java","org.apache.http.impl.client.DefaultHttpClient");
var authScope = createObject("java","org.apache.http.auth.AuthScope");
var httpCredentials = createObject("java","org.apache.http.auth.NTCredentials");
var httpGet = createObject("java","org.apache.http.client.methods.HttpGet");
var jURL = createObject("java", "java.net.URL").init(arguments.url);
var host = jURL.getHost();
var path = jURL.getPath();
var httpHostTarget = createObject("java","org.apache.http.HttpHost").init(host,80,"http");
var localContext = createObject("java","org.apache.http.protocol.BasicHttpContext");
var httpContent = {};
var response = '';
if (len(arguments.username) and len(arguments.password) gt 0){
httpCredentials.init(arguments.Username, arguments.password, cgi.remote_host,arguments.domain);
httpClient.getCredentialsProvider().setCredentials(authScope.ANY, httpCredentials);
}
if (!Len(path)) path = "/";
httpGet.init(path);
response = httpClient.execute(httpHostTarget, httpget, localContext);
httpContent = convertHttpClientResponseToCFHTTPFormat(response);
httpClient.getConnectionManager().shutdown();
return httpContent;
}
在我更改功能以执行身份验证之前,这一切正常。
不幸的是,我现在得到:
未找到执行方法。
要么没有具有指定方法名称和参数类型的方法,要么执行方法重载了 ColdFusion 无法可靠破译的参数类型。ColdFusion 找到了 2 个与提供的参数匹配的方法。如果这是一个 Java 对象并且您验证了该方法存在,请使用 javacast 函数来减少歧义。
据我所知,HttpClient 中只有一个匹配的 execute() 函数用于传递给它的对象类,所以我有点困惑。JavaCast 不允许您强制转换为复杂对象或超类型,因此这不起作用。
谁能建议我如何让它工作?如何减少歧义?