Retrofit ruta de las sustituciones: reemplazo largo de toda la ruta (incluidas)

En mi configuración, tengo todos los caminos para mi los recursos de la API de REST de una primera llamada a la API. Podemos usar este patrón para ser capaz de cambiar todas las rutas de acceso a recursos sin romper todas las versiones de la aplicación en el proceso.

He estado jugando con la modernización y traté de crear un método que aceptaría cualquier ruta que pase a una cadena de texto. Mi tratar este aspecto

@GET("/{path}")
public FooBar getFooBar(@Path("path") String path);

Yo intente llamar de la siguiente manera.

String path = "foo/bar";
api.getFooBar(path);

Lamentablemente Retrofit URL Codifica la ruta de reemplazo y me acaban de hacer una petición a /foo%2Fbar en lugar de /foo/bar. Hay alguna forma de desactivar la Codificación URL de la ruta de los repuestos o para hacer reemplazos que abarca varios segmentos de la ruta? Por desgracia, yo no sé ni cómo muchos segmentos de la ruta hay, todo es controlado por el API.

InformationsquelleAutor Thrakbad | 2014-05-23

5 Kommentare

  1. 44

    Uso @EncodedPath! Eso es todo. Voy a copiar el Javadoc por lo que esta respuesta tiene más carne:

    Nombre de reemplazo en la ruta de la URL. Los valores se convierten en una cadena String.valueOf(Object). Se utilizan los valores de, literalmente, sin la codificación URL. Ver @Path de codificación de URL equivalente.

    Usarlo como este:

    @GET("/{path}")
    void example(@EncodedPath("path") String path, ..);
    • Yo no puedo probarlo ahora mismo, pero como es tan dolorosamente obvio, voy a confiar en usted y aceptar la respuesta. Muchas gracias! 🙂
    • Creo que @EncodedPath ha quedado obsoleto ahora.
    • Sí. Como de la versión 1.7.0 puede utilizar @Path y una de sus banderas.
    • void notEncoded(@Path(valor=»nombre», codificar=false) String nombre);
    • Ninguna de las soluciones anteriores funciona con la modernización de 2.0. He creado un tema para esto en github.com/square/retrofit/issues/1364
    • El uso de @Code_Life solución, como @EncodedPath era obsoleto. Uso @Path(value = "link", encode = false) String link

  2. 18

    Ya que @EncodedPath es obsoleto ahora

    Retrofit 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, ..);
    • Funcionó para mí, pero he cambiado codificado=true, en retrofit 2.3.
    • de la codificación de la bandera en realidad significa esto: verdad – me hizo la codificación de mí mismo muchas gracias falsos hacer la codificación para mí por favor. que la ambigüedad, por decir lo menos!
  3. 10

    Hay bugs conocidos, y usted puede ver el informe de fallo en:
    Retrofit @Github

    También hay un enlace a las posibles soluciones: Solución De @Github

    Al final, el mensaje de la reconversión de los desarrolladores es:

    «Ruta de los reemplazos que abarcan varios segmentos de la ruta no va a ser compatible, usted debe usar @Url para crear una completa relativa URL mediante programación si el número de segmentos de la ruta varía dinámicamente.»

    Así que si usted está en problemas con la codificación, la solución puede ser:

    Su API para OBTENER:

    @GET
    Call<Object> Function(@Url String path, @Query("CONTENT") String content);

    Su API para el POST:

    @FormUrlEncoded
    @POST
    Call<Object> Function(@Url String path, @Field("CONTENT") String content);

    Y que se le puede llamar con este:

    String thePath = "www.foo.de/foo/foo2";
    Call<Object> call = api.Function(thePath,content);

    Así que con esto usted no tiene el problema para codificar algo.

    Pero si solo estás buscando el normal codificar en la versión 2.* la API tiene que ser como esta:

    @GET("/{path}")
    void example(@Path(value = "path", encoded = false) String path, ..);

    Que respecta a

    • Sí, se lo cambió a partir de codificar codificados con 2.0.0
  4. 0

    Que enfrentan el mismo problema y resolverlo como a continuación el código

     @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);
  5. 0

    Probado y su trabajo ahora.
    La solución es simplemente agregar codificado = true para asegurarse de la Correcta dirección url es golpeado.
    por ejemplo:

    @POST("{attendance_path}")
    Single<Response> upLoadAttendence (@PartMap HashMap<String, RequestBody> postData,@Path(value = "attendance_path",encoded = true) String path);

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea