私の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:
それを解決するには?
source (New URL resolving concept)から、ポストリクエストでパス全体を指定できます。
さらに、Retrofit 2.0では@Postで完全なURLを宣言することもできます。
public interface APIService { @POST("http://api.nuuneoi.com/special/user/list") Call<Users> loadSpecialUsers(); }
この場合、ベースURLは無視されます。
このように使うだけ
public interface UserService {
@GET
public Call<ResponseBody> profilePicture(@Url String url);
}
Retrofit 2では、とにかくベースURLを入力する必要があります。不明な場合は、任意のURLを指定できます。通常、http://localhost/
を使用することをお勧めします。
はい、できます。私はこのようにしました:
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のみが変更されていると仮定します。
API呼び出しを行うたびに新しいRestAdapter
インスタンスを作成することに問題がない場合は、ベースURLをパラメーターとして使用して新しいアダプターを作成できます。
改造を使用する私の方法
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とメソッドタイプがあります。