2017-11-27 5 views
1

Ok Ich habe eine API, die json zurückgibt, die zwei Felder enthältRetrofit kehrt Status 400, wenn sie mit Anrufen benutzerdefinierte Klasse mit

public interface AuthClient { 
    @Headers({"Content-Type: application/json", "Accept: application/json", "deviceType: android"}) 
    @POST("api/v3.2/auth") 
    Call<AuthResp> userLogin(@Body String body); 
} 

als ich den Anruf mit diesem AuthResp welche Modellklasse verwenden, die die JSON-Antwort darstellt Retrofit give mir Fehlercode 400 und Fehlermeldung :: { „Fehler“: „(nicht (Karte a-java.lang.String)?)“}

Gson gson = new GsonBuilder() 
      .setLenient() 
      .create(); 
    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl("http://172.16.10.196:3000/") 
      .addConverterFactory(GsonConverterFactory.create(gson)) 
      .client(OkHttpClientProvider.getInstance().getClient()) 
      .build(); 
    String json1=new Gson().toJson(new User(8,"123456789")); 
    Call<AuthResp> call=retrofit.create(AuthClient.class).userLogin(json1); 
    call.enqueue(new Callback<AuthResp>() { 
     @Override 
     public void onResponse(Call<AuthResp> call, Response<AuthResp> response) { 
      try { 
       if(response.isSuccessful()) { 
        Log.d("Response Success","True"); 
        Log.d("Response", response.body().refreshToken); 
       } 
       else{ 

        Log.d("Response Not Success",response.code()+""+response.errorBody().string()); 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onFailure(Call<AuthResp> call, Throwable t) { 
      Log.d("Response","Failed" +t.getMessage()); 
     } 
    }); 
} 

ich bin sicher, dass es keine fehlenden Header ist oder falsch Parameter, denn wenn ich den Aufruf mit ResponseBody statt und dann mit Gson den String zu AuthResp konvertieren, funktioniert es wie ein Zauber.

Nachrüstvarianten verwendet ::

implementation 'com.squareup.retrofit2:retrofit:2.3.0' 
implementation 'com.squareup.okhttp3:okhttp:3.9.0' 
implementation 'com.squareup.okhttp3:logging-interceptor:3.+ 
implementation 'com.squareup.retrofit2:converter-scalars:2.+' 
implementation 'com.squareup.retrofit2:converter-gson:2.+' 

AuthResp Klasse

public class AuthResp { 
    public String token; 
    public String refreshToken; 
    public AuthResp(){ 

    } 
    public AuthResp(String token,String refreshToken){ 
     this.token=token; 
     this.refreshToken=refreshToken; 
    } 
    public String getToken() { 
     return token; 
    } 

    public void setToken(String token) { 
     this.token = token; 
    } 

    public String getRefreshToken() { 
     return refreshToken; 
    } 

    public void setRefreshToken(String refreshToken) { 
     this.refreshToken = refreshToken; 
    } 

} 

Antwort vom Server

{ 
     "token": "some string", 
     "refreshToken": "some string" 
    } 

Kann jemand mir sagen, was das Problem sein könnte?

Antwort

0

Add ScalarsConverterFactory

Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl("http://172.16.10.196:3000/") 
     .addConverterFactory(ScalarsConverterFactory.create()) 
     .addConverterFactory(GsonConverterFactory.create(gson)) 
     .client(OkHttpClientProvider.getInstance().getClient()) 
     .build(); 
+0

danken Ihnen dies funktioniert ... kennen Sie den Grund? –

+0

Lesen Sie diesen Artikel https://futurestud.io/tutorials/retrofit-2-how-to-send-plain-text-request-body – Bek

Verwandte Themen