Używam Retrofit, aby uzyskać dostęp do interfejsu API RESTful. Podstawowy adres URL to:
Oto kod interfejsu:
public interface ExampleService {
@Headers("Accept: Application/JSON")
@POST("/album/featured-albums")
Call<List<Album>> listFeaturedAlbums();
}
a tak wysyłam zapytanie i otrzymuję odpowiedź:
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();
dziennik, który otrzymuję, jest dziwną rzeczą:
V / Przykład ﹕ Odpowiedź {protokół = http / 1.1, kod = 404, wiadomość = nie znaleziono, url = http://api.example.com/album/featured-albums }
Co tu się dzieje?
Odpowiedzi:
Retrofit 2 wykorzystuje te same zasady, co w
<a href="">
przypadku.Początek
/
w Twoim względnym adresie URL informuje Retrofit, że jest to ścieżka bezwzględna na hoście. Oto przykład z prezentacji, którą przedstawiłem, pokazując to:Zwróć uwagę na nieprawidłowy adres URL, który został rozwiązany na dole.
Po usunięciu początkowego
/
adresu URL staje się on względny i łączy się z segmentami ścieżki, które są częścią podstawowego adresu URL. Poprawiony w prezentacji końcowy URL jest teraz poprawny:W twoim przykładzie nie masz końcowego
/
adresu URL. Prawdopodobnie chcesz dodać jeden, aby ścieżki względne były rozwiązywane na jego szczycie, a nie jako jego siostra.źródło
http://api.example.com/service
+/album/featured-albums
nie jesthttp://api.example.com/album/featured-albums
). I ten cichy błąd wynika z niczego innego, jak tylko z tego, czy umieścisz/
na końcu podstawowego adresu URL, czy na początku adresu URL interfejsu API. Czy są jakieś przypadki użycia, w których to obcięcie jest przydatne?@POST
dobaseUrl
(bez dodawaniapathSegment
? S Przykład:baseUrl
jesthttp://api.example.com/album/featured-albums
i chcę moje@POST
wezwanie, aby przejść dohttp://api.example.com/album/featured-albums
. (Tej samej zawartości jako zasady)@POST("")
rzucajava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
@Post(".")