我正在尝试使用Apache HttpAsyncClient(版本4.0-beta1,在撰写本文时是最新的)在Android上实现REST通信。
我的问题是,由于来自WITHIN框架的MethodNotFound错误,我无法发出任何请求。
详细的堆栈跟踪为(在显示的行之后,下一个来自我自己的代码):
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对象提供给constructur,它也会尝试调用extractHost方法并崩溃。
有人在这方面对我有帮助吗?我只是添加了JAR,而没有自己编译该库。
最佳答案
Apache HttpAsyncClient基于称为HttpCore的低级HTTP传输库。 Google Android附带了Apache HttpClient的一个非常过时的版本,该版本也基于相同的库。 HttpAsyncClient需要Android附带的更新版本的HttpCore。但是,每当尝试从较新版本调用方法时,类加载器就会从较旧版本中拾取类,这首先会导致NoSuchMethodError异常。
不幸的是,解决此问题的唯一方法是将所有HttpAsyncClient代码及其依赖项移至其他名称空间。
关于java - Apache HttpAsyncClient-NoSuchMethodError-URIUtils.extractHost,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10335125/