#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. я обязательно исправлю эти проблемы и обновлю свой ответ