2016-12-30 7 views
-1

Пока я менялся с открытой погоды api на темное небо api, я нашел проблему с соединением.Почему InputStream не работает с HTTPS в Android?

Я просто хочу получить JSON-ответ от этого api и с открытой картой погоды api, все работает хорошо. Теперь я решил вместо этого использовать темное небо api. Я просто адаптировал все, как всегда, но это не сработало.

Возможно, у него есть проблема с https? (темное небо api использует https-URL, где открытая карта погоды api использует http-URL).

Во всяком случае, я поймать IOException в

inputStream = connection.getInputStream(); 

Вот мой класс:

import com.nymvno.hiob.prototyp_v30.Utils.Utils; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 

public class WeatherHttpClient { 

public String getWeatherData(String place) { 
    HttpURLConnection connection; 
    InputStream inputStream; 

    try { 
     connection = (HttpURLConnection) (new URL(Utils.BASE_URL + place)).openConnection(); 
     connection.setRequestMethod("GET"); 
     connection.setDoInput(true); 
     connection.setDoOutput(true); 
     connection.connect(); 

     //Read the response 
     StringBuffer stringBuffer = new StringBuffer(); 
     inputStream = connection.getInputStream(); 
     BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     String line; 

     while ((line = bufferedReader.readLine()) != null) { 
      stringBuffer.append(line + "\r\n"); 
     } 
     inputStream.close(); 
     connection.disconnect(); 

     return stringBuffer.toString(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
} 
+1

что это исключение? Не могли бы вы опубликовать ошибку кота журнала? –

+0

Не исключение. Я отлаживал его и выяснял, что он перескакивает из вызываемой строки, чтобы вернуть нуль. – nymvno

+1

Если нет исключения, почему ваш вопрос говорит, что есть? – EJP

ответ

-1

Вы должны должны varify вашего имени хоста из вашего класса Application

проверить мой код

public class MyApp extends Application{ 
@Override 
    public void onCreate(){ 
     super.onCreate(); 
handleSSLHandshake(); 
} 

@SuppressLint("TrulyRandom") 
    public static void handleSSLHandshake() { 
     try { 
      TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() { 
       @Override 
       public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 

       } 

       @Override 
       public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException { 

       } 

       @Override 
       public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
        return new java.security.cert.X509Certificate[0]; 
       } 


      }}; 

      SSLContext sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new SecureRandom()); 
      HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
      HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { 
       @Override 
       public boolean verify(String hostname, SSLSession arg1) { 
        if(hostname.equalsIgnoreCase("your host name")){ 
         return true; 
        }else { 
         return false; 
        } 

       } 
      }); 
     } catch (Exception ignored) { 
     } 
    } 


} 
+0

Я не совсем понимаю, что вы делаете. Может ли имя хоста быть моим ключом api? Нужен ли мне этот SSLHandshake-обработчик? – nymvno

+0

Добавьте класс приложения в свой пакет и добавьте как в menifest.xml. дайте мне ваш api url, поэтому я предлагаю, что ваше имя хоста – frnd

-1

Как вы уже упоминали, существует только различие протокола http/https. Для URLS, имеющих протоколы https, вы должны использовать API HttpsURLConnection, а не HttpURLConnection. Если вы используете API-интерфейс HttpURLConnection для исключения https url, будет выбрано исключение. Для получения дополнительной информации вы можете обратиться к ссылке ниже.

https://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html

 Смежные вопросы

  • Нет связанных вопросов^_^