Retrofit 2 видаляє символи після імені хоста з базової URL-адреси


121

Я використовую Retrofit для доступу до програми RESTful. Основна 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 / Приклад ﹕ Відповідь {протокол = http / 1.1, код = 404, повідомлення = Не знайдено, url = http://api.example.com/album/featured-albums }

Що тут відбувається?


Ви могли б вирішити питання? тому що я також стикаюся з тим же питанням. і навіть після того, як я спробую правильну відповідь, я завжди отримую невдачу
Parth Anjaria

Відповіді:


283

У Retrofit 2 використовуються ті самі правила, що і <a href="">в.

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

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

Зверніть увагу на неправильну URL-адресу, яку було вирішено внизу.

Видаляючи провідну /, URL-адреса потім стає відносною та поєднується з сегментами шляху, які є частиною базової URL-адреси. Виправлена ​​в презентації кінцева URL-адреса тепер правильна:

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

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


12
Я не дуже розумію, чому цей новий тип роздільної здатності вигідніший. Все, що ви можете отримати від нього - це приховані помилки (як, наприклад, зазначені цим запитанням) та контрінтуїтивні результати ( http://api.example.com/service+ /album/featured-albumsні http://api.example.com/album/featured-albums). І ця мовчазна помилка випливає з нічого, крім того, чи розміщуєте ви її /в кінці базової URL-адреси чи внизу URL-адреси API. Чи є випадки використання, коли це усічення корисне?
EpicPandaForce


11
Для мене це має сенс після перегляду презентації, але було б чудово додати невелику замітку на веб-сайт. Знадобилося мені кілька хвилин, щоб з’ясувати, що пішло не так.
Альберт Віла Кальво

8
@JakeWharton, як мені @POSTдо baseUrl(без додавання pathSegments? Приклад: baseUrlє, http://api.example.com/album/featured-albumsі я хочу, щоб мій @POSTдзвінок перейшов http://api.example.com/album/featured-albums(та сама URL, що і база). @POST("") Кидає ajava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
ZakTaccardi

17
Використання@Post(".")
Джейк Уортон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.