Câu hỏi Làm thế nào để tôi nhận được ASP.NET Web API để trả về JSON thay vì XML bằng cách sử dụng Chrome?


Sử dụng phiên bản mới hơn ASP.NET Web API, trong Chrome Tôi thấy XML - làm thế nào tôi có thể thay đổi nó để yêu cầu JSON vì vậy tôi có thể xem nó trong trình duyệt? Tôi tin rằng nó chỉ là một phần của các tiêu đề yêu cầu, tôi có đúng không?


1221
2018-03-23 23:04


gốc


Có một cuộc thảo luận ở đây để chỉ trả về JSON hành vi mặc định: github.com/aspnet/Mvc/issues/1765 - Natan


Các câu trả lời:


Tôi chỉ thêm các mục sau vào App_Start / WebApiConfig.cs lớp trong dự án API MVC Web API của tôi.

config.Formatters.JsonFormatter.SupportedMediaTypes
    .Add(new MediaTypeHeaderValue("text/html") );

Điều đó đảm bảo bạn nhận được json trên hầu hết các truy vấn, nhưng bạn có thể nhận được xml khi bạn gửi text/xml.

Nếu bạn cần có phản hồi Content-Type như application/json hãy kiểm tra Câu trả lời của Todd bên dưới.

NameSpace đang sử dụng System.Net.Http.Headers;


1530
2017-11-07 20:25



Đây là một câu trả lời đáng ngạc nhiên, và mặc dù câu hỏi ban đầu không hoàn toàn rõ ràng, điều này trực tiếp làm cho JSON phản hồi mặc định cho một trình duyệt web (gửi Accept: text / html). Làm tốt lắm. - gregmac
+1 Far và đi câu trả lời tốt nhất. Tôi tưởng tượng có một tấn ppl người chọn hoàn toàn loại bỏ XML chỉ vì họ không thấy JSON trong trình duyệt. - Derek Hunziker
Lưu ý rằng phản hồi Content-Type tiêu đề vẫn sẽ là text/html. - Mrchief
Điều này thật kinh khủng. Tiêu đề kiểu nội dung phản hồi phải là application / json. "Giải pháp" này làm cho nó văn bản / html. - meffect
Câu trả lời này thậm chí còn tốt hơn: stackoverflow.com/a/26068063/510149 - kipusoep


Nếu bạn làm điều này trong WebApiConfig bạn sẽ nhận được JSON theo mặc định, nhưng nó vẫn sẽ cho phép bạn trả về XML nếu bạn vượt qua text/xml theo yêu cầu Accept tiêu đề

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
    }
}

Nếu bạn không sử dụng loại dự án MVC và do đó không có lớp này để bắt đầu, xem câu trả lời này để biết chi tiết về cách kết hợp nó.


471
2017-09-19 02:53



Chỉ cần lưu ý, hành vi ban đầu là chính xác. Yêu cầu của Chrome application/xml với mức độ ưu tiên là 0,9 và */* với mức độ ưu tiên là 0,8. Bằng cách loại bỏ application/xml bạn loại bỏ khả năng cho Web API trả về XML nếu máy khách yêu cầu cụ thể. ví dụ. nếu bạn gửi "Chấp nhận: ứng dụng / xml", bạn sẽ vẫn nhận JSON. - porges
Có phải tôi, hoặc là câu đầu tiên không chính xác? Mã xuất hiện để loại bỏ hoàn toàn XML, không chỉ đơn giản là thay đổi mặc định. - NickG
@NickG: một giải pháp được bỏ qua ở đây và IMHO là một lựa chọn tốt hơn nhiều (giữ ứng dụng / xml) là giải pháp được đề xuất bởi Felipe Leusin thấp hơn trên trang này. Sử dụng config.Formatters.XmlFormatter.SupportedMediaTypes.Add (new MediaTypeHeaderValue ("text / html")); - Cohen
Vì vậy, làm thế nào để chúng tôi làm điều đó thông qua cấu hình web để chúng tôi nhận được json theo mặc định và XML nếu được yêu cầu? - Kyle
@Felipse Leusin của câu trả lời dưới đây là thực sự ngắn hơn và hoạt động tốt hơn. - Ken Smith


tôi thích Cách tiếp cận của Felipe Leusin tốt nhất - đảm bảo các trình duyệt nhận được JSON mà không ảnh hưởng đến thương lượng nội dung từ các khách hàng thực sự muốn XML. Phần duy nhất còn thiếu đối với tôi là các tiêu đề phản hồi vẫn chứa nội dung kiểu: text / html. Tại sao lại là một vấn đề? Bởi vì tôi sử dụng Tiện ích mở rộng định dạng JSON của Chrome, kiểm tra loại nội dung và tôi không nhận được định dạng đẹp mà tôi thường sử dụng. Tôi đã khắc phục điều đó bằng trình định dạng tùy chỉnh đơn giản chấp nhận yêu cầu văn bản / html và trả về phản hồi ứng dụng / json:

public class BrowserJsonFormatter : JsonMediaTypeFormatter
{
    public BrowserJsonFormatter() {
        this.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
        this.SerializerSettings.Formatting = Formatting.Indented;
    }

    public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) {
        base.SetDefaultContentHeaders(type, headers, mediaType);
        headers.ContentType = new MediaTypeHeaderValue("application/json");
    }
}

Đăng ký như vậy:

config.Formatters.Add(new BrowserJsonFormatter());

278
2017-12-12 23:52



Trong hàm tạo thêm this.SerializerSettings.Formatting = Formatting.Indented; nếu bạn muốn nó được in đẹp mà không cần phần mở rộng của trình duyệt. - Alastair Maw
tại sao bạn muốn nó in đẹp trên dây? - meffect
Không phải là @ dmit77 's Câu trả lời tốt hơn (ngắn gọn hơn) này? - H.Wolper
@eddiegroves bạn không muốn in đẹp trên dây. Bạn muốn máy chủ gửi số bit ít nhất trên dây (ví dụ: không có khoảng trắng). Sau đó, bạn muốn trình duyệt để định dạng nó độc đáo, với addons và như vậy. Javascript cần phải phân tích cú pháp JSON thường, tại sao làm cho nó chậm hơn bằng cách giới thiệu định dạng không cần thiết - meffect
Đối với những người tìm kiếm người đang tìm kiếm: đừng quên thêm using System.Net.Http.Formatting và using Newtonsoft.Json - Berriel


Sử dụng RequestHeaderMapping hoạt động tốt hơn, bởi vì nó cũng đặt Content-Type = application/json trong tiêu đề phản hồi, cho phép Firefox (với phần bổ trợ JSONView) định dạng phản hồi dưới dạng JSON.

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings
.Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", 
                              "text/html",
                              StringComparison.InvariantCultureIgnoreCase,
                              true, 
                              "application/json"));

231
2017-09-26 20:48



Đây là giải pháp gọn gàng và đơn giản nhất và Fiddler cũng phát hiện loại nội dung được trả về dưới dạng josn. - Steve Johnson
Tốt đẹp! Bạn đề nghị đặt mã này ở đâu? - Tim Abell
Nó sẽ đi trong WebApiConfig.cs - Animesh
Đã làm cho tôi. Tôi cần thêm một sử dụng System.Net.Http.Formatting; - bbsimonbb
Đây phải là IMO trả lời được chấp nhận vì nó trả về application/json thay vì text/html. - shuniar


Mẹo nhanh MVC4 # 3 – Loại bỏ trình định dạng XML khỏi API Web ASP.Net

Trong Global.asax thêm dòng:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

như vậy:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    BundleTable.Bundles.RegisterTemplateBundles();
    GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}

171
2018-04-02 16:11



Hoạt động - đẹp hơn nhiều khi JSON là mặc định thay vì XML. - Lee
nhưng bạn vẫn có thể quay lại xml được không? - Thomas Stock
Tôi đã thử nghiệm nó, và bạn không thể. Vì vậy, đây là loại bỏ hỗ trợ XML .. Ye được cảnh báo, người yêu google - Thomas Stock
Nếu bạn có một cái nhìn vào câu trả lời của tôi dưới đây, điều này sẽ cho phép xml vẫn được trả lại nếu bạn muốn nhưng cho phép trang web trả lời với JSON cho trình duyệt - Glenn Slaven
@GlennSlaven yeah câu trả lời của bạn phải là một trong những đánh dấu là đúng. - radu florescu


bên trong WebApiConfig.cs, thêm vào cuối Ghi danh chức năng:

// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);

Nguồn.


102
2018-01-05 22:43



Là XmlFormatter mới trong MVC4? - Glenn Slaven
Trong MVC5, điều này có thể được thực hiện bằng cách thay thế cấu hình bằng GlobalConfiguration.Configuration - Steven
Đối với một dự án chỉ hỗ trợ JSON và không có hoàn cảnh nào có thể được phép phát ra XML, đây là lựa chọn tốt nhất cho đến nay. - Luc C
config.Formatters.Add (config.Formatters.JsonFormatter); - Cas Bloem
Đó là khủng khiếp. - Điều này sẽ luôn trả về JSON bất kể điều gì, ngay cả khi khách hàng yêu cầu cụ thể về XML trong tiêu đề Kiểu nội dung. - BrainSlugs83


bên trong Global.asax Tôi đang sử dụng mã bên dưới. URI của tôi để nhận JSON là http://www.digantakumar.com/api/values?json=true

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new  QueryStringMapping("json", "true", "application/json"));
}

87
2017-07-06 07:00



Tuyệt vời nhất. Phương pháp của bạn mong đợi một tham số là gì? như localhost: 61044 / api / values ​​/ getdate? json = true, ngày = 2012-08-01 - LT.Nolo
loại định dạng dữ liệu web api trả về theo mặc định. là json hay webapi? cảm ơn - Thomas


Hãy xem xét thương lượng nội dung trong WebAPI. Những (Phần 1 & Phần 2) các bài đăng blog chi tiết và toàn diện tuyệt vời giải thích cách hoạt động của nó.

Tóm lại, bạn nói đúng, và chỉ cần đặt Accept hoặc là Content-Type yêu cầu tiêu đề. Do Hành động của bạn không được mã hóa để trả lại một định dạng cụ thể, bạn có thể đặt Accept: application/json.


47
2018-03-24 04:24



"vì vậy tôi có thể xem nó trong trình duyệt" - Spongman
@ Spongman, có bạn có thể. Nhưng sử dụng một phần mở rộng như REST Client - hầu hết các trình duyệt đều có một phần mềm như vậy. Việc gõ trực tiếp url trong trình duyệt là 1. Quá hạn chế (không kiểm soát các tiêu đề, không thể đăng dữ liệu và vv); 2. Không chính xác - Trình duyệt không tiêu thụ api web vì nó được dùng để tiêu thụ - bạn không thể dựa vào nó để kiểm tra nó đúng cách. Vì vậy, một lần nữa, một phần bổ sung REST client tốt sẽ sửa lỗi đó. - Ivaylo Slavov


Vì câu hỏi dành riêng cho Chrome, bạn có thể nhận được Tiện ích Postman cho phép bạn đặt loại nội dung yêu cầu.

Postman


37
2017-09-27 10:40



Trong Firefox, chỉ cần đi tới about: config, tìm kiếm accept.default và thay đổi nội dung của network.http.accept.default cấu hình để text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7. - Bjartur Thorlacius
Hay tốt hơn, chỉ text/html,application/xhtml+xml;q=1.0,*/*;q=0.7 để tránh các máy chủ bị lỗi như Bitbucket vô tình phân phối trình duyệt JSON của bạn thay cho HTML. - Bjartur Thorlacius
URL đã chết. Một cái mới là chrome.google.com/webstore/detail/postman/…. - Falcon Momot


Một tùy chọn nhanh là sử dụng chuyên môn MediaTypeMapping. Dưới đây là một ví dụ về việc sử dụng QueryStringMapping trong sự kiện Application_Start:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));

Bây giờ bất cứ khi nào url chứa chuỗi truy vấn? A = b trong trường hợp này, phản hồi Json sẽ được hiển thị trong trình duyệt.


30
2018-03-27 05:08



Điều này rất hữu ích. Bạn cũng có thể sử dụng UriPathExtensionMapping thay vì QueryStringMapping nếu bạn muốn sử dụng path.to/item.json - Nuzzolilo


Mã này làm cho json mặc định của tôi và cho phép tôi sử dụng định dạng XML. Tôi sẽ chỉ thêm xml=true.

GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add(new QueryStringMapping("xml", "true", "application/xml"));
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

Cảm ơn mọi người!


27
2017-09-03 01:48



Đây là câu trả lời linh hoạt nhất (và thực sự phải là cấu hình mặc định những ngày này). Để thêm vào câu trả lời này, JSON là mặc định, bao gồm từ trình duyệt. Để xem XML, thêm chuỗi truy vấn:? Xml = true - raider33
Đã thử một số chiến lược. Đã có một thử nghiệm đơn giản cho cả XML và JSON và điều này làm việc ra khỏi hộp - pat capozzi