Не добавляет данные в БД при передаче их от 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 шт):
Попробовав еще несколько вариантов, я решил реализовать то же самое на .Net 5.0. И всё правильно заработало