HttpURLConnection – “https://”与“http://”

例如,我试图获取用户input的url的图标

_url = "google.com"; 

我使用HttpUrlConnection从主机url的/favicon.ico扩展中获取favicon的位图。

  String faviconString = Uri.parse(_url).getHost() + "/favicon.ico"; URL faviconUrl = null; Bitmap favicon = null; try { faviconString = "http://" + faviconString; faviconUrl = new URL(faviconString); HttpURLConnection connection = (HttpURLConnection) faviconUrl.openConnection(); connection.setDoInput(true); connection.connect(); favicon = BitmapFactory.decodeStream(connection.getInputStream()); } catch (IOException e) { e.printStackTrace(); } return favicon; 

但是,由于用户可能不会指定http://https:// ,我必须自己添加它。 我遇到的问题是,如果我在http://前添加http:// ,一切都会正常工作,但对于https:// ,有些网站会返回图标,其他人只会给我null。 如何找出哪个页面使用https ? 我应该添加http://为每个案件? 有没有任何网站限制严格的https并将返回null使用http

Solutions Collecting From Web of "HttpURLConnection – “https://”与“http://”"

除非你使用user2558882的想法,或者有一些其他的工具,只会得到一个网站图标为你,你将不得不同时检查http和httpsurl。 没有其他办法可以做到这一点。 这是使用networking困难的一部分。

也许以不同的方式查看你的代码,并将你想要做的事情分解成更小的更易于pipe理的部分会更好一些?

 public void getFavicon(String host) { URL httpUrl = this.getHttpUrl(host + "/favicon.ico"); Bitmap favicon = this.getBitmap(httpUrl); if (favicon == null) { URL httpsUrl = this.getHttpsUrl(host + "/favicon.ico"); favicon = this.getBitmap(httpsUrl); } if (favicon == null) { throw new FaviconMissingException("Unable to find favicon for host: " + host); } return favicon; } public URL getHttpUrl(String uri) throws MalformedURLException { // There are better ways of building a url then string concationation. return new URL("http://" + uri); } public URL getHttpsUrl(String uri) throws MalformedURLException { // There are better ways of building a url then string concationation. return new URL("https://" + uri); } public Bitmap getBitmap(URL url) { InputStream inputStream = getInputStream(url); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); return bitmap } public InputStream getInputStream(URL url) { // Please use a real connection library like HTTPClient here! // HttpClient will handle timeouts, redirects, and things like that for you. HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); return connection.getInputStream(); } 

顺便说一句,关心一个或两个连接需要更多的时间,然后编写代码来提出两个请求。 我几乎保证,谷歌是根据需要提出两个请求。 如果对Google来说足够好,那对我来说已经足够了。

最后,如果你开始看到提出两个请求确实花费了太多的时间,那么请做一些关于提高性能的事情。

注意:我不知道我的答案是多么有帮助。

你可以使用谷歌抓住favicon:

 http://www.google.com/s2/favicons?domain=stackoverflow.com 

收益:

在这里输入图像说明

您不必指定httphttps

  http://www.google.com/s2/favicons?domain=my.yorku.ca ===>> (https://my.yorku.ca) 

收益:

在这里输入图像说明

但这不是https://my.yorku.ca使用的实际图标。 所以,我猜google对于那些不提供访问他们的图标的网站来说是默认的。

 InputStream is = null; String urlPrefix = "http://www.google.com/s2/favicons?domain="; String _url = "google.com"; Bitmap favicon = null; try { is = (InputStream) new URL(urlPrefix + _url).getContent(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } favicon = BitmapFactory.decodeStream(is); 

您实际上可以保留默认图标的副本,并检查是否:

 if (defaultBitmap.sameAs(favicon)) { // favicon wasn't available } 
  URL url = new URL(downloadURL); HttpURLConnection urlCon = null; URL testUrlHttps = new URL(downloadURL); if (testUrlHttps.getProtocol().toLowerCase().equals("https")) { trustAllHosts(); HttpsURLConnection https = (HttpsURLConnection) url.openConnection(); https.setHostnameVerifier(DO_NOT_VERYFY); urlCon = https; } else { urlCon = (HttpURLConnection) url.openConnection(); } add this method. May be it will help private static void trustAllHosts() { // Create a trust manager that does not validate certificate chains TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[] {}; } public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } } }; // Install the all-trusting trust manager try { SSLContext sc = SSLContext.getInstance("TLS"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); } catch (Exception e) { e.printStackTrace(); } } 

如何检查网站是否返回null或favicon?

我希望这可以帮助你

另一个答案是“更容易”。

只要让用户input他们的图标url(包括协议),并validation该url返回一个图标。 如果不是,则将validation错误显示回最终用户。

敏捷的校长,做最less的工作,看看有什么作品。 如果一个计划不起作用,那么尝试一些不同的方法。

当URL以“https”开头时试试这个:

  TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType) {} public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType) {} } }; try { SSLContext sc = SSLContext.getInstance( "SSL"); // "TLS" "SSL" sc.init( null, trustAllCerts, null); HttpsURLConnection.setDefaultSSLSocketFactory( sc.getSocketFactory()); HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier() { public boolean verify( String hostname, SSLSession session) { return true; } } ); } catch( Exception e)