【问题标题】:Retrofit returns status 400 when using custom class with Call使用带有 Call 的自定义类时,Retrofit 返回状态 400
【发布时间】:2018-05-10 09:48:21
【问题描述】:

好的,我有一个返回包含两个字段的 json 的 API

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

当我使用带有此 AuthResp 的调用时,代表 json 响应改造的模型类给我错误代码 400 和错误消息 :: {"errors":"(not (map?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());
        }
    });
}

我确定没有丢失标头或错误参数,因为如果我使用 ResponseBody 进行调用,然后使用 Gson 将字符串转换为 AuthResp,它就像一个魅力。

使用的改造版本::

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 类

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;
    }

}

来自服务器的响应

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

谁能告诉我可能是什么问题?

【问题讨论】:

    标签: android json gson retrofit okhttp


    【解决方案1】:

    添加 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();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2019-08-30
    • 1970-01-01
    • 2014-07-29
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多