我快要发疯了,想弄清楚如何将 POST 参数传递给 ASPNET CORE 2.0 中的 Web API 方法。
我有一个 C# 客户端应用程序和一个 C# 服务器应用程序。
- 我试过在 Web Api 方法上使用 [FromBody]。
- 我试过将内容类型设置为“application/json”
- 我已将我的 Controller 操作简化为尽可能基本
- 我试过同时传递字符串和复杂对象。
它总是空的。这是怎么回事?
客户端代码:
private static async Task SendCustomObject()
{
var controllerName = "BasicApi";
var basicClientApi = string.Format("http://localhost:5100/api/{0}", controllerName);
using (var httpClient = new HttpClient()){
var packetData = new TestPacket();
var jsonObj = new { json = packetData };
JObject jobject = JObject.FromObject(packetData);
var json = JsonConvert.SerializeObject(jobject);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
// This doesn't help:
//httpClient.DefaultRequestHeaders.Accept.Clear();
//httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
var response = await httpClient.PostAsync(basicClientApi, content);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var rawResponse = await response.Content.ReadAsStringAsync();
JObject o = JObject.Parse(rawResponse);
Console.WriteLine(o.ToString());
}
}
}
服务器代码:
namespace myApp.Controllers
{
[Route("api/[controller]")]
public class BasicApiController : Controller
{
[HttpPost]
public JsonResult Post([FromBody] string json) // json is always null!
{
var jsonData = JsonConvert.DeserializeObject<Models.TestPacket>(json);
return Json(new { result = true });
}
}
}
最佳答案
ASP.NET Core 默认绑定(bind)器会为您反序列化模型,您无需手动执行。具体来说,您不能将 object
视为 string
。
看看这个更简单的例子:
private static async Task SendCustomObject()
{
var controllerName = "BasicApi";
var basicClientApi = string.Format("http://localhost:5100/api/{0}", controllerName);
using (var httpClient = new HttpClient()){
var packetData = new TestPacket();
var jsonObj = new { json = packetData };
var json = JsonConvert.SerializeObject(jsonObj); // no need to call `JObject.FromObject`
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await httpClient.PostAsync(basicClientApi, content);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var rawResponse = await response.Content.ReadAsStringAsync();
JObject o = JObject.Parse(rawResponse);
Console.WriteLine(o.ToString());
}
}
}
namespace myApp.Controllers
{
[Route("api/[controller]")]
public class BasicApiController : Controller
{
[HttpPost]
// don't ask for a string, ask for the model you are expecting to recieve
public JsonResult Post(Models.TestPacket json)
{
return Json(new { result = true });
}
}
}
关于c# - 来自 PostAsync 的 HttpPost 始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51111132/