Smi*_*thy 8 xml content-negotiation asp.net-web-api http-accept-header asp.net-core
我正在尝试设置我的api,以便根据Accept标头响应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();
});
Run Code Online (Sandbox Code Playgroud)
然后浏览器自动接收XML,因为默认情况下它使用Accept:text/xml标头,我在浏览器中不使用XML或使用邮递员.无论我将Accept头设置为什么,我都会得到Json.
我试过戴上[Produces("application/xml")]
我的控制器,它返回一个空白的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);
}
Run Code Online (Sandbox Code Playgroud)
而我正试图归还这个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
}
Run Code Online (Sandbox Code Playgroud)
编辑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();
});
Run Code Online (Sandbox Code Playgroud)
并替换为以下:
services.AddMvc().AddXmlSerializerFormatters();
Run Code Online (Sandbox Code Playgroud)
然后把[Produces("application/xml")]
我的get方法放在上面,我得到一个406 Not Acceptable响应.
Smi*_*thy 10
我终于找到了正确的设置,通过accept头返回JSON和XML.
要使您的Web API控制器返回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();
});
Run Code Online (Sandbox Code Playgroud)
当你知道如何时非常简单!一分钟都有不正确的文档!
归档时间: |
|
查看次数: |
1640 次 |
最近记录: |