Отправка значений из приложения Windows Forms в Asp.Net Основной Api

#c# #asp.net #winforms #api #asp.net-core

#c# #asp.net #winforms #API #asp.net-ядро

Вопрос:

Я создал простой Asp.Net Api для отображения информации о студентах в приложении Winforms, однако теперь я хочу создать Api, который принимает значения из приложения Windows Forms и вставляет эти значения в базу данных. как я могу создать такую вещь? вот что я пробовал до сих пор:

Asp.Net Api:

 [Route("api/[controller]")]
[ApiController]
public class Students : ControllerBase
{
 
     SqlConnection con;
     SqlCommand cmd;

    [HttpPost]
    public void Post()
    {
        string name = "janet";
        string age = "12";
         
        con = new SqlConnection("ConnectionString");
        cmd = new SqlCommand("insert into People(name,age) values(@name,@age)", con);
        cmd.Parameters.AddWithValue("@name", name);
        cmd.Parameters.AddWithValue("@age", age);
        con.Open();
        cmd.ExecuteNonQuery();
    }

}
  

Приложение Windows Forms:

     private void button1_Click(object sender, EventArgs e)
    {
        action();
    }
    HttpResponseMessage response;
    HttpClient client;
    async void action()
    {
            client = new HttpClient();   
  
            client.BaseAddress = new Uri("https://localhost:44338/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            response = await client.GetAsync("api/Students");
            
            if (response.IsSuccessStatusCode)
            {
                MessageBox.Show("item added successfully");

            }

        }
    
  

Я хочу изменить переменную name и age в Api на любые значения, которые я ввожу в Winforms.

PS: Я знаю, что я использую client.GetAsync в winforms, и это должно быть client.PostAsync , но я не знал, какие параметры я должен был передать ему.

Спасибо за помощь.

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

1. Вы должны прочитать, что вы неправильно используете HttpClient, и это дестабилизирует ваше программное обеспечение, потому что вы нарушаете одну из ключевых частей руководства. Возможно, у вас будет лучший опыт работы с Flurl , который имеет более чистый синтаксис и устраняет некоторые из этих сложных моментов для вас.

2. Вам следует избегать использования async void , за исключением самого обработчика событий. Ваш метод действия должен возвращать задачу, а затем button1_Click должен ожидать этого, и поэтому button1_Click должен быть помечен как асинхронный.

Ответ №1:

Вы можете передать данные в форме StringContent во втором параметре метода PostAsync.

Вы можете поместить эти параметры, которые вам нужно передать модели, и преобразовать их в json для контроллера.

Вот демонстрация:

Вы можете создать класс Person в этих двух приложениях (что удобно для передачи и получения данных):

  public class Person
    {
        public int Id { get; set; }
        public string name { get; set; }
        public int age { get; set; }
    }
  

Приложение Windows Forms:

  using (var client = new HttpClient())
        {

            client.BaseAddress = new Uri("https://localhost:44338/");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
              
               Person  person = new Person() {  name= "janet", age =12};
                var data = JsonConvert.SerializeObject(person);
                var content = new StringContent(data, Encoding.UTF8, "application/json");
                response = await client.PostAsync("api/Students", content);
           

            if (response.IsSuccessStatusCode)
            {
                MessageBox.Show("item added successfully");

            }

        }
  

API контроллера:

  [HttpPost]
        public void Post([FromBody]Person person)
        { 
            con = new SqlConnection("ConnectionString");
            cmd = new SqlCommand("insert into People(name,age) values(@name,@age)", con);
            cmd.Parameters.AddWithValue("@name", person.name);
            cmd.Parameters.AddWithValue("@age", person.age);
            con.Open();
            cmd.ExecuteNonQuery();
        }
  

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

1. Большое вам спасибо за ваш ответ, это, наконец, сработало после попытки множества ссылок

2. Вам нужно прочитать, что вы неправильно используете HttpClient, и это дестабилизирует ваше программное обеспечение, потому что вы продвигаете плохой способ использования HttpClient. Пожалуйста, обновите свой ответ соответствующим образом.

3. Спасибо @mason. я обязательно исправлю эти проблемы и обновлю свой ответ