2016-09-06 16 views
3

私の以前のバージョンの私のアプリケーションではApache Clientを使用していましたが、それでも問題なく動作しました。しかし、パフォーマンスの向上のためにRetrofitに移行することにしました。問題は、毎回「ホストxxxxxx」を解決できません:ホスト名に関連付けられたアドレスがありません。Retrofit 2がホストを解決できません

私は忘れてしまった何かがあるかもしれません。この内部にマニフェスト

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

を置きますか?

これはURLです:https://www.hbapimanager.azure-api.net/Wallet/CheckNumber

P.S.これは私のretrofitFactoryクラスである:私はほとんど週

編集のためにこれで苦労してきた

private static HttpLoggingInterceptor logging = new HttpLoggingInterceptor() 
     .setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE); 

private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder() 
     .addInterceptor(logging); 

private static HttpUrl url = new HttpUrl.Builder() 
     .scheme("https") 
     .host(Constants.Network.HOST) 
     .build(); 

private static Retrofit.Builder builder = 
     new Retrofit.Builder() 
       .baseUrl(url) 
       .addConverterFactory(GsonConverterFactory.create()); 

public static <T> T createRetrofitService(final Class<T> clazz) { 
    Retrofit retrofit = builder.client(httpClient.build()).build(); 
    return retrofit.create(clazz); 
} 

そして、これは要求

@Headers({ 
     Constants.Network.HEADER_TYPE, 
     Constants.Network.HEADER_KEY 
}) 
@POST(Constants.Network.CHECK_NUMBER) 
Call<StatusData> postCheckNumber(@Body CheckNumberPoRD checkNumberPoRD); 

@Headers({ 
     Constants.Network.HEADER_TYPE, 
     Constants.Network.HEADER_KEY 
}) 
@GET(Constants.Network.CHECK_NUMBER) 
Call<CheckNumberGRD> getCheckNumber(
     @Query("PrimaryKey") String primaryKey, 
     @Query("RowKey") String rowKey 
); 

と私は

を取得するためのインタフェースです。
09-06 16:58:50.958 7229-7283/kz.halykbank.halykewallet D/OkHttp: --> POST https://www.hbapimanager.azure-api.net/Wallet/CheckNumber http/1.1 
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Content- Type: application/json 
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Content-Length: 27 
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: Ocp-Apim-Subscription-Key: xxxxxxxxxxxxxxxxxxxxxxxxx 
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: {"phone":"x(xxx)xxx-xx-xx"} 
09-06 16:58:50.959 7229-7283/kz.halykbank.halykewallet D/OkHttp: --> END POST (27-byte body) 
09-06 16:58:51.666 7229-7283/kz.halykbank.halykewallet D/OkHttp: <-- HTTP FAILED: java.net.UnknownHostException: Unable to resolve host "www.hbapimanager.azure-api.net": No address associated with hostname 
+0

あなたが改造 – Dharmaraj

+0

を実装するために書かれた多くのコードを投稿することができ、あなたのベースURLとあなたのレトロフィットサービスクラス –

+0

から「/」を削除し、私は、URLに – EpicPandaForce

答えて

0

マイ問題は私がhttps://www.example.comにリクエストを送信しようとしていたことでした。しかし、サーバーのホストにはwww.example.comはなく、example.comのみでした。

-1

あなたは最も確実にth

http://blah.com/v1/blah 

そして、あなたのサービスが

@GET("/blah/blah/blah") 

のように見えますが、あなたが実際にはこのように見えるようにする必要があります:あなたのベースURLは次のようになり、電子の問題

http://blah.com/v1/blah/ 

サービスは次のようになります

@GET("blah/blah/blah") 
+0

残念なことに助けてくれなかった –

+0

それは想像するのは難しい。サイトは存在しません。 – EpicPandaForce

+0

それは難しい部分です。このウェブサイトは存在します。私はそれをAndroid上のApache ClientとPostman –

-1
HttpUrl baseUrl = new HttpUrl.Builder() 
       .scheme("https") 
       .host("www.hbapimanager.azure-api.net") 
       .encodedPath("/Wallet/") 
       .build(); 

OkHttpClient okHttpClient = new OkHttpClient.Builder() 
       .addInterceptor(new AdditionalHttpHeadersInterceptor(headersProvider)) 
       .addInterceptor(httpLoggingInterceptor) 
       .build(); 

ApiService apiService = new Retrofit.Builder() 
       .baseUrl(baseUrl) 
       .client(okHttpClient) 
       .addConverterFactory(MoshiConverterFactory.create(moshi)) 
       .build() 
       .create(ApiService.class); 

ApiService.java Constants.Network.CHECK_NUMBERはスラッシュ

しかし、多分あなたはカスタムSSLソケットファクトリを設定する必要がなし"CheckNumber"ある

@Headers({ 
     Constants.Network.HEADER_TYPE, 
     Constants.Network.HEADER_KEY 
}) 
@GET(Constants.Network.CHECK_NUMBER) 
Call<CheckNumberGRD> getCheckNumber(
     @Query("PrimaryKey") String primaryKey, 
     @Query("RowKey") String rowKey 
); 

、理由のHTTPS。最も簡単な方法は次です:

HTTPクライアント

public class TLSSocketFactory extends SSLSocketFactory { 

    private SSLSocketFactory internalSSLSocketFactory; 

    public TLSSocketFactory() { 
     SSLContext context = null; 
     try { 
      context = SSLContext.getInstance("TLS"); 
      context.init(null, null, null); 
     } catch (NoSuchAlgorithmException | KeyManagementException e) { 
      //TODO check it and fix 
      throw new RuntimeException(e); 
     } 
     internalSSLSocketFactory = context.getSocketFactory(); 
    } 

    @Override 
    public String[] getDefaultCipherSuites() { 
     return internalSSLSocketFactory.getDefaultCipherSuites(); 
    } 

    @Override 
    public String[] getSupportedCipherSuites() { 
     return internalSSLSocketFactory.getSupportedCipherSuites(); 
    } 

    @Override 
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(s, host, port, autoClose)); 
    } 

    @Override 
    public Socket createSocket(String host, int port) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port, localHost, localPort)); 
    } 

    @Override 
    public Socket createSocket(InetAddress host, int port) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(host, port)); 
    } 

    @Override 
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException { 
     return enableTLSOnSocket(internalSSLSocketFactory.createSocket(address, port, localAddress, localPort)); 
    } 

    private Socket enableTLSOnSocket(Socket socket) { 
     if (socket != null && (socket instanceof SSLSocket)) { 
      ((SSLSocket) socket).setEnabledProtocols(new String[]{"TLSv1.1", "TLSv1.2"}); 
     } 
     return socket; 
    } 
} 

とカスタムX509のトラストマネージャクラスのカスタムSSLのファクトリクラス

public class CustomX509TrustManager implements X509TrustManager { 

    @SuppressLint("TrustAllX509TrustManager") 
    @Override 
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
    } 

    @SuppressLint("TrustAllX509TrustManager") 
    @Override 
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
    } 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return new X509Certificate[]{}; 
    } 
} 

を作成し、作成

OkHttpClient okHttpClient = new OkHttpClient.Builder() 
       .sslSocketFactory(new CustomX509TrustManager(), new TLSSocketFactory()) 
       .addInterceptor(new AdditionalHttpHeadersInterceptor(headersProvider)) 
       .addInterceptor(httpLoggingInterceptor) 
       .build(); 
+0

私はこれを試しました。 sslSocketFactoryは、ホストが存在しない –

+0

を助けません。ここでそれをチェックした[check-host.net](https://check-host.net/ip-info?host=www.hbapimanager.azure-api.net)とPostmanと一緒に。多分あなたはカスタムDNSサーバを持っているか、VPNを使ってこのホストに接続しているでしょうか? –

関連する問題