2017-08-31 11 views
1

J'ai une API qui attend une liste d'exercices en entrée:Rénovation Android - Liste Passez des objets en tant que tableau associatif

exercises[0][duration]=10 
exercises[0][type]=jump 
exercises[1][duration]=20 
exercises[1][type]=roll 

Côté Android, j'ai ma classe API construit en utilisant Rénovation. Comment passer mon List<Exercise> à la méthode API pour obtenir les paramètres ci-dessus?

essayé Actuellement:

@FormUrlEncoded 
@POST("api/v1/patient/{id}/workout") 
fun addPatientWorkout(@Path("id") id: Long, 
         @Field("title") title: String, 
         @Field("exercises[]") exercises: List<Map<String,String>>) 
     : Single<Response<Workout>> 

Mais cela ne donne pas ce que je pense. Au lieu de cela:

exercises[]={duration:10, type=jump}&exercises[]={duration:20, type=roll}

+0

Je passe un "exercices" simples Liste au format JSON, pas en tant que carte. Une fois que vous l'avez récupéré en JSON, ce format semble simple à traiter en array: "exercises": [{"duration" ...}, {...}] – Ricardo

+0

Je n'ai aucun contrôle sur l'API. Je dois utiliser ce format. –

+0

s'il vous plaît vérifier ce https://stackoverflow.com/questions/37698715/how-to-send-arrays-lists-with-retrofit –

Répondre

1

Ce que je cherchais est l'annotation @FieldMap. Cela permet de construire une carte de noms/valeurs à transmettre en tant que paramètres POST.

@FormUrlEncoded 
@POST("api/v1/patient/{id}/workout") 
fun addPatientWorkout(@Path("id") id: Long, 
         @Field("title") title: String, 
         @FieldMap exercises: Map<String,String>) 
     : Single<Response<Workout>> 

Et qui est appelé avec le code suivant:

val exerciseFields: MutableMap<String, String> = mutableMapOf() 
    workout.exercises.forEachIndexed { index, exercise -> 
     exerciseFields["exercises[$index][duration]"] = exercise.duration.toString() 
     exerciseFields["exercises[$index][type]"] =exercise.type.name.toLowerCase() 
    } 

    return addPatientWorkout(
      workout.patient?.id ?: -1, 
      workout.title, 
      exerciseFields) 
+0

Ohh il existe!, Je viens de publier une façon primitive de le faire :) –

0

Format et après comme String au lieu de List<Map<String,String>> parce retrofit convertit toujours les cartes en JSON.

Vous pouvez le convertir comme suit:

 Exercise[] exercises = new Exercise[2]; 
     exercises[0] = new Exercise(10, "jump"); 
     exercises[1] = new Exercise(20, "roll"); 

     String postString = ""; 

     for(int i = 0; i < exercises.length; i++) { 

      Exercise ex = exercises[i]; 
      postString += "exercises[" + i +"][duration]=" + ex.duration + "\n"; 
      postString += "exercises[" + i +"][type]=" + ex.type + "\n"; 
     } 

     System.out.println(postString); 

classe d'exercice:

class Exercise { 

     public Exercise(int duration, String type) { 

      this.duration = duration; 
      this.type = type; 
     } 

     int duration; 
     String type; 
    } 

Votre fonction API ressemblera à ceci:

@FormUrlEncoded 
@POST("api/v1/patient/{id}/workout") 
fun addPatientWorkout(@Path("id") id: Long, 
         @Field("title") title: String, 
         @Field("exercises"): exercises, String) 
     : Single<Response<Workout>>