2016-12-30 1 views
-1

오픈 날씨 api에서 어두운 하늘 api로 바뀌는 동안 연결에 문제가 있음을 발견했습니다.Android에서 HTTPS와 함께 InputStream을 사용할 수없는 이유는 무엇입니까?

간단히 말해서 API에서 JSON 응답을 얻고 개방형 날씨지도 api를 사용하면 모든 것이 잘 작동합니다. 이제 어두운 하늘 API를 대신 사용하기로 결정했습니다. 나는 항상 모든 것을 적용했지만 작동하지 않습니다.

아마도 https에 문제가 있습니까? (어두운 하늘의 api는 공개 날씨지도 api가 http-URL을 사용하는 https-URL을 사용합니다). 어쨌든

, 나는 여기

inputStream = connection.getInputStream(); 

에 IOException를 잡는 것은 내 클래스 :

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

아무런 예외가 없다면 예외가 없다면 null이 반환되도록 전화를 끊습니다. – nymvno

+1

예외가 없다면 왜 그런 질문이 있습니까? – EJP

답변

-1

당신은 내 코드를 확인하여 Application 클래스

에서 호스트 이름을 varify하는 데 필요한

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

패키지에 Application 클래스를 추가하고 menifest.xml에 as를 추가하십시오. 나에게 귀하의 api url을 주시면 귀하의 호스트 이름을 제안 해 드리겠습니다. – frnd

-1

앞서 언급 한 것처럼 http/https 프로토콜의 차이점 만 있습니다. https 프로토콜을 사용하는 URL의 경우 HttpURLConnection이 아닌 HttpsURLConnection API를 사용해야합니다. https URL에 HttpURLConnection API를 사용하면 예외가 발생합니다. 자세한 내용은 아래 링크를 참조하십시오.

관련 문제