2017-10-21 33 views
0

Je développe une application Android en utilisant "Discord API". D'abord, si j'appelle la même API dans Postman, cela fonctionne très bien. Mais dans mon application Android, cela ne fonctionne pas.Retrofit PUT ne fonctionne pas

L'API ce que je veux utiliser est la suivante: « https://discordapp.com/developers/docs/resources/guild#add-guild-member »

enter image description here

Et je veux faire la même chose dans mon application Android à l'aide « Library Rénovation ».

Ci-dessous l'interface.

@PUT("guilds/{guildId}/members/{userId}") 
    Call<RespUser> joinGuild(@Path("guildId") String guildId, @Path("userId") String userId, @Header("Authorization") String token, @Header("Content-Type") String contentType, @Body String body); 

Et ci-dessous est mise en œuvre:

@Override 
public void joinGuild(DUser dUser, String authorization) { 
    Log.d(TAG, "[CHICKEN] joinGuild: " + dUser + ", " + authorization); 

    Gson gson = new Gson(); 
    String body = gson.toJson(new DJoinBody(authorization, dUser.getUsername())); 
    Log.d(TAG, "[CHICKEN] joinGuild - body: " + body); 

    Call<RespUser> guildCall = mDiscordService.joinGuild(BuildConfig.DISCORD_GROUP_ID, dUser.getId(), BuildConfig.DISCORD_BOT_TOKEN, "application/json", body); 

    Log.d(TAG, "[CHICKEN] joinGuild - request method: " + guildCall.request().method()); 
    Log.d(TAG, "[CHICKEN] joinGuild - request headers: " + guildCall.request().headers().toString()); 
    Log.d(TAG, "[CHICKEN] joinGuild - request body.contentType: " + guildCall.request().body().contentType().toString()); 
    Log.d(TAG, "[CHICKEN] joinGuild - request body.: " + guildCall.request().body().toString()); 
    Log.d(TAG, "[CHICKEN] joinGuild - request: " + guildCall.request().toString()); 

    guildCall.enqueue(new Callback<RespUser>() { 
     @Override 
     public void onResponse(Call<RespUser> call, Response<RespUser> response) { 
      if (response.isSuccessful()) { 
       RespUser result = response.body(); 
       Log.d(TAG, "[CHICKEN] joinGuild - result: " + result); 
      } else { 
       try { 
        Log.e(TAG, "[CHICKEN] joinGuild - failed: " + response.code() + ": " + response.errorBody().string()); 
        Log.d(TAG, "[CHICKEN] joinGuild - failed: " + response.raw().toString()); 
        Log.d(TAG, "[CHICKEN] joinGuild - failed: " + response.headers().toString()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     @Override 
     public void onFailure(Call<RespUser> call, Throwable t) { 

     } 
    }); 
} 

Et l'erreur est:

{"_misc": ["Only dictionaries may be used in a DictType"]} 

Pourriez-vous me dire ce que je fais erreur, s'il vous plaît?

Répondre

0

J'ai trouvé la solution. J'ai changé le type du paramètre "Body" de "String" à "Object".

Avant code:

@PUT("guilds/{guildId}/members/{userId}") 
Call<RespUser> joinGuild(@Path("guildId") String guildId, 
    @Path("userId") String userId, 
    @Header("Authorization") String token, 
    @Header("Content-Type") String contentType, 
    @Body String body); 

Après le code:

@Headers({"Content-Type: application/json"}) 
@PUT("guilds/{guildId}/members/{userId}") 
Call<RespUser> joinGuild(@Path("guildId") String guildId, 
    @Path("userId") String userId, 
    @Header("Authorization") String token, 
    @Body DJoinBody joinBody);