volley studio implementar example android retrofit

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, ..);