Не добавляет данные в БД при передаче их от Android в web api

Реализовал Post-запрос в контроллере:

[HttpPost]
public User CreateNeUser(User user)
{
    int result = 0;
    _context.Users.Add(new User() { Name = user.Name, Password = user.Password, Email = user.Email, Photo = user.Photo, Money = user.Money,
        SubscriptionMusic = user.SubscriptionMusic, SubscriptionGame = user.SubscriptionGame, IsOnline = user.IsOnline });
    result = _context.SaveChanges();           
    return (result < 1) ? null : new User();
}

Класс полей данных БД:

public partial class User
{
    public int Id { get; set; }
    public string? Name { get; set; }
    public string? Password { get; set; }
    public string? Email { get; set; }
    public string? Photo { get; set; }
    public string? Money { get; set; }
    public string? SubscriptionMusic { get; set; }
    public string? SubscriptionGame { get; set; }
    public string? IsOnline { get; set; }
}

Контекст:

public partial class SpotyCopyContext : DbContext
{
    public SpotyCopyContext()
    {
    }

    public SpotyCopyContext(DbContextOptions<SpotyCopyContext> options)
        : base(options)
    {
    }       
    public virtual DbSet<User> Users { get; set; } = null!;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            optionsBuilder.UseSqlServer("строка подключение");
        }
    }        
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {           
       modelBuilder.Entity<User>(entity =>
        {
            entity.Property(e => e.Id).ValueGeneratedOnAdd();

            entity.Property(e => e.Name).HasMaxLength(50);

            entity.Property(e => e.Password)
            .HasMaxLength(50);

            entity.Property(e => e.Email).HasMaxLength(50)
            ;    
            entity.Property(e => e.Photo)
            .HasMaxLength(200);

            entity.Property(e => e.Money).HasMaxLength(50);              

            entity.Property(e => e.SubscriptionGame)
                .HasMaxLength(50)
                .HasColumnName("Subscription_game");

            entity.Property(e => e.SubscriptionMusic)
                .HasMaxLength(50)
                .HasColumnName("Subscription_music");
            entity.Property(e => e.IsOnline).HasMaxLength(50);
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

Были использованы библиотеки Retrofit, вот сам запрос на передачу в Android Studio:

MainAPI.CreateUser(new Users(name,password,email,photo,money,progress_subscription,progress_subscription,IsOnline), new UsersPostCallback() {
    @Override
    public void onResult(Users result) {
        if(result == null) {
            Toast msg = Toast.makeText(Email_check.this, R.string.error_adding_error, Toast.LENGTH_SHORT);
            msg.show();
        }
        else
        {
            Toast msg = Toast.makeText(Email_check.this, R.string.result_successful_user_adding, Toast.LENGTH_SHORT);
            msg.show();
            saveText();
        }
    }
    @Override
    public void onError(Throwable e) {
        Log.e("ErrorSQL",e.toString());
        Toast msg = Toast.makeText(Email_check.this, e.getMessage(), Toast.LENGTH_SHORT);
        msg.show();
    }
});

Если использовать консоль диспетчера пакетов в Visual Studio и написать запрос, то данные добавятся в БД без ошибок:

Invoke-RestMethod http://localhost:5000/api/users -Method POST -Body (@{Name = "Bob"; Password = "Bob"; Email = "Bob"; Photo = "Bob"; Money = "Bob"; SubscriptionMusic = "Bob"; SubscriptionGame = "Bob"; IsOnline = "Bob"} | ConvertTo-Json) -ContentType "application/json; charset=utf-8"

Доп. код с андроида:

1.Класс Users, объекты которого будут возвращаться с API:

public class Users
{
    public int id;
    public String name;
    public String password;
    public String email;
    public String photo;
    public String money;
    public String subscriptionMusic;
    public String subscriptionGame;
    public String isOnline;
    public Users(String _name,String _password,String _email,String _photo,String _money,String _subscriptionMusic,String _subscriptionGame,String _isOnline) {
        name = _name;
        password = _password;
        email = _email;
        photo = _photo;
        money = _money;
        subscriptionMusic = _subscriptionMusic;
        subscriptionGame = _subscriptionGame;
        isOnline = _isOnline;
    }

2.Интерфейс UsersPostCallback, который будет возвращать результат обращения к API

public interface IAPI
    public interface UsersPostCallback
    {
        void onResult(Users result);
        void onError(Throwable e);
    }

3.Интерфейс IAPI, который определяет методы, которые реализованы на стороне API

public interface IAPI
{
    @GET("api/users")
    Call<Users> GetUser(@Query("name")String name);
    @POST("api/users")
    Call<Users> PostUser(@Body Users users);
} 

4.MainApi – главный класс, который настраивает подключение к API

static final String baseUrl = "http://10.0.2.2:5000/";
// **у меня ругается на сертификат, поэтому эта часть кода мне нужно**
    public static OkHttpClient.Builder getUnsafeOkHttpClient() {        
            try {
                // Create a trust manager that does not validate certificate chains
                final TrustManager[] trustAllCerts = new TrustManager[]{
                        new X509TrustManager() {
    
                            @Override
                            public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
                            }
    
                            @Override
                            public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType)  throws CertificateException {
                            }
    
                            @Override
                            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                                return new java.security.cert.X509Certificate[]{};
                            }
                        }
                };
    
                // Install the all-trusting trust manager
                final SSLContext sslContext = SSLContext.getInstance("SSL");
                sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
    
                // Create an ssl socket factory with our all-trusting manager
                final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
    
                OkHttpClient.Builder builder = new OkHttpClient.Builder();
                builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);
                builder.hostnameVerifier(new HostnameVerifier() {
    
                    @Override
                    public boolean verify(String hostname, SSLSession sslSession) {
                        return true;
                    }
                });
                return builder;
            }
            catch (Exception e){throw new RuntimeException(e);}
        }
    public static void CreateUser(Users users, UsersPostCallback usersPostCallback)
    {       

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .client(getUnsafeOkHttpClient().build())
                .build();
        IAPI api = retrofit.create(IAPI.class);

        api.PostUser(users).enqueue(new retrofit2.Callback<Users>() {
            @Override
            public void onResponse(Call<Users> call, Response<Users> response) {
                usersPostCallback.onResult(response.body());
            }
            @Override
            public void onFailure(Call<Users> call, Throwable t) {
                usersPostCallback.onError(t);
            }
        });
    }

Всем спасибо за ответ.
P.S. Был использован .NET 6.0


Ответы (1 шт):

Автор решения: JohnBeacker

Попробовав еще несколько вариантов, я решил реализовать то же самое на .Net 5.0. И всё правильно заработало

→ Ссылка