Publicar JSON bruto usando o Retrofit 2

Aug 17 2020

Tenho um grande objeto JSON recebido de outro aplicativo e tenho que fazer uma pós-chamada para uma API usando o Retrofit 2. Todos os exemplos ou tópicos que encontro neste tópico usam um JSONObject ou um Map. Isso significa que tenho que analisar minha string (JSON) para criar o JSONObject ou Map.

Mas eu quero colocar diretamente minha corda no corpo de alguma forma.

Eu tentei desta forma, mas não funcionou:

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

Dessa forma, estou enviando uma string com escape como um corpo e meu JSON parece estranho: captura de tela

Respostas

1 Nemanja Aug 17 2020 at 22:07

Você precisa adicionar um Scalars Converter à lista de suas dependências Gradle, que cuidaria da conversão de objetos java.lang.String em corpos de solicitação text/plain, porque o Retrofit usa o conversor Gson por padrão. Verifique este link para a versão mais recente.

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

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

Em seguida, você precisa passar uma fábrica de conversores correta para sua construtora Retrofit. Posteriormente, ele informará ao Retrofit como converter o parâmetro @Body passado para o serviço.

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

Depois disso, é hora de configurar um serviço de Retrofit com um parâmetro de corpo String.

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