web-dev-qa-db-ja.com

baseUrlなしでRetrofitを設定する方法

私のapiPathは完全に動的です。 「ipAddress」や「SSLprotocol」などのフィールドを含むアイテムがあります。それらに基づいて私は私のURLを構築することができます:

private String urlBuilder(Server server) {
    String protocol;
    String address = "";

    if (AppTools.isDeviceOnWifi(activity)) {
        address = serverToConnect.getExternalIp();
    } else if (AppTools.isDeviceOnGSM(activity)) {
        address = serverToConnect.getInternalIp();
    }

    if (server.isShouldUseSSL()) {
        protocol = "https://";
    } else {
        protocol = "http://";
    }
    return protocol + address;
}

したがって、私のプロトコル+アドレスは次のようになります:http:// + 192.168.0.01:8010 = http://192.168.0.01:801

そして、私はそれをそのように使いたいです:

@FormUrlEncoded
@POST("{fullyGeneratedPath}/json/token.php")
Observable<AuthenticationResponse> authenticateUser(
            @Path("fullyGeneratedPath") String fullyGeneratedPath,
            @Field("login") String login,
            @Field("psw") String password,
            @Field("mobile") String mobile);

したがって、authenticateUserの絶対パスは http://192.168.0.01:8010/json/token.php になります-たとえば。

つまり、接続するサーバーに応じてbasePath全体を自分で作成するため、basePathは必要ありません。

私の改造セットアップは:

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient okHttpClient,
            Converter.Factory converterFactory,
            AppConfig appConfig) {
    Retrofit.Builder builder = new Retrofit.Builder();
    builder.client(okHttpClient)
            .baseUrl(appConfig.getApiBasePath())
            .addConverterFactory(converterFactory)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create());

    return builder.build();
}

BaseUrlを削除すると、このパラメーターが必要であるというエラーが発生します。そこで、apiBasePathを次のように設定しました。

public String getApiBasePath() {
    return "";
}

そして、レトロフィットインスタンスを作成した直後にエラーが発生します。

Java.lang.IllegalArgumentException: Illegal URL: 

それを解決するには?

22
F1sher

sourceNew URL resolving concept)から、ポストリクエストでパス全体を指定できます。

さらに、Retrofit 2.0では@Postで完全なURLを宣言することもできます。

public interface APIService {

    @POST("http://api.nuuneoi.com/special/user/list")
    Call<Users> loadSpecialUsers();

}

この場合、ベースURLは無視されます。

38
Inverce

このように使うだけ

public interface UserService {  
    @GET
    public Call<ResponseBody> profilePicture(@Url String url);
}

ソース

4
max

Retrofit 2では、とにかくベースURLを入力する必要があります。不明な場合は、任意のURLを指定できます。通常、http://localhost/を使用することをお勧めします。

1
ultraon

はい、できます。私はこのようにしました:

public APIHelper(BaseActivity activity) {

    String url = Common.getAPIUrl();

    RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(RestAdapter.LogLevel.FULL)
            .setEndpoint(url)
            .build();

    methods = restAdapter.create(IAppService.class);
}

基本的に、エンドポイントURLがわかったら、改造のオブジェクトを作成する必要があります。コードは自明であるため、これ以上の説明は必要ないと思います。

ベースURLのみが変更されていると仮定します。

0
Irfan Raza

API呼び出しを行うたびに新しいRestAdapterインスタンスを作成することに問題がない場合は、ベースURLをパラメーターとして使用して新しいアダプターを作成できます。

レトロフィットで絶対URLを使用

0
TheoKanning

改造を使用する私の方法

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.10.0'
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.8'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

そしてここに私はジェネリッククラスがあり、中には私のメソッドがあります

public static AppServiceApi setMyRetrofit(){
    Retrofit retrofit = null;
    AppServiceApi appServices = null;
    if (retrofit == null){
        Gson gson = new GsonBuilder()
                .setLenient()
                .create();                                                                                  //
        retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(getClient())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        appServices = retrofit.create(AppServiceApi.class);
    }
    return appServices;
}

public static OkHttpClient getClient(){
    HttpLoggingInterceptor interceptor=new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            /*.connectTimeout(15, TimeUnit.SECONDS)
            .writeTimeout(15, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)*/.build();
    return client;
}

appServiceApiインターフェースには、すべての終了URLとメソッドタイプがあります。

0
Tanmay Sahoo