J'utilise Retrofit pour accéder à une API RESTful. L'URL de base est:
Voici le code de l'interface:
public interface ExampleService {
@Headers("Accept: Application/JSON")
@POST("/album/featured-albums")
Call<List<Album>> listFeaturedAlbums();
}
et voici comment j'envoie la demande et reçois la réponse:
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();
le journal que je reçois est la chose étrange:
V / Exemple ﹕ Réponse {protocol = http / 1.1, code = 404, message = Not Found, url = http://api.example.com/album/featured-albums }
Que se passe t-il ici?
Réponses:
Retrofit 2 utilise les mêmes règles qu'un
<a href="">
.Le début
/
de votre URL relative indique à Retrofit qu'il s'agit d'un chemin absolu sur l'hôte. Voici un exemple d'une présentation que j'ai donnée montrant ceci:Notez l'URL incorrecte qui a été résolue en bas.
En supprimant le début
/
, l'URL devient alors relative et se combinera avec les segments de chemin qui font partie de l'URL de base. Corrigé dans la présentation, l'URL finale est maintenant correcte:Dans votre exemple, vous n'avez pas de fin
/
sur l'URL de base. Vous voudrez probablement en ajouter un afin que les chemins relatifs soient résolus par-dessus plutôt qu'en tant que frère.la source
http://api.example.com/service
+/album/featured-albums
n'est pashttp://api.example.com/album/featured-albums
). Et cette erreur silencieuse ne provient de rien d'autre que de savoir si vous placez le/
à la fin de l'URL de base ou à l'avant de l'URL de l'API. Y a-t-il des cas d'utilisation où cette troncature est utile?@POST
lebaseUrl
(sans ajouter depathSegment
s? Exemple:baseUrl
esthttp://api.example.com/album/featured-albums
et je veux que mon@POST
appel aille àhttp://api.example.com/album/featured-albums
(même URL que la base).@POST("")
java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
@Post(".")