我的Android应用程序用于客户内部网络,并且配置的一部分涉及他们输入其Web服务的URL。
从一开始,Android似乎无法看到内部网络中的主机名,因此到目前为止,我一直建议人们使用其服务器的IP地址。最近出现的一个问题是,一个客户将SSL应用于其服务器,这意味着URL仅可以通过https访问,并且自签名证书当然与主机名而不是IP地址匹配。无论您指定http还是https,通过IP地址的URL请求都不再起作用。
搜索了几天,建议要么对设备进行root并修改hosts文件,要么提供一个内部DNS-over-TLS服务器,但这两个选项都对我不可用。
解决内部主机名肯定不会这么难吧?
我不确定这是否是代码问题,因为在Chrome中也可以重现该问题,但以下是我的代码:
protected JSONObject doInBackground(String... params) {
try {
URL url = new URL("http://officeserver/PTSWeb/PTSCommsServer.asmx");
HttpURLConnection huc = (HttpURLConnection) url.openConnection();
HttpURLConnection.setFollowRedirects(false);
huc.setConnectTimeout(5 * 1000);
huc.setRequestMethod("GET");
huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)");
huc.connect(); //FAILS HERE WITH UNABLE TO RESOLVE HOST
BufferedReader in = new BufferedReader(new InputStreamReader(huc.getInputStream()));
String result = "";
StringBuilder total = new StringBuilder();
for (String line; (line = in.readLine()) != null; ) {
total.append(line).append('\n');
}
in.close();
result = total.toString();
return new JSONObject(result);
} catch (Exception e) {
try {
JSONObject MyErrorJSON = new JSONObject();
MyErrorJSON.accumulate("WasError", "True");
MyErrorJSON.accumulate("ResponseText", e.toString());
return MyErrorJSON;
} catch (Exception x) {
return null;
}
}
}