如何从aspnet请求体中读取原始xml

Sør*_*ois 3 xml asp.net-core

我需要HttpController接收原始 XML 并将其传递给遗留代码。我试试这个:

[HttpPost]
[Route("/xml")]
public string Post([FromForm] XDocument xml)
{
    return xml.ToString();
}
Run Code Online (Sandbox Code Playgroud)

然而,该xml文档似乎总是空的,例如,

$ curl -k -X POST https://localhost:5001/xml -d '<foo>bar</foo>' -i
HTTP/1.1 200 OK
Date: Fri, 26 Feb 2021 10:19:23 GMT
Content-Type: text/plain; charset=utf-8
Server: Kestrel
Content-Length: 0

$
Run Code Online (Sandbox Code Playgroud)

如何从请求正文中读取原始 XML 并获取有效的 XDocument?

Zhi*_* Lv 9

首先,ASP.NET Core 默认不支持 XML 序列化/反序列化。您必须明确启用:

\n
services.AddControllersWithViews().AddXmlSerializerFormatters();\n
Run Code Online (Sandbox Code Playgroud)\n

然后,要将原始 XML 格式数据发送到 API 方法,请求的应该content-Typeapplication/xml,我们将从请求主体接收 xml 内容,因此我们应该使用 属性[FromBody],并且我们应该使用 来XElement接收 xml 内容。请参考以下示例:

\n

使用以下代码创建 Values API:

\n
[Route("api/[controller]")]\n[ApiController]\npublic class ValuesController : ControllerBase\n{  \n    // POST api/<ValuesController>\n    [HttpPost] \n    [Route("/xml")]\n    public string Post([FromBody]XElement xml)\n    {\n        return "Hello" + xml.ToString();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

然后使用Postman调用这个API:

\n

在此输入图像描述

\n

此外,您还可以根据XML元素创建模型,然后使用模型类来接收XML内容。检查以下示例:

\n

XML内容如下:

\n
<?xml version="1.0" encoding="UTF-8"?>\n<UserViewModel>\n   <Id>1</Id>\n   <Name>aa</Name>\n</UserViewModel>\n
Run Code Online (Sandbox Code Playgroud)\n

创建用户视图模型

\n
public class UserViewModel\n{\n    public int Id { get; set; }\n    public string Name { get; set; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后,在API控制器中,使用以下方法接收数据:

\n
    [HttpPost] \n    public string Post([FromBody]UserViewModel user)\n    {\n        return "Hello" + user.Name.ToString();\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

使用Postman来检查它:

\n

在此输入图像描述

\n

[FromForm]属性将接收请求正文中的表单数据。顾名思义,表单数据用于发送您在表单中包装的数据,例如您在填写表单时输入的详细信息。这些详细信息通过将它们写入键值对来发送,其中键是您要发送的条目的“名称”,值是 it\xe2\x80\x99s 值。更详细的信息,你可以参考这个帖子

\n

由于您使用curl发送请求,请尝试使用-H--header设置请求标头,如下所示:

\n
$ curl -k -X POST https://localhost:5001/xml -d \'<foo>bar</foo>\' -i -H "Content-Type: text/xml" \n\n$ curl -k -X POST https://localhost:5001/xml -d \'<foo>bar</foo>\' -i -H "Content-Type:application/xml" \n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
$ curl -k -X POST https://localhost:5001/xml -d \'<foo>bar</foo>\' -i --header "Content-Type: text/xml" \n\n$ curl -k -X POST https://localhost:5001/xml -d \'<foo>bar</foo>\' -i --header "Content-Type:application/xml" \n
Run Code Online (Sandbox Code Playgroud)\n