3

快速背景。

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 不允许您强制转换为复杂对象或超类型,因此这不起作用。

谁能建议我如何让它工作?如何减少歧义?

4

2 回答 2

1

查看错误,在具有相同数量参数的两个执行方法之间感到困惑。虽然不知道为什么...

无论如何,我找到了解决错误的方法。它涉及将您所追求的方法拉出类并直接调用它。如果 ColdFusion 对转换 Java 对象更满意,那么生活可能会更轻松。

//response = httpClient.execute(httpHostTarget, httpget, localContext);

classes = [httpHostTarget.getClass(), CreateObject('java', 'org.apache.http.HttpRequest').getClass(), CreateObject('java', 'org.apache.http.protocol.HttpContext').getClass()];
method = httpClient.getClass().getMethod('execute', classes);
params = [httpHostTarget, httpget, localContext];
response = method.invoke(httpClient, params);

可能有另一种方法可以做到这一点(而不是铸造),但这就是我所拥有的;)

于 2011-11-04T15:46:40.730 回答
0

作为一种猜测,您会加载错误版本的 .jars 吗?您似乎没有像 Ryan 那样使用 JavaLoader...

于 2011-11-02T11:31:02.710 回答