android - studio - retrofit post
Reemplazo de reemplazos de ruta: reemplazo en toda la ruta(incluyendo/) (5)
En mi configuración, obtengo todas las rutas para mis recursos desde la API REST desde una llamada inicial a la API. Utilizamos este patrón para poder cambiar todas las rutas de recursos sin romper todas las versiones de aplicaciones existentes en el proceso.
He estado jugando con Retrofit e intenté crear un método que aceptara cualquier ruta que le pase como una cadena. Mi intento se ve así
@GET("/{path}")
public FooBar getFooBar(@Path("path") String path);
Entonces trato de llamarlo de la siguiente manera.
String path = "foo/bar";
api.getFooBar(path);
Desafortunadamente, Retrofit URL-Codifica el reemplazo de la ruta y termino haciendo una solicitud a /foo%2Fbar
lugar de /foo/bar
. ¿Hay alguna manera de deshabilitar la codificación de URL para los reemplazos de ruta o hacer reemplazos que abarquen múltiples segmentos de ruta? Desafortunadamente, ni siquiera sé cuántos segmentos de ruta hay, todo está controlado por la API.
Hay errores conocidos, y puedes ver el informe de errores en: Retrofit @Github
También hay un enlace a posibles soluciones: Solution @Github
Al final, el mensaje de los desarrolladores de modificaciones es:
"Los reemplazos de ruta que abarcan múltiples segmentos de ruta no serán compatibles, debe usar @Url para crear la URL relativa completa mediante programación si el número de segmentos de ruta varía dinámicamente".
Entonces, si estás en problemas con la codificación, la solución puede ser:
Su API para GET:
@GET
Call<Object> Function(@Url String path, @Query("CONTENT") String content);
Su API para POST:
@FormUrlEncoded
@POST
Call<Object> Function(@Url String path, @Field("CONTENT") String content);
Y puedes llamarlo con esto:
String thePath = "www.foo.de/foo/foo2";
Call<Object> call = api.Function(thePath,content);
Así que con esto no tienes el problema de codificar algo.
Pero si solo está buscando la codificación normal en la versión 2. * La API tiene que ser así:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);
Saludos
Me enfrento al mismo problema y lo resuelvo como se muestra abajo
@POST(ApiKey.URL.add_edit_notice + "{id}")
@FormUrlEncoded
Call<GenericResponse> callAddNotice(@Path(value = "id", encoded = true) String id,
@Field("user_id") String user_id,
@Field("title") String title,
@Field("description") String description,
@Field("school_id") String school_id,
@Field("filename") String filename);
Probado y está funcionando ahora. La solución es simplemente agregar encoded = true para asegurarse de que la URL correcta sea alcanzada. p.ej:
@POST("{attendance_path}")
Single<Response> upLoadAttendence (@PartMap HashMap<String, RequestBody> postData,@Path(value = "attendance_path",encoded = true) String path);
Utilice @EncodedPath
! Eso es. Copiaré el Javadoc para que esta respuesta tenga más carne:
Sustitución con nombre en la ruta URL. Los valores se convierten en cadena utilizando
String.valueOf(Object)
. Los valores se utilizan literalmente sin codificación de URL. Ver@Path
para la codificación de URL equivalente.
Úsalo así:
@GET("/{path}") void example(@EncodedPath("path") String path, ..);
Ya que @EncodedPath está en desuso ahora
Reequipamiento 1.9:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);
Retrofit 2. *:
@GET("/{path}")
void example(@Path(value = "path", encoded = false) String path, ..);