2014-12-31 22 views
6

tôi xây dựng một restAdapter của thành viên này:Làm thế nào để gửi yêu cầu HTTPS bằng Retrofit?

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

sau đó trong SafeUserApi.class (đó là một giao diện) Tôi có:

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

Nhưng nó không hoạt động. Tôi đã bỏ lỡ một cái gì đó?

Tôi đã thử với Postman và nó hoạt động. Nhưng trong thiết bị của tôi thì không.

Tôi có bốn thư viện này nhập khẩu:

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

Làm thế nào nó không làm việc? Đưa ra các triệu chứng. –

+0

Tôi đã giải quyết nó. Tôi không bao gồm keystore trong dự án của mình. Tôi mất khá nhiều thời gian để tạo ra kho khóa. Tôi đã sử dụng keystoreExplorer để gen keystore, nó rất dễ dàng wif rằng công cụ – Derekyy

+0

Tôi có cùng một vấn đề và thất bại yêu cầu trang bị thêm của tôi với lỗi: java.security.cert.CertPathValidatorException: Trust anchor cho đường dẫn chứng nhận không tìm thấy. – Kenji

Trả lời

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

Đây parm1 là tham số POST rằng bạn sẽ được đi qua nó đến máy chủ. này sẽ giải quyết vấn đề của bạn

+0

Câu hỏi chủ yếu là sử dụng giao thức 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); 
    } 

} 

này nên làm việc:

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

Thận trọng: có thể tấn công người dùng của bạn tại điểm phát sóng Wi-Fi công cộng bằng cách sử dụng các thủ thuật DNS để gửi lưu lượng truy cập của người dùng thông qua proxy của riêng họ giả vờ làm máy chủ của bạn. Kẻ tấn công sau đó có thể ghi lại mật khẩu và data.attacker cá nhân khác có thể tạo ra một chứng chỉ và không có TrustManager thực sự xác nhận rằng chứng chỉ đến từ một nguồn đáng tin cậy — ứng dụng của bạn có thể nói chuyện với bất kỳ ai. Vì vậy, không làm điều này, thậm chí không tạm thời. Bạn luôn có thể làm cho ứng dụng của bạn tin tưởng nhà phát hành chứng chỉ của máy chủ, do đó, chỉ cần làm điều đó. – dhams

Các vấn đề liên quan