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
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);
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.
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.