API POST вызов из консольного приложения - PullRequest
0 голосов
/ 01 мая 2020

Как выполнить вызов POST API REST из консольного приложения?

Я хочу передать класс из консольного приложения в API REST. Мой код ниже работает, если я должен сделать вызов GET, но не для POST. Он бьет по API, но в параметре ничего не передает.

API

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values

    //public void Post([FromBody]string value)
    //{

    //}
    public void Post([FromBody]Student value)
    {

    }



}

Консольное приложение

 static async Task CallWebAPIAsync()
    {

        var student = new Student() { Id = 1, Name = "Steve" };

        using (var client = new HttpClient())
        {
            //Send HTTP requests from here. 
            client.BaseAddress = new Uri("http://localhost:58847/");
              client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


            HttpResponseMessage response = await client.PostAsJsonAsync("api/values", student);
            if (response.IsSuccessStatusCode)
            {

            }
            else
            {
                Console.WriteLine("Internal server Error");
            }
        }
    }

То же самое работает, если я звоню из fiddler.

Пользователь-агент: Fiddler Длина содержимого: 31 Хост: localhost: 58847 Тип содержимого: application / json

Тело запроса: {"Id": "1", "Имя": "Рохит"}

Ответы [ 3 ]

1 голос
/ 01 мая 2020

Это работает для меня.

    public async Task CallWebAPIAsync()
    {
        var student  = "{'Id':'1','Name':'Steve'}";
        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost:58847/");
        var response = await client.PostAsync("api/values", new StringContent(student, Encoding.UTF8, "application/json"));
        if (response != null)
        {
            Console.WriteLine(response.ToString());
        }
    }
0 голосов
/ 02 мая 2020

Если честно, я не знаю. Похоже, что ваш StringContent не стерилизовал его до UTF8, который ваш успокоительный API пытается сделать по умолчанию. Однако ваше консольное приложение также должно делать это по умолчанию.

Проблема, похоже, заключалась в том, что restful API не мог связать байтовые данные и поэтому не мог назначить данные вашему классу Student в restful API.

Что вы можете попытаться сделать, это добавить следующий код, прежде чем отправлять сообщение в API:

var encoding = System.Text.Encoding.Default;

Он сообщит вам, какой тип кодировки используется по умолчанию. Возможно, по какой-то причине UTF8 не является кодировкой по умолчанию.

0 голосов
/ 01 мая 2020

Вы не сериализуете объект студента. Вы можете попытаться отправить StringContent

StringContent sc = new StringContent(Student)

HttpResponseMessage response = await client.PostAsJsonAsync("api/values", sc);

, если это не работает (долгое время я использовал StringContent). Используйте стерилизатор NewtonSoft

string output = JsonConvert.SerializeObject(product);
HttpResponseMessage response = await client.PostAsJsonAsync("api/values", output);
...