2017-04-06 125 views
0

嗯,我有問題與我的https網址連接,所有與郵遞員合作,但我不能用我的Android應用程序來完成,有人可以幫我嗎? Image of code.HTTPS不能與OkHttp3和Retrofit2一起使用

public class NetworkUtil{ 
public static RetrofitInterface getRetrofit(){ 
    return new Retrofit.Builder() 
      .baseUrl(Constants.BASE_URL) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build().create(RetrofitInterface.class); 
} 
public static RetrofitInterface getRetrofit(String email, String password) { 
    String credentials = email + ":" + password; 
    String basic = "Basic " + Base64.encodeToString(credentials.getBytes(),Base64.NO_WRAP); 

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

    httpClient.addInterceptor(chain -> { 
     Request original = chain.request(); 
     Request.Builder builder = original.newBuilder() 
       .addHeader("Authorization", basic) 
       .method(original.method(),original.body()); 
     return chain.proceed(builder.build()); 
    }); 
    return new Retrofit.Builder() 
      .baseUrl(Constants.BASE_URL) 
      .client(httpClient.build()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build().create(RetrofitInterface.class); 
} 

我需要令牌身份驗證,我怎麼可以添加到okhttp?

public static RetrofitInterface getRetrofit(String token) { 
    OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 

    httpClient.addInterceptor(chain -> { 
     Request original = chain.request(); 
     Request.Builder builder = original.newBuilder() 
       .addHeader("x-access-token", token) 
       .method(original.method(),original.body()); 
     return chain.proceed(builder.build()); 
    }); 
    return new Retrofit.Builder() 
      .baseUrl(Constants.BASE_URL) 
      .client(okHttpClient) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build().create(RetrofitInterface.class); 
} 
} 

在此先感謝!

+1

LogCat中有任何錯誤消息嗎?另外,您的證書是否自簽名? – Noiseapps

+0

我在LogCat上沒有任何錯誤,而且我的證書自簽名是原始的,但我不知道如何在Android上使用它。這一切都在我的node.js服務器上工作,唯一的問題是Android。 –

+0

嘗試這種方法,信任所有證書 - [鏈接](http://stackoverflow.com/questions/25509296/trusting-all-certificates-with-okhttp)。 – Noiseapps

回答

0

嘗試使用此代碼HTTPS與OkHttp3和Retrofit2

創建API接口

public interface API { 

@GET("https://stackoverflow.com/users/{user}") 
Observable<Result<User>> getUser(@Path("user") String user); 
} 

創建一個包含OKHttp3和retrofit2初始化和基礎URL

public class ApiManager { 

Context context; 
public static final String BASE_URL = "https://api.github.com/"; 


private OkHttpClient okHttpClient; 
private Authenticator authenticator = new Authenticator() { 
    @Override 
    public Request authenticate(Route route, Response response) { 
     return null; 
    } 
}; 


private ApiManager() { 
} 

public void setAuthenticator(Authenticator authenticator) { 
    this.authenticator = authenticator; 
} 


public static class Builder { 
    String email, password; 
    ApiManager apiManager = new ApiManager(); 

    public Builder setAuthenticator(Authenticator authenticator) { 
     apiManager.setAuthenticator(authenticator); 
     return this; 
    } 

    public ApiManager build(String param_email, String param_password) { 
     this.email = param_email; 
     this.password = param_password; 
     return apiManager.newInstance(email, password); 
    } 

} 

public class RequestTokenInterceptor implements Interceptor { 
    String email, password; 
    String credentials, basic; 
    public RequestTokenInterceptor(String email, String password) { 
     this.email = email; 
     this.password = password; 
     credentials = email + ":" + password; 
     basic = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP); 
    } 



    @Override 
    public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request original = chain.request(); 
     Request.Builder builder = original.newBuilder() 
       .addHeader("Authorization", basic) 
       .method(original.method(), original.body()); 
     return chain.proceed(builder.build()); 
    } 
} 

private ApiManager newInstance(String email, String password) { 
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() { 
     @Override 
     public void log(String message) { 
      Log.i("http", message); 
     } 
    }); 
    logging.setLevel(HttpLoggingInterceptor.Level.BODY); 


    okHttpClient = new OkHttpClient.Builder() 
      .addInterceptor(logging) 
      .addInterceptor(new RequestTokenInterceptor(email, password)) 
      .authenticator(authenticator) 
      .build(); 


    return this; 
} 


public <T> T createRest(Class<T> t) { 
    Retrofit retrofit = new Retrofit.Builder() 

      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) 
      .client(okHttpClient) 
      .build(); 

    return retrofit.create(t); 
    } 

} 

在搖籃apiManager類工作添加庫

compile 'com.squareup.okhttp3:okhttp:3.4.1' 
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.4.1' 
compile 'com.squareup.okhttp3:logging-interceptor:3.4.1' 
compile 'com.squareup.okhttp3:okhttp-ws:3.4.1' 
compile 'com.squareup.retrofit2:retrofit:2.0.2' 
compile 'com.squareup.retrofit2:converter-gson:2.0.2' 
compile 'com.squareup.retrofit2:adapter-rxjava:2.0.2' 

在MainActivity添加

public class MainActivity extends AppCompatActivity { 

private ProgressDialog feedbackDialog; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    feedbackDialog = new ProgressDialog(this); 
    feedbackDialog.setCanceledOnTouchOutside(false); 

    getUser(); 
} 
public void getUser() { 

    API accountAPI4 = createRestApi4(); 
    if (accountAPI4 != null) { 
     showFeedback(getResources().getString(R.string.loading)); 
     BackgroundThreadObservable.toBackground(accountAPI4.getUser("SafAmin")) 
       .subscribe(new Action1<Result<User>>() { 
           @Override 
           public void call(Result<User> user) { 
            dismissFeedback(); 
            Log.e("GIT_HUB","Github Name :"+user.response().body().getName()+"\nWebsite :"+user.response().body().getBlog()); 
           } 
          }, new Action1<Throwable>() { 
           @Override 
           public void call(Throwable throwable) { 
            // do something with the error 
            if (throwable != null) { 
             dismissFeedback(); 
            } 
           } 
          } 
       ); 
    } else { 
     dismissFeedback(); 
    } 
} 

public static API createRestApi4() { 
    ApiManager apiManager = new ApiManager.Builder().build(email, password); 
    return apiManager.createRest(API.class); 
} 

public void showFeedback(String message) { 
    feedbackDialog.setMessage(message); 

    feedbackDialog.show(); 
} 

public void dismissFeedback() { 
    feedbackDialog.dismiss(); 
} 
} 

在AndroidManifest添加

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

希望它能幫助。

+0

我需要用httpClient.addInterceptor添加一個攔截器代碼 –

+0

用攔截器編輯的代碼,請添加您的實際「電子郵件」和「密碼」。希望這可以幫助。 – Safa

+0

我在我的登錄活動中從EditText獲取電子郵件和密碼。 –

相關問題