我需要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?
首先,ASP.NET Core 默认不支持 XML 序列化/反序列化。您必须明确启用:
\nservices.AddControllersWithViews().AddXmlSerializerFormatters();\nRun Code Online (Sandbox Code Playgroud)\n然后,要将原始 XML 格式数据发送到 API 方法,请求的应该content-Type是application/xml,我们将从请求主体接收 xml 内容,因此我们应该使用 属性[FromBody],并且我们应该使用 来XElement接收 xml 内容。请参考以下示例:
使用以下代码创建 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 }\nRun Code Online (Sandbox Code Playgroud)\n然后使用Postman调用这个API:
\n\n此外,您还可以根据XML元素创建模型,然后使用模型类来接收XML内容。检查以下示例:
\nXML内容如下:
\n<?xml version="1.0" encoding="UTF-8"?>\n<UserViewModel>\n <Id>1</Id>\n <Name>aa</Name>\n</UserViewModel>\nRun Code Online (Sandbox Code Playgroud)\n创建用户视图模型
\npublic class UserViewModel\n{\n public int Id { get; set; }\n public string Name { get; set; }\n}\nRun Code Online (Sandbox Code Playgroud)\n然后,在API控制器中,使用以下方法接收数据:
\n [HttpPost] \n public string Post([FromBody]UserViewModel user)\n {\n return "Hello" + user.Name.ToString();\n }\nRun Code Online (Sandbox Code Playgroud)\n使用Postman来检查它:
\n\n该[FromForm]属性将接收请求正文中的表单数据。顾名思义,表单数据用于发送您在表单中包装的数据,例如您在填写表单时输入的详细信息。这些详细信息通过将它们写入键值对来发送,其中键是您要发送的条目的“名称”,值是 it\xe2\x80\x99s 值。更详细的信息,你可以参考这个帖子。
由于您使用curl发送请求,请尝试使用-H或--header设置请求标头,如下所示:
$ 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" \nRun 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" \nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
8063 次 |
| 最近记录: |