当邮递员正确操作时,为什么在响应中调用代码400?

时间:2019-05-16 02:07:36

标签: android retrofit2

我想根据准则体系结构和CleanCode规则提供清晰的代码。

我试图使用gson库对改造调用中使用的数据进行序列化。

我知道我可以在模型类中使用@SerializedName,但是我想学习如何使用gson builder。

在MainActivity中,我有:

btnLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                CredentialModel credentials = new CredentialModel("User", "Password");
                Gson gson = new GsonBuilder().serializeNulls().create();
                String json = gson.toJson(credentials);
                UserApiClient userApiClient = RetrofitInstace.getRetrofitInstance().create(UserApiClient.class);
                Call<String> call = userApiClient.login(json);
                call.enqueue(new Callback<String>() {
                    @Override
                    public void onResponse(Call<String> call, Response<String> response) {
                        toastNotify(String.valueOf(response.code()));

                    }

                    @Override
                    public void onFailure(Call<String> call, Throwable t) {
                        toastNotify("Fail");
                    }
                });
            }
        });

Interface UserApiClient:

@POST("/api/AppUser/login")
    Call<String> login(@Body String credentials);

RetrofitInstance类:

public static Retrofit getRetrofitInstance() {
        if (retrofit == null) {
            retrofit = new retrofit2.Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .client(new OkHttpClient())
                    .build();
        }
        return retrofit;
    }

当邮递员将数据从调试模式下的json变量复制到正文时,我收到400错误代码,这给我代码200。这不是我的服务,所以我不知道服务器端要做什么。也是我在android中的新功能,尚不知道如何在android studio中检查原始请求。

1 个答案:

答案 0 :(得分:0)

您使用的是GsonConverterFactory.create(),但是您正在Call<String> login(@Body String credentials);传递String。你不能那样做。

您需要传入由gson序列化的POJO。否则,改型将传入空对象作为主体。

class MyBody {
    // serialize it here
}

// You also cannot use a String at Call<String>
// for now use ResponseBody. Create a POJO class later though
Call<ResponseBody> login(@Body MyBody credentials);

您想要做的事已经在改造中完成了。

// retrofit does this for you underneat when you use GsonConverterFactory.create()
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(credentials);