2014-12-31 8 views
6

Ho costruire un restAdapter da questo:Come postare la richiesta HTTPS utilizzando Retrofit?

return new RestAdapter.Builder() 
      .setEndpoint("https://www.xyz.com/") 
      .build() 
      .create(SafeUserApi.class); 

poi nella SafeUserApi.class (che è un'interfaccia) ho:

public interface SafeUserApi { 
    @POST("/api/userlogin") 
    void getUserLogin(@Body UserserLogin userLogin, Callback<LoginResult> cb); 
} 

Ma non funziona. Ho dimenticato qualcosa?

Ho provato con Postman e funziona. Ma nel mio dispositivo non è così.

ho questi quattro libreria importata:

compile files('libs/okhttp-2.1.0.jar') 
compile files('libs/okhttp-urlconnection-2.1.0.jar') 
compile files('libs/okio-1.0.1.jar') 
compile files('libs/retrofit-1.8.0.jar') 
+0

Come doesnt funziona? Dai i sintomi. –

+0

L'ho risolto. Non ho incluso il keystore nel mio progetto. Mi ci vuole un po 'per genare il keystore. Ho usato keystoreExplorer per generare il keystore, è molto facile con lo strumento – Derekyy

+0

Ho lo stesso problema e il mio errore di richiesta di aggiornamento con errore: java.security.cert.CertPathValidatorException: Trust anchor per il percorso di certificazione non trovato. – Kenji

risposta

-2
public interface SafeUserApi { 
    @FormUrlEncoded 
    @POST("/api/userlogin") 
    void getUserLogin(@Field("parm1")UserserLogin userLogin, Callback<LoginResult> cb); 
} 

Ecco parm1 è il parametro POST che si passerà al server. Questo risolverà il vostro problema

+0

La domanda riguarda principalmente l'uso del protocollo HTTPS –

12
public static OkHttpClient getUnsafeOkHttpClient() { 

    try { 
     // Create a trust manager that does not validate certificate chains 
     final 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]; 
      } 
     } }; 

     // Install the all-trusting trust manager 
     final SSLContext sslContext = SSLContext.getInstance("TLS"); 
     sslContext.init(null, trustAllCerts, 
       new java.security.SecureRandom()); 
     // Create an ssl socket factory with our all-trusting manager 
     final SSLSocketFactory sslSocketFactory = sslContext 
       .getSocketFactory(); 

     OkHttpClient okHttpClient = new OkHttpClient(); 
     okHttpClient = okHttpClient.newBuilder() 
       .sslSocketFactory(sslSocketFactory) 
       .hostnameVerifier(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER).build(); 

     return okHttpClient; 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 

} 

Questo dovrebbe funzionare:

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl(YOUR_HTTPS_URL) 
    .setClient(getUnsafeOkHttpClient()) 
    .build(); 
+0

Attenzione: può attaccare i tuoi utenti in un hotspot Wi-Fi pubblico utilizzando trucchi DNS per inviare il traffico degli utenti attraverso un proprio proxy che finge di essere il tuo server. L'utente malintenzionato può quindi registrare password e altri dati personali.attacker può generare un certificato e, senza un TrustManager, che in realtà convalidi che il certificato provenga da un'origine attendibile, l'app potrebbe parlare con chiunque. Quindi non farlo, nemmeno temporaneamente. Puoi sempre fare in modo che la tua app abbia fiducia nell'emittente del certificato del server, quindi fallo e basta. – dhams

Problemi correlati