J’utilise Retrofit pour accéder à une API RESTful. L’URL de base est:
http://api.example.com/service
Ceci est le code de l’interface:
public interface ExampleService { @Headers("Accept: Application/JSON") @POST("/album/featured-albums") Call<List> listFeaturedAlbums(); }
et voici comment j’envoie la demande et reçois la réponse:
new AsyncTask<Void, Void, Response<List>>() { @Override protected Response<List> 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> listCall) { Log.v("Example", listCall.raw().toSsortingng()); } }.execute();
le journal que je reçois est la chose étrange:
V / Exemple ﹕ Réponse {protocole = http / 1.1, code = 404, message = introuvable, url = http://api.exemple.com/album/featured-albums }
Que se passe t-il ici?
Retrofit 2 utilise les mêmes règles qu’un serait.
L’URL 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 leader /
, l’URL devient alors relative et se combine avec les segments de chemin faisant partie de l’URL de base. Corrigé dans la présentation, l’URL finale est maintenant correcte:
Dans votre exemple, vous ne disposez pas d’une URL de fin /
de base. Vous voudrez probablement en append un pour que les chemins relatifs soient résolus en plus plutôt que comme un frère.