Empêcher la modification d’encoder mon corps de requête http

J’essaie de passer une chaîne du format ci-dessous comme corps d’une requête de publication http.

param1=PARAM1&param2=PARAM2&param3=PARAM3 

Mais la conversion code mon corps de telle sorte que = devient \ u003d et & devient \ u0026. Et je me retrouve avec une chaîne qui ressemble à ceci:

 param1\u003dPARAM1\u0026param2\u003dPARAM2\u0026param3\u003dPARAM3 

Comment puis-je empêcher cela?

Mon api de mise à niveau est défini comme suit.

 public interface RestAPI { @POST("/oauth/token") public void getAccessToken(@Body Ssortingng requestBody, Callback response); } 

Pour répondre directement à la question, vous pouvez utiliser TypedSsortingng comme type de paramètre de méthode. La raison pour laquelle la valeur a été modifiée est parce que Retrofit confie la Ssortingng à Gson afin d’encoder au format JSON. L’utilisation de TypedSsortingng ou de toute sous-classe TypedOutput empêchera ce problème, en indiquant à Retrofit que vous allez gérer vous-même la création du corps de la demande directe.

Toutefois, ce format de charge est appelé codage d’URL de formulaire. La modernisation a un support natif pour cela. Votre déclaration de méthode devrait en réalité ressembler à ceci:

 @FormUrlEncoded @POST("/oauth/token") void getAccessToken( @Field("param1") Ssortingng param1, @Field("param2") Ssortingng param2, @Field("param3") Ssortingng param3, Callback callback); 

Si vous avez une classe sérialisée (telle qu’une HashMap) dans le corps de la demande et que vous souhaitez empêcher son encodage (comme dans vezikon et mon problème), vous pouvez créer une Gson personnalisée avec échappement désactivé en utilisant:

 Gson gson = new GsonBuilder().disableHtmlEscaping().create(); 

Passez ce convertisseur à votre adaptateur de repos:

 yourRestAdapter = new RestAdapter.Builder() .setEndpoint(.....) .setClient(.....) .setConverter(new GsonConverter(gson)) .build(); 

De cette façon, les caractères “=” dans le corps du message restnt intacts lors de la soumission.

Ce problème peut être résolu avec la solution ci-dessous.

 @POST("yourSsortingng") Call yourCallMethod(@Query("yourKey") Ssortingng yourValue, @Query("yourKey") Ssortingng yourValue, @Query("yourKey") Ssortingng yourValue); 

Remarque: n’utilisez pas “@FormUrlEncoded” dans ce cas.

Référence ici – https://github.com/square/retrofit/issues/1407

Utiliser Kotlin

Pour le rattrapage 2, vous pouvez initialiser le rattrapage avec un convertisseur Gson en usine.

 val builder = GsonBuilder().disableHtmlEscaping().create() val retrofit = Retrofit.Builder() .baseUrl(baseUrl) .addConverterFactory(ScalarsConverterFactory.create()) .addConverterFactory(GsonConverterFactory.create(builder)) .client(monoOkHttpClient()) .build() 

Ce constructeur doit supprimer l’échappement de votre sortie JSON.

Dépendances du fichier Gradle:

 implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:converter-scalars:2.1.0' implementation 'com.squareup.retrofit2:converter-gson:2.3.0'