Привет, я пытаюсь переопределить baseUrl из одного конкретного вызова api, и, похоже, он не работает при использовании @Url в качестве параметра для метода api.
Ниже мой метод класса Api
@POST
fun getUserDetails(@Body body: request, @Url authUrl : String): Single<Response<ResponseData>>
код, который вызывает и делает запрос
private fun getApi(): Api {
val gson = GsonBuilder().setLenient().create()
val httpClient = myNetworkHelper.createHttpClient()
val retrofit = Retrofit.Builder()
.baseUrl("http://defaultBaseUrl")
.client(httpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build()
return retrofit.create(Api::class.java)
}
override fun getUserDetails(someRequestData, "http://dynamic/getuserDetails): Single<Response<ResponseData>> {
return getApi().getUserDetails(body, url)
}
Вышеупомянутые результаты приводят к отправке запроса на этот URL-адрес
http://defaultBaseUrl/http://dynamic/getuserDetails
Вместо:
http://dynamic/getuserDetails
Это документ из аннотации Retrofit @GET:
@Documented
@Target(METHOD)
@Retention(RUNTIME)
public @interface GET {
/**
* A relative or absolute path, or full URL of the endpoint. This value is optional if the first
* parameter of the method is annotated with {@link Url @Url}.
* <p>
* See {@linkplain retrofit2.Retrofit.Builder#baseUrl(HttpUrl) base URL} for details of how
* this is resolved against a base URL to create the full endpoint URL.
*/
String value() default "";
}
Итак, @Url следует поместить в качестве первого параметра, так что я думаю, что это сработает:
@POST
fun getUserDetails(@Url authUrl: String, @Body body: request): Single<Response<ResponseData>>
Вы пытались добавить / в конец базового URL, например "http://defaultBaseUrl/"?
Вы можете предоставить какой-нибудь документ? Может быть, это правда, потому что это работает для меня, и мой тоже запрос GET
@TamHuynh попробуйте написать в сообщении и посмотрите, что произойдет?
@jonney Это основано на этот комментарий
На самом деле, проверяя исходный код, нет никаких доказательств того, что @Url работает только с запросами GET, поэтому я не знаю, правда это на самом деле или нет, я буду искать глубже
Я попробую, как только смогу
Хорошо, я провел тест с помощью POST, и базовый URL-адрес переопределен, если вы используете @Url в первом параметре.
Это давний пост, и теперь я тоже могу это подтвердить: первое аннотированное переопределение @Url работает как для GET, так и для POST
Я провел локальный тест и на самом деле смог переопределить базовый URL-адрес, установленный в экземпляре Retrofit.
Вот API:
public interface Api {
@POST
Call<Void> fakeService(@Url String url);
}
А вот и «клиент»:
public class Main {
public static void main(String[] args) throws IOException {
// Use the HttpLogginInterceptor to check what's the real call
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
OkHttpClient client = new OkHttpClient.Builder()
.addNetworkInterceptor(interceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.foo.com/")
.client(client)
.build();
Api api = retrofit.create(Api.class);
Call<Void> call = api.fakeService("http://www.example.com");
call.execute();
}
}
Результат:
Jul 18, 2018 12:28:54 PM okhttp3.internal.platform.Platform log
INFO: --> POST http://www.example.com/ (0-byte body)
Jul 18, 2018 12:28:55 PM okhttp3.internal.platform.Platform log
INFO: <-- 200 OK http://www.example.com/ (366ms, unknown-length body)
К сожалению, это не помогло изменить параметры. Он по-прежнему включает базовый URL