Retrofit 2 удаляет символы после имени хоста из базового URL-адреса

Я использую Retrofit для доступа к RESTful api. Базовый URL-адрес:

http://api.example.com/service

Это код интерфейса:

public interface ExampleService {
    @Headers("Accept: Application/JSON")
    @POST("/album/featured-albums")
    Call<List<Album>> listFeaturedAlbums();
}

и вот как я отправляю запрос и получаю ответ:

new AsyncTask<Void, Void, Response<List<Album>>>() {

        @Override
        protected Response<List<Album>> doInBackground(Void... params) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://api.example.com/service")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

            ExampleService service = retrofit.create(ExampleService.class);

            try {
                return service.listFeaturedAlbums().execute();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Response<List<Album>> listCall) {
            Log.v("Example", listCall.raw().toString());
        }
    }.execute();

журнал, который я получаю, - это странная вещь:

V/Example: Response {protocol = http/1.1, code = 404, message = Not Found, url = http://api.example.com/album/featured-albums}

Что здесь происходит?

Ответ 1

Retrofit 2 использует те же правила, что и <a href="">.

Ведущий / на вашем относительном URL говорит Retrofit, что это абсолютный путь на хосте. Вот пример из презентации, которую я дал:

введите описание изображения здесь

Обратите внимание на неправильный URL-адрес, который был разрешен внизу.

Удалив ведущий /, URL-адрес становится относительным и объединяется с сегментами пути, которые являются частью базового URL-адреса. Исправленный в презентации окончательный URL-адрес теперь корректен:

введите описание изображения здесь

В вашем примере у вас нет конечного / на базовом URL-адресе. Вы, вероятно, захотите добавить его так, чтобы относительные пути разрешались поверх него, а не как его родной брат.