首先,ASP.NET Core 默认不支持 XML 序列化/反序列化。您必须明确启用:
services.AddControllersWithViews().AddXmlSerializerFormatters();
那么,要向API方法发送原始XML格式数据,请求的content-Type应该是application/xml,我们会从请求体接收xml内容,所以我们应该使用[FromBody]属性,我们应该使用XElement 来接收xml 内容。请参考以下示例:
使用以下代码创建一个 Values API:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
// POST api/<ValuesController>
[HttpPost]
[Route("/xml")]
public string Post([FromBody]XElement xml)
{
return "Hello" + xml.ToString();
}
然后使用 Postman 调用这个 API:
此外,您还可以根据XML元素创建模型,然后使用模型类来接收xml内容。检查以下示例:
XML 内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<UserViewModel>
<Id>1</Id>
<Name>aa</Name>
</UserViewModel>
创建用户视图模型
public class UserViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
然后,在 API 控制器中,使用以下方法接收数据:
[HttpPost]
public string Post([FromBody]UserViewModel user)
{
return "Hello" + user.Name.ToString();
}
使用 Postman 进行检查:
[FromForm] 属性将接收请求正文中的表单数据。顾名思义,表单数据用于发送您在表单中包装的数据,例如您在填写表单时输入的详细信息。这些详细信息是通过将它们编写为 KEY-VALUE 对来发送的,其中键是您要发送的条目的“名称”,值是它的值。更多详细信息,您可以参考this thread。
由于你使用curl发送请求,尝试使用-H或--header设置请求头,像这样:
$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i -H "Content-Type: text/xml"
$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i -H "Content-Type:application/xml"
或
$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i --header "Content-Type: text/xml"
$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i --header "Content-Type:application/xml"