【问题标题】:How to read raw xml from request body in aspnet如何从 aspnet 中的请求正文中读取原始 xml
【发布时间】:2021-03-01 15:11:57
【问题描述】:

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

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

但是,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

$

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

【问题讨论】:

    标签: xml asp.net-core


    【解决方案1】:

    首先,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" 
    

    【讨论】:

    猜你喜欢
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2023-04-07
    • 2021-10-01
    • 2017-08-14
    • 1970-01-01
    相关资源
    最近更新 更多