API POST 从控制台应用程序调用

API POST call from Console Application

如何执行 REST API POST 从控制台应用程序调用?

我想将 class 从控制台应用程序传递到 REST API。如果我必须执行 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", "Name":"Rohit" }

您没有序列化学生对象。 您可以尝试发送一个 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);

这对我有用。

    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());
        }
    }

老实说我不知道​​。似乎您的 StringContent 没有将其消毒为 UTF8,而您的 restful API 默认情况下正在尝试这样做。但是,您的控制台应用程序也应该默认执行此操作。

问题似乎是 restful API 无法绑定字节数据,因此无法将数据分配给 restful 中的 class 学生 API。

您可以尝试在将 post 更改为 API 之前添加以下代码:

var encoding = System.Text.Encoding.Default;

它会告诉你默认的编码类型是什么。由于某种原因,UTF8 可能不是默认编码。