Retrofit 2 elimina los caracteres después del nombre de host de la URL base

3 minutos de lectura

Estoy usando Retrofit para acceder a una API RESTful. La URL base es:

http://api.ejemplo.com/servicio

Este es el código de la interfaz:

public interface ExampleService {
    @Headers("Accept: Application/JSON")
    @POST("/album/featured-albums")
    Call<List<Album>> listFeaturedAlbums();
}

y así es como envío la solicitud y recibo la respuesta:

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();

el registro que obtengo es lo raro:

V/Ejemplo﹕ Respuesta{protocolo=http/1.1, código=404, mensaje=No encontrado, url=http://api.example.com/album/featured-albums}

¿Que está pasando aqui?

  • pudiste solucionar el problema? ya que también estoy enfrentando el mismo problema. e incluso después de intentar la respuesta correcta, siempre obtengo un error

    – Parth Anjaria

    12 de septiembre de 2017 a las 11:02

Retrofit 2 utiliza las mismas reglas que un <a href=""> haría.

El líder / en su URL relativa le dice a Retrofit que es una ruta absoluta en el host. Aquí hay un ejemplo de una presentación que di mostrando esto:

ingrese la descripción de la imagen aquí

Tenga en cuenta la URL incorrecta que se resolvió en la parte inferior.

Al eliminar el líder /, la URL se vuelve relativa y se combinará con los segmentos de ruta que forman parte de la URL base. Corregido en la presentación la URL final ahora es correcta:

ingrese la descripción de la imagen aquí

En tu ejemplo no tienes un final / en la URL base. Probablemente desee agregar uno para que las rutas relativas se resuelvan sobre él en lugar de como un hermano.

  • Realmente no entiendo por qué este nuevo tipo de resolución de URL es más beneficioso. Todo lo que puede obtener de él son errores ocultos (como se indica en esta pregunta) y resultados contrarios a la intuición ( http://api.example.com/service + /album/featured-albums no es http://api.example.com/album/featured-albums ). Y este error silencioso se deriva nada más que de si coloca el / al final de la URL base o al principio de la URL de la API. ¿Hay algún caso de uso en el que este truncamiento sea útil?

    – EpicPandaForce

    21/09/2015 a las 19:21

  • Aquí tenéis el vídeo de la presentación

    –Alberto Vila Calvo

    21 de octubre de 2015 a las 13:49

  • Tiene sentido para mí después de ver la presentación, pero sería genial agregar una pequeña nota al sitio web. Me tomó algunos minutos descubrir qué estaba pasando.

    –Alberto Vila Calvo

    21/10/2015 a las 13:51


  • @JakeWharton ¿cómo puedo @POST hacia baseUrl (sin añadir nada pathSegment¿s? Ejemplo: baseUrl es http://api.example.com/album/featured-albums y quiero mi @POST llamar para ir a http://api.example.com/album/featured-albums (misma URL que la base). @POST("") lanza un java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.

    – Zak Taccardi

    29 de marzo de 2016 a las 15:42


  • Usar @Post(".")

    –Jake Warton

    31 de marzo de 2016 a las 4:25

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad