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-адресе. Вы, вероятно, захотите добавить его так, чтобы относительные пути разрешались поверх него, а не как его родной брат.