Ich verwende Retrofit, um auf eine RESTful-API zuzugreifen. Die Basis-URL lautet:
Dies ist der Code für die Schnittstelle:
public interface ExampleService {
@Headers("Accept: Application/JSON")
@POST("/album/featured-albums")
Call<List<Album>> listFeaturedAlbums();
}
und so sende ich eine Anfrage und erhalte die Antwort:
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();
Das Protokoll, das ich bekomme, ist das Seltsame:
V / Beispiel ﹕ Antwort {Protokoll = http / 1.1, Code = 404, Nachricht = Nicht gefunden, URL = http://api.example.com/album/featured-albums }
Was ist denn hier los?
Antworten:
Nachrüstung 2 verwendet die gleichen Regeln wie ein Nachrüsten
<a href="">
.Der führende
/
Wert in Ihrer relativen URL teilt Retrofit mit, dass es sich um einen absoluten Pfad auf dem Host handelt. Hier ist ein Beispiel aus einer Präsentation, die ich gegeben habe:Beachten Sie die falsche URL, die unten behoben wurde.
Durch Entfernen der führenden
/
URL wird die URL dann relativ und wird mit den Pfadsegmenten kombiniert, die Teil der Basis-URL sind. In der Präsentation korrigiert, ist die endgültige URL jetzt korrekt:In Ihrem Beispiel haben Sie kein Trailing
/
in der Basis-URL. Sie möchten wahrscheinlich einen hinzufügen, damit relative Pfade darüber aufgelöst werden und nicht als Geschwister.quelle
http://api.example.com/service
+/album/featured-albums
ist nichthttp://api.example.com/album/featured-albums
). Und dieser stille Fehler ist nur darauf zurückzuführen, ob Sie die/
am Ende der Basis-URL oder an der Vorderseite der API-URL platzieren. Gibt es Anwendungsfälle, in denen diese Kürzung nützlich ist?@POST
zumbaseUrl
(ohnepathSegment
s hinzuzufügen ? Beispiel:baseUrl
isthttp://api.example.com/album/featured-albums
und ich möchte, dass mein@POST
Anruf zuhttp://api.example.com/album/featured-albums
(gleiche URL wie Basis) geht.@POST("")
Wirft einjava.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
@Post(".")