web-dev-qa-db-fra.com

Retrofit 2 avec uniquement des données de formulaire

J'essaie de faire une demande POST à l'aide de Retrofit 2. Le type de demande est form-data PAS application/x-www-form-urlencoded.

Je ne publie que des données et non les fichiers de la demande et la réponse est au format JSON.

J'ai essayé @FormUrlEncoded, @Multipart Mais ça ne fonctionne pas.

J'ai essayé de suivre la demande

1. Première tentative

@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlanName(@Field(Constants.ACTION_ID) String actionId, @Field(Constants.OFFER_CODE) String offerCode);

2. Deuxième tentative

@Headers({"Content-Type: multipart/form-data","Content-Type: text/plain"})
@FormUrlEncoded
@POST("XXXX")
Call<PlanResponse> getPlans(@Body @FieldMap(encoded = false) Map<String, String> data);

. Troisième tentative

@Headers("Content-Type: multipart/form-data")
@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) String actionId, @Part(Constants.OFFER_CODE) String offerCode);

Je ne reçois que le corps null. Il travaille avec le POSTMAN.

J'ai aussi des recherches sur form-data et application/x-www-form-urlencoded et a constaté que si les données sont binaires, utilisez form-data et si les données sont ASCII alors utilisez application/x-www-form-urlencoded

J'essaie de trouver les données de formulaire ne sont-elles pas prises en charge par la mise à niveau?

Demande POSTMAN

Cache-Control: no-cache
Postman-Token: XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXX
Content-Type: multipart/form-data; boundary=----    WebKitFormBoundaryXXXXXXXXXXXX


 ----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="actionId"

1000
 ----WebKitFormBoundaryXXXXXXXXXXXX
Content-Disposition: form-data; name="offerCode"

MYCODE
----WebKitFormBoundaryXXXXXXXXXXXX

Je ne peux ajouter que du code généré HTTP extrait de POSTMAN

17
Akshay Taru

Dans la mise à niveau 2.0 pour effectuer une requête POST comme ci-dessus, vous devez utiliser le type RequestBody pour votre paramètre comme celui-ci.

@Multipart
@POST("XXXX")
Call<PlanResponse> myPlans(@Part(Constants.ACTION_ID) RequestBody actionId, @Part(Constants.OFFER_CODE) RequestBody offerCode);

Et voici comment obtenir requestBody de String.

String somevalue = "somevalue";
RequestBody body = RequestBody.create(MediaType.parse("text/plain"), somevalue);
30
ikhsan

Voici une autre solution utilisant le corps de la demande:

RequestBody requestBody = new MultipartBody.Builder()
        .setType(MultipartBody.FORM)
        .addFormDataPart("param1", param1)
        .addFormDataPart("param2", param2)
        .build();

apiInterface.somePostMethod(requestBody).enqueue(
    //onResponse onFailure methods
);

voici mon interface api POST

@POST("somePostMethod")
Call<ResponseBody> somePostMethod(@Body RequestBody body);

J'espère que ça aide.

21
Monster Brain

Je voulais transmettre un tableau d'ID à une demande existante.

J'ai essayé plusieurs variantes d'ici, Retrofit - Envoyer le corps de la demande sous forme de tableau ou de numéro , Comment envoyer une demande PUT avec une chaîne de modification et une liste de tableaux du modèle dont j'ai besoin pour utiliser l'URL encodée , mais ils n'ont pas fonctionné. Ensuite, j'ai essayé Android retrofit send array as x-www-form-urlencoded .

J'ai ajouté [] à un paramètre de liste et List à son type:

@FormUrlEncoded
@POST("your_request/")
fun sendIds(
    @Field("token") token: String,
    @Field("city_id") cityId: Int?,
    @Field("description") description: String,
    @Field("ids[]") ids: List<Int>? // Add '[]' here.
): Deferred<YourResponse>

Puis je l'ai appelé comme d'habitude (avec les coroutines Kotlin):

api.sendIds("f0123abc", null, "description", listOf(1, 2, 3)).await()

Voir aussi Est-il possible d'envoyer un tableau avec Postman Chrome? pour comprendre à quoi il ressemble dans Postman.

0
CoolMind