Почему модернизация игнорирует код успешного ответа?

#android #api #retrofit

#Android #API #модернизация

Вопрос:

Я новичок в использовании Restful API с Android, я использую Retrofit для подключения моего API к моему приложению для Android, я пытаюсь вставить информацию о пользователе в свою базу данных PostgreSQL, но каждый раз, когда я вставляю новые данные, мое приложение игнорирует метод onResponse и переходит непосредственно к OnFailure, несмотря на успешную вставкуи возвращая код 200, как мне это решить?

Я использовал HttpLoggingInterceptor для регистрации ошибки, но он показывает код 200, что означает, что со стороны сервера все в порядке.

Класс обслуживания модернизации (UserService)

 public interface UserService {
    //Return list of users
    @GET("/users")
    Call<List<User>> getUsers();
    //Post new user
    @POST("/users")
    Call<User> postUser(@Body User user);
}
 

Класс пользователя

 public class User {

    @SerializedName("id")
    @Expose
    private Integer id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("email")
    @Expose
    private String email;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

 

Модифицированное соединение и экземпляр HttpLogging

 HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BASIC);
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

        httpClient.addInterceptor(logging);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient.build())
                .build();
 

FAB, который запускает вставку в MainActivity

 FloatingActionButton fab = findViewById(R.id.fab);
        final User user = new User();
        user.setName("Michael");
        user.setEmail("michael@example.com");
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                userService.postUser(user).enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {
                        if(response.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "User successfully inserted", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) {
                        Toast.makeText(MainActivity.this, "Error inserting into database", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        });

 

Комментарии:

1. Можем ли мы увидеть пример ответа, который вы возвращаете?

2. Код 200 представляет собой успешный запрос, не обязательно вставку. Покажите нам свой postUser() в rest api

3. Здесь вы можете увидеть скриншот моей функции insert в моем API: prntscr.com/ncutfw

4. И вот скриншот ответа, который я получаю: prntscr.com/ncuua7

5. Попробовав новые решения, это то, что я получаю в методе OnFailure: prntscr.com/ncv10p

Ответ №1:

Вероятно, потому, что конвертер выдал исключение. Выведите сообщение об ошибке в методе OnFailure. Если это просто несоответствие между вашим конвертером и данными на проводе, то это проблема приложения, которую необходимо исправить.

Обратитесь к этому для получения дополнительной информации

https://github.com/square/retrofit/issues/1446

Обновление после просмотра скриншота:

Это ошибка синтаксического анализа. В ответ ожидается объект JSON пользовательского типа, но текущий ответ возвращает строку JSON.

Комментарии:

1. Вы можете видеть в моем коде, что я передаю объект типа User, а не жестко заданные строки, но я все равно получаю ту же ошибку.

Ответ №2:

В конце концов, я нашел проблему.

Я отправлял ответ JSON из своего API, который был неправильно отформатирован, и Retrofit воспринял это как ошибку.

Вот скриншот моей новой функции API: http://prntscr.com/ncyxwx