#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