2016-07-16 42 views
2

我在我的API接口的請求:HTTP請求獲得「明文通信,不支持」錯誤

@FormUrlEncoded 
@POST(ApiStatics.authorizeURL) 
Call<Oauth2Model> authorizer(@Field("grant_type") String grantType, 
          @Field("username") String userName, 
          @Field("password") String password, 
          @Field("client_id") String clientID, 
          @Field("client_secret") String clientSecret); 

絲毫此getApi方法:

public static MyAPI getApi() { 
    if (api == null) { 
     OkHttpClient client; 
     if (GuildsApp.isDebug()) { 
      HttpLoggingInterceptor bodyInterceptor = new HttpLoggingInterceptor(); 
      bodyInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
      HttpLoggingInterceptor headerInterceptor = new HttpLoggingInterceptor(); 
      headerInterceptor.setLevel(HttpLoggingInterceptor.Level.HEADERS); 
      client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.MINUTES).writeTimeout(5, TimeUnit.MINUTES).connectTimeout(5, TimeUnit.MINUTES).addInterceptor(bodyInterceptor).addInterceptor(headerInterceptor).build(); 
     } else { 
      client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.MINUTES).writeTimeout(5, TimeUnit.MINUTES).connectTimeout(5, TimeUnit.MINUTES).build(); 
     } 
     Retrofit.Builder builder = new Retrofit.Builder(); 
     builder.baseUrl(BASE_URL); 
     builder.addConverterFactory(GsonConverterFactory.create()); 
     builder.client(client); 
     Retrofit retrofit = builder.build(); 
     api = retrofit.create(MyAPI.class); 
    } 
    return api; 
} 

我在片段使用此API用這種方法:

private void login(String user, String pass) { 
    ApiManager.getApi().authorizer("password", user, pass, ApiStatics.CID,ApiStatics.CSecret).enqueue(new Callback<Oauth2Model>() { 
     @Override 
     public void onResponse(Call<Oauth2Model> call, Response<Oauth2Model> response) { 
      Log.e("authorize token",""+response.body().access_token); 
     } 

     @Override 
     public void onFailure(Call<Oauth2Model> call, Throwable t) { 
      Log.e("Failure ",""+t.getLocalizedMessage()); 
     } 
    }); 
} 

當我運行項目,請求調用onFailure處方法與此日誌:

E /失敗:明文通信不支持:[ConnectionSpec的(密碼組= [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA],tlsVersions = [ TLS_1_2,TLS_1_1,TLS_1_0],supportsTlsExtensions =真),ConnectionSpec的(密碼組= [TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES _128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_3DES_EDE_CBC_SHA],tlsVersions = [TLS_1_0],supportsTlsExtensions =真)]

我BASE_URL是HTTP,HTTPS不。 我的登錄方法用login(「」,「」)調用;那「」被服務器接受, 我該如何解決這個錯誤? 我使用Retrofit 2.1.0,我的測試設備是nexus 5x android N

回答

1

通過在我的片段中添加一個簡單的getApi方法而不是ApiManager,問題解決了!

private MyAPI getApi(){ 
    Retrofit.Builder builder = new Retrofit.Builder(); 
    builder.baseUrl(ApiManager.BASE_URL); 
    builder.addConverterFactory(GsonConverterFactory.create()); 
    Retrofit retrofit = builder.build(); 
    return retrofit.create(MyAPI.class); 
} 

和我的登錄方法現在是:

private void login(String user, String pass) { 
getApi().authorizer("password", user, pass, ApiStatics.CID,ApiStatics.CSecret).enqueue(new Callback<Oauth2Model>() { 
    @Override 
    public void onResponse(Call<Oauth2Model> call, Response<Oauth2Model> response) { 
     Log.e("authorize token",""+response.body().access_token); 
    } 

    @Override 
    public void onFailure(Call<Oauth2Model> call, Throwable t) { 
     Log.e("Failure ",""+t.getLocalizedMessage()); 
    } 
}); 
} 

可一些身體向我解釋什麼是我的ApiManager和我的片段實施getApi方法之間的區別?

2

將此註釋添加到課程頂部。

@PowerMockIgnore("javax.net.ssl.*") 

它會忽略SSL檢查。