2016-12-30 18 views
-1

オープン天気のAPIから暗い空のAPIに変更している間に、接続に問題が見つかりました。AndroidでHTTPSでInputStreamを使用できないのはなぜですか?

私は、単にapiからJSONレスポンスを取得し、天気予報マップapiを使用して、すべてうまくいっていました。今度は、代わりに暗い空のAPIを使用することに決めました。私はいつものようにすべてを適応させましたが、うまくいきません。

多分、httpsに問題がありますか? (暗い空のapiはhttps-URLを使用しています。ここで公開されている天気図apiはhttp-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

例外はありません。私はそれをデバッグし、呼び出された行からヌルを返すようにジャンプしました。 – nymvno

+1

例外がない場合、どうしてあなたの質問にはそれがあると言われますか? – EJP

答えて

-1

あなたは私のコード

を確認し、アプリケーションクラスから

を自分のホスト名を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に追加してください。あなたのapi urlを与えて、あなたのホスト名 – frnd

-1

上記のとおり、http/httpsプロトコルの違いがあります。 httpsプロトコルを使用するURLの場合は、HttpURLConnectionではなくHttpsURLConnection APIを使用する必要があります。 https urlにHttpURLConnection APIを使用すると例外がスローされます。詳細は以下のリンクを参照してください。

関連する問題