2017-02-13 5 views
1

Ich möchte eine HashMap und ein Objekt mit Retrofit veröffentlichen. Ich habe diesen Code unten versucht, aber IllegalArgumentException erhalten.Retrofit 2 - Post FieldMap mit Body-Objekt

@POST("update") 
Call<RSP010> postApi010(@FieldMap HashMap<String, String> defaultData, @Body User user); 

Logcat

java.lang.IllegalArgumentException: @FieldMap parameters can only be used with form encoding. (parameter #1) 

Aber wenn ich @FormUrlEncoded hinzufügen. Er sagte

java.lang.IllegalArgumentException: @Body parameters cannot be used with form or multi-part encoding. (parameter #2) 

UPDATE CODE

public static HashMap<String, String> defaultData(){ 
    HashMap<String, String> map = new HashMap<>(); 
    map.put("last_get_time", String.valueOf(SharedPreferencesHelper.getLongValue(AppConstants.LAST_GET_UPDATE))); 
    map.put("duid", SharedPreferencesHelper.getStringValue(AppConstants.DUID)); 
    return map; 

Mein Objekt, das ich

int profile_id; 
private String name; 
private String name_kana; // あいうえお 
private int gender; // 1 nam 2 nu 
private String birth_day; 
private String birth_time; 
private String birth_place; 
private String relationship; 

Erklären stellen:

ich mehrere Variablen über API-Server stellen . FieldMap defaultData für Standardvariablen, die ich in jeder API verwenden möchte.

https://futurestud.io/tutorials/retrofit-send-objects-in-request-body Ich habe das gelesen, es sagte, anstatt alle separaten Variablen eines Objekts zu veröffentlichen, kann ich ein Objekt direkt posten.

+0

können Sie Problem mit Daten und api Unterschrift erklären? –

+0

@PratikPopat I Code aktualisiert und erklären. – TruongHieu

+0

hier gehen Sie, überprüfen Sie [this thread] (http://stackoverflow.com/a/34392376/3800164) –

Antwort

1

Ändern Sie bitte Ihre Methode:

@POST("update") 
Call<RSP010> postApi010(@Query("last_get_time") String lastGetTime, @Query("duid") String uid, @Body User user); 
+0

Können wir es migrieren, anstatt meine 'defaultData' zu verwenden? – TruongHieu

+0

ja können Sie migrieren –

+0

können Sie wie getYourService() aufrufen. PostApi010 ("your_get_time", "uid", Benutzer); –

1

Sie @Body User user mit @FieldMap HashMap<String, String> defaultData wie

String user = new Gson().toJson(user); 
    HashMap<String, String> map = new HashMap<>(); 
    map.put("last_get_time", String.valueOf(SharedPreferencesHelper.getLongValue(AppConstants.LAST_GET_UPDATE))); 
    map.put("duid", SharedPreferencesHelper.getStringValue(AppConstants.DUID)); 
    map.put("duid", SharedPreferencesHelper.getStringValue(AppConstants.DUID)); 
    map.put("user", user); 

ODER

Verwenden senden @PartMap Map<String, RequestBody>

@Multipart 
@POST("update") 
Call<RSP010> postApi010(@PartMap Map<String, RequestBody> defaultData); 

und erstellen Sie Ihre Anfrage Parameter

Map<String, RequestBody> map = new HashMap<>(); 
map.put("last_get_time", toRequestBody(String.valueOf(SharedPreferencesHelper.getLongValue(AppConstants.LAST_GET_UPDATE)))); 
map.put("duid", toRequestBody(SharedPreferencesHelper.getStringValue(AppConstants.DUID))); 
RequestBody body = RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),new Gson().toJson(user)); 
map.put("user", body); 

// This method converts String to RequestBody 
public static RequestBody toRequestBody (String value) { 
    RequestBody body = RequestBody.create(MediaType.parse("text/plain"), value); 
    return body ; 
} 
+0

Ihre Antwort wird nicht funktionieren. Weil 'user' ein Objekt ist, kein' String' – TruongHieu

+1

Sie können es mit 'Gson' in' String' umwandeln und es als String senden. –