gpt4 book ai didi

xml - ASPNetCore API 内容协商不起作用

转载 作者:数据小太阳 更新时间:2023-10-29 01:47:10 35 4
gpt4 key购买 nike

我正在尝试设置我的 api,以便它根据 Accept header 使用 XML 或 JSON 进行响应。

我正在学习 Shawn W 的教程:https://wildermuth.com/2016/03/16/Content_Negotiation_in_ASP_NET_Core

它说要添加一个包到:"Microsoft.AspNet.Mvc.Formatters.Xml": "6.0.0-rc1-final"

但我找不到它,所以安装了:Microsoft.AspNetCore.Mvc.Formatters.Xml

他说要将它添加到 Startup 的配置服务部分:

        // Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

然后浏览器会自动接收 XML,因为默认情况下它使用 Accept: text/xml header ,我不会在浏览器中或使用 postman 获取 XML。无论我将 Accept header 设置为什么,我都会得到 Json。

我试过将 [Produces("application/xml")] 放在我的 Controller 上,它返回一个空白的 200 OK 页面。

如何让我的 api 默认返回 Json,或者如果存在 Accept 则返回 XML?

编辑 1:

我将其用作我的 http 获取代码:

    [HttpGet]
public IActionResult Get() {
var invoices = context.Invoices.ToList();
var mappedInvoices = mapper.Map<List<DomainModels.Invoice>, List<Invoice>>(invoices);
return Ok(mappedInvoices);
}

我正在尝试返回此 DTO:

public class Invoice : TrackedObject {

public DateTime Date { get; set; }

public decimal Total { get; set; }

public string OrderNumber { get; set; }


public PaymentType? PaymentType { get; set; }

public ICollection<InvoiceItem> Items { get; set; }
}
public enum PaymentType {
Cheque,
Cash,
Card,
Account
}

编辑 2:

如果我换掉这个:

 // Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
options.InputFormatters.Add(new XmlSerializerInputFormatter());
options.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

并替换为以下内容:

        services.AddMvc().AddXmlSerializerFormatters();

然后将 [Produces("application/xml")] 放在我的 get 方法上方,我得到一个 406 Not Acceptable 响应。

最佳答案

我终于找到了通过接受 header 返回 JSON 和 XML 的正确设置。

要让您的 Web API Controller 返回 JSON 或 XML(默认情况下为 JSON),您需要将服务配置如下所示:

// Add framework services.
services
.AddMvc(options => {
options.RespectBrowserAcceptHeader = true;
})
//support application/xml
.AddXmlDataContractSerializerFormatters()
//support application/json
.AddJsonOptions(options => {
// Force Camel Case to JSON
options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});

当你知道怎么做时,非常简单!目前有太多不正确的文档!

关于xml - ASPNetCore API 内容协商不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42653698/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com