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 可能不是默认编码。
如何执行 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 可能不是默认编码。