Pubblica JSON non elaborato utilizzando Retrofit 2

Aug 17 2020

Ho un grande oggetto JSON ricevuto da un'altra applicazione e devo effettuare una chiamata post a un'API utilizzando Retrofit 2. Tutti gli esempi o argomenti che trovo su questo argomento utilizzano un oggetto JSON o una mappa. Ciò significa che devo analizzare la mia stringa (JSON) per creare JSONObject o Map.

Ma voglio mettere direttamente la mia corda nel corpo in qualche modo.

Ho provato in questo modo, ma non funziona:

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

In questo modo sto inviando una stringa con escape come corpo e il mio JSON sembra strano: screenshot

Risposte

1 Nemanja Aug 17 2020 at 22:07

È necessario aggiungere un convertitore Scalars all'elenco delle dipendenze Gradle, che si occuperebbe di convertire gli oggetti java.lang.String in corpi di richiesta di testo/semplici, poiché Retrofit utilizza il convertitore Gson per impostazione predefinita. Controllare questo collegamento per l'ultima versione.

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

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

Quindi, devi passare una fabbrica di convertitori corretta al tuo costruttore di retrofit. Successivamente dirà a Retrofit come convertire il parametro @Body passato al servizio.

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

Successivamente, è il momento di impostare un servizio Retrofit con un parametro String body.

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