对HTTPS主机的HttpClient请求转到默认名称服务器

时间:2015-10-24 22:38:03

标签: android apache apache-httpclient-4.x

我在我的android项目中使用Apache httpClient库向服务器发送get / post请求。我的服务器是使用apache namevirtualhost设置的 - 同一台服务器上有多个虚拟主机。

对于那些不熟悉apache namevirtualhost如何工作的人,简单的解释是服务器配置中定义了多个配置,apache使用Host请求头来确定要使用的配置。定义多个主机时,第一个主机被视为默认主机,并且所有Host请求标头未明确匹配其中一个已定义的namevirtualhosts的请求将使用默认配置进行处理。

现在,我正在尝试连接的服务器不是默认服务器。当我的应用程序运行并向服务器发出请求时,它不会转到我的虚拟主机,而是由默认主机处理,导致证书名称不匹配。 (请注意,我确实设置了正确的证书。)

这是我的代码 - 复制/粘贴,实际网址除外:

String targetUrl = getTargetUrl();
//this returns something like https://www.example.com/api/1/orders (without spaces, of course)
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(targetUrl);

List<NameValuePair> data = new ArrayList<NameValuePair>(1);
data.add(new BasicNameValuePair("orders", json.toString()));
data.add(new BasicNameValuePair("username", username));
data.add(new BasicNameValuePair("password", password));
post.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = client.execute(post);

这会导致出现错误消息,指出证书名称与请求的网址不匹配,并显示请求的网址和证书网址 - 证书网址是apache配置中的默认网址。

我在执行请求的行之前添加了此代码:

Header[] hds = post.getAllHeaders();
for(Header h : hds) {
    Log.d("PasteneOrers", h.getName() + ": " + h.getValue());
}

查看包含哪些标头。有趣的是,Host标题未显示。然后我在执行请求之前添加了这段代码:

URL url = new URL(targetUrl);
post.setHeader("Host", url.getHost());

现在上面的调试输出正确地显示了Host标题 - 但它没有帮助,请求仍然是默认的。

为了验证这不是服务器配置错误的问题,我复制了目标URL并将其粘贴到运行在同一个Android模拟器上的浏览器中 - 这可以正常工作,我得到了正确的结果。因此,它绝对是我的代码中的一部分 - 但是什么?此时我被困住了。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

为了解决其他问题,我无法用apache httpclient解决它。我转而使用HttpUrlConnection,一切正常。