java - Apache HttpAsyncClient - NoSuchMethodError - URIUtils.extractHost

标签 java android asynchronous httpclient nosuchmethoderror

我正在尝试使用 Apache HttpAsyncClient(版本 4.0-beta1,这是撰写本文时的最新版本)在 Android 上实现 REST 通信。

我的问题是,由于来自框架内的 MethodNotFound 错误,我无法发出任何请求。

详细的堆栈跟踪是(在显示的行之后,下一行来 self 自己的代码):

java.lang.NoSuchMethodError: org.apache.http.client.utils.URIUtils.extractHost
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.determineTarget(AbstractHttpAsyncClient.java:594)
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.execute(AbstractHttpAsyncClient.java:578)
    at org.apache.http.impl.nio.client.AbstractHttpAsyncClient.execute(AbstractHttpAsyncClient.java:569)

我所做的如下:

private static final String SERVER_SCHEME = "http";
private static final String SERVER_HOST = "localhost";
private static final int SERVER_PORT = 3000;
private static final String SERVER_BASE_PATH = "/api/v1";
private static final String PATH_LOGIN = "/login";

private DefaultHttpAsyncClient http_client;

public void test(String email, String password, ConnectionManagerCallback callback) {
    this.http_client = new DefaultHttpAsyncClient();
    this.http_client.start();

    this.http_client.getCredentialsProvider().setCredentials(new AuthScope(SERVER_HOST, SERVER_PORT), new UsernamePasswordCredentials(email, password));
    HttpPost request = new HttpPost(SERVER_SCHEME + "://" + SERVER_HOST + ":" + SERVER_PORT + SERVER_BASE_PATH + PATH_LOGIN);

    this.http_client.execute(request, new Callback(REQUEST_LOGIN, callback));
}

为了示例,我已经删除了异常处理。问题是,我得到了上面描述的异常。因此,由于它是测试版本,我想到为 HttpPost 使用不同的构造函数。但即使当我向构造函数提供 URI 对象时,它也会尝试调用 extractHost 方法并崩溃。

有人可以帮我解决这个问题吗?我只是顺便添加了 JAR,并没有自己编译库。

最佳答案

Apache HttpAsyncClient 基于名为 HttpCore 的低级 HTTP 传输库。 Google Android 附带了一个极其过时的 Apache HttpClient 版本,该版本也基于相同的库。 HttpAsyncClient 需要比 Android 附带的 HttpCore 版本更新的版本。但是,每当尝试调用新版本中的方法时,类加载器首先会拾取旧版本中的类,从而导致 NoSuchMethodError 异常。

不幸的是,此问题的唯一解决方案是将所有 HttpAsyncClient 代码及其依赖项移至不同的命名空间。

2020 年 11 月更新

升级到 Apache HttpClient 5.x

关于java - Apache HttpAsyncClient - NoSuchMethodError - URIUtils.extractHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10335125/

相关文章:

java - Java 中有等效的 strpbrk 吗?以及如何使用它?

java - android 可绘制标记 nullExceptionPointer

android - Jetpack 撰写 : LayoutCoordinate operations are only valid when isAttached is true on Android 6 Devices

java - Retrofit 在请求中发送 base64 图像

javascript - 如何链接ajax请求?

multithreading - 如何在 future 中包装 Web Worker 响应消息?

java - WeekFields 在 JVM 8 和 JVM 10 上的不同行为

java - 属性修饰符不影响items.xml中的数据库,这是为什么呢?

Android 相机应用收到错误 100

c# - 我如何在 C# 中等待事件?