Я использую Retrofit для доступа к RESTful api. Базовый URL-адрес:
Это код интерфейса:
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 }
Что тут происходит?
Ответы:
В Retrofit 2 используются те же правила, что и в Retrofit 2
<a href="">
.Начало
/
в вашем относительном URL-адресе сообщает Retrofit, что это абсолютный путь на хосте. Вот пример из презентации, которую я показал, показывая это:Обратите внимание на неправильный URL-адрес, который был разрешен внизу.
После удаления ведущего
/
URL-адрес становится относительным и объединяется с сегментами пути, которые являются частью базового URL-адреса. Исправлено в презентации, теперь конечный URL верен:В вашем примере у вас нет конца
/
базового URL. Вероятно, вы захотите добавить один, чтобы относительные пути разрешались поверх него, а не как его брат.источник
http://api.example.com/service
+/album/featured-albums
- нетhttp://api.example.com/album/featured-albums
). И эта скрытая ошибка возникает только из-за того, помещаете ли вы/
в конец базового URL-адреса или перед URL-адресом API. Есть ли какие-либо варианты использования, в которых это усечение полезно?@POST
перейти кbaseUrl
(без добавленияpathSegment
s? Пример:baseUrl
есть,http://api.example.com/album/featured-albums
и я хочу, чтобы мой@POST
звонок шелhttp://api.example.com/album/featured-albums
(тот же URL-адрес, что и база).@POST("")
java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
@Post(".")