2016-07-12 5 views
-2

Ich sende eine POST-Nachricht mit Retrofit2, um eine Datei plus ein paar Parameter hochzuladen. Einige der Parameter sind Wörterbücher. Um dies zu tun, ich habe folgende:POST eines Wörterbuchs mit @PartMap

@Multipart 
@POST("incidents") 
Call<MachineRequest> sendMachineRequest(@PartMap Map<String, RequestBody> partMap, @Part MultipartBody.Part image; 

Das Problem ist: Es scheint, als ob ich nur Strings als Wert für meine Parameter hochladen. Ich benutze RequestBody create(MediaType contentType, String content), um Einträge für die @PartMap Map zu erstellen. Natürlich müssen die Wörterbücher Strings sein, die in den RequestBody passen. Dies führt jedoch zu einer falschen Interpretation im Rails-Backend. Die Werte werden als String und nicht als Dictionary interpretiert.

"incident"=>"{\"type\":\"MachineRequest\"}"

statt

"incident"=>{\"type\":\"MachineRequest\"}

Also meine Frage ist: Wie kann ich ein Wörterbuch in @PartMap hinzufügen, oder wie kann ich eine ReqeustBody erstellen, die ein Wörterbuch hält?

+0

Ein Kommentar für den Downvote wäre nett. Wie sonst könnte ich meine Frage möglicherweise verbessern? –

Antwort

0

Obwohl meine Frage abgelehnt wurde, glaube ich immer noch, dass meine Ergebnisse für jeden nützlich sein können, der neu ist, um nachzurüsten und versucht, eine Datei zusammen mit einem komplexeren Java-Objekt zu POST zu schicken.

Also meine @PartMap Map<String, RequestBody> partMap enthält meist Schlüssel von String mit einem Wert von String. Ich fügte außerdem einen Schlüssel von String mit einem Wert von HashMap hinzu.

Map<String,RequestBody> mrm = new HashMap<String, RequestBody>(); 

HashMap<String,String> incident = new HashMap<String, String>(); 
incident.put("type","MachineRequest"); 

RequestBody incident = createPartFromString(String.valueOf(incident); 
RequestBody machine = createPartFromString(String.valueOf(getMachine())); 
mrm.put("incident",incident); 
mrm.put("machine",machine); 

Dies endete in meinem Schienen Backend als "incident"=>"{\"type\":\"MachineRequest\"}" auf. Der Wert von incident wurde als String anstelle eines Wörterbuchs interpretiert -> NoMethodError - undefined method permit for "{'type':'MachineRequest'}":String:

Um dies zu erhalten regelte es mein Code wie folgt geändert:

Map<String,RequestBody> mrm = new HashMap<String, RequestBody>(); 

RequestBody incident = createPartFromString("MachineRequest"); 
RequestBody machine = createPartFromString(String.valueOf(getMachine())); 
mrm.put("incident[type]",incident); 
mrm.put("machine",machine); 

Welche es wie erwartet ankommen gemacht: "incident"=>{"type"=>"MachineRequest"} und Rails konnte endlich den Wert von type erreichen.

Am Ende machte mrm.put("incident[type]",incident); den ganzen Unterschied. Zumindest mit einem @Multipart POST Anfragen. Für nicht @Mutipart Nachrichten funktioniert der frühere Code auch gut.

Es hat mich eine ganze Weile aussortiert, da ich nirgendwo ein Beispiel oder eine Dokumentation für dieses Szenario gefunden habe. Also hoffentlich hilft das Leuten, die das gleiche Problem haben wie ich, oder ihnen zumindest hilft, andere Probleme einzugrenzen.