Publicar JSON sin formato con Retrofit 2

Aug 17 2020

Tengo un objeto JSON grande recibido de otra aplicación y tengo que hacer una llamada posterior a una API usando Retrofit 2. Todos los ejemplos o temas que encuentro sobre este tema usan un JSONObject o un Mapa. Eso significa que tengo que analizar mi cadena (JSON) para crear el JSONObject o Map.

Pero quiero poner directamente mi cuerda en el cuerpo de alguna manera.

Lo intenté de esta manera, pero no funciona:

@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);

De esta manera, estoy enviando una cadena que se escapa como un cuerpo y mi JSON se ve extraño: captura de pantalla

Respuestas

1 Nemanja Aug 17 2020 at 22:07

Debe agregar un convertidor escalar a la lista de sus dependencias de Gradle, que se encargaría de convertir objetos java.lang.String en cuerpos de solicitud de texto/simple, porque Retrofit usa el convertidor Gson de manera predeterminada. Consulte este enlace para obtener la última versión.

https://search.maven.org/search?q=g:com.squareup.retrofit2%20a:converter-scalars

dependencies {
    implementation “com.squareup.retrofit2:converter-scalars:2.4.0”
    ..
}

Luego, debe pasar una fábrica de convertidores correcta a su constructor Retrofit. Más tarde le dirá a Retrofit cómo convertir el parámetro @Body pasado al servicio.

val retrofit = Retrofit.Builder()
        .client(okHttpClient)
        .baseUrl("/")
        .addConverterFactory(ScalarsConverterFactory.create())
        .build()

Después de esto, es hora de configurar un servicio de actualización con un parámetro de cuerpo de cadena.

@Headers("Content-Type: application/json")
@POST("transactions")
Call<Void> submitTransaction(@Body String body);