Estoy usando Retrofit para acceder a una API RESTful. La URL base es:
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 extraño:
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?
Respuestas:
Retrofit 2 usa las mismas reglas que un
<a href="">
.El encabezado
/
de 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:Tenga en cuenta la URL incorrecta que se resolvió en la parte inferior.
Al eliminar el encabezado
/
, 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:En su ejemplo, no tiene 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 de él.fuente
http://api.example.com/service
+/album/featured-albums
no lo eshttp://api.example.com/album/featured-albums
). Y este error silencioso no se debe a nada más que si coloca el/
al final de la URL base o al principio de la URL de la API. ¿Hay casos de uso en los que este truncamiento sea útil?@POST
ir albaseUrl
(sin agregar ningúnpathSegment
s? Ejemplo:baseUrl
eshttp://api.example.com/album/featured-albums
y quiero que mi@POST
llamada vaya ahttp://api.example.com/album/featured-albums
(la misma URL que la base).@POST("")
java.lang.IllegalArgumentException: Missing either @POST URL or @Url parameter.
@Post(".")