Kaip padaryti, kad ASP.NET Web API sugrąžintų JSON vietoj XML naudojant „Chrome“?

Naudojant naują „ ASP.NET“ žiniatinklio API , „ Chrome“ matau XML - kaip aš galiu pakeisti jį, kad paprašyti JSON , kad galėčiau jį peržiūrėti naršyklėje? Manau, kad tai tik dalis prašymų antraščių, ar tai teisinga?

1153
24 марта '12 в 2:04 2012-03-24 02:04 naspinskis yra nustatytas kovo 24 d ., 12 val
@ 28 atsakymai

Tiesiog App_Start / WebApiConfig.cs “ MVC Web API projekte.

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

Tai užtikrina, kad gausite daugumą užklausų, tačiau xml galite gauti siųsdami text/xml .

Jei jums reikia „ Content-Type atsakymo, pvz., application/json , patikrinkite žemiau pateiktą „Todd“ atsakymą .

NameSpace naudoja System.Net.Http.Headers ;

1414
07 нояб. atsakymą pateikė Felipe Leusin, lapkričio 7 d. 2012-11-07 23:25 '12 - 23:25 2012-11-07 23:25

Jei tai padarysite „ WebApiConfig , pagal nutylėjimą gausite JSON, tačiau jis vis tiek leis grąžinti XML, jei perduosite text/xml kaip Accept užklausos antraštę.

 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); } } 
border=0

Jei nesinaudojate MVC projekto tipu ir todėl neturėjote šios klasės, žr. Šį atsakymą, jei norite gauti daugiau informacijos apie tai, kaip ją įgalinti.

462
19 сент. Glenn Slaven paskelbė rugsėjo 19 d 2012-09-19 05:53 '12 at 5:53 2012-09-19 05:53

Man patinka „ Felipe Leusin“ požiūris - įsitikinkite, kad naršyklės gauna JSON, nepažeidžiant turinio koordinavimo su klientais, kurie tikrai nori XML. Vienintelė man trūksta ta, kad atsakymų antraštėse vis dar buvo turinio tipas: text / html. Kodėl tai yra problema? Nes naudoju plėtinį

Registruokitės taip:

 config.Formatters.Add(new BrowserJsonFormatter()); 
246
13 дек. Atsakymas pateikiamas Todd Menier 13 d. 2013-12-13 02:52 '13, 2:52 2013-12-13 02:52

„RequestHeaderMapping“ naudojimas veikia dar geriau, nes jis taip pat nustato atsakymo antraštėje „Content-Type = application / json“, kuris leidžia „Firefox“ (su „JSONView“ priedu) formuoti atsakymą kaip JSON.

 GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings .Add(new System.Net.Http.Formatting.RequestHeaderMapping("Accept", "text/html", StringComparison.InvariantCultureIgnoreCase, true, "application/json")); 
167
26 сент. atsakymas yra dmit77 26 sep . 2014-09-26 23:48 '14, 23:48, 2014-09-26 23:48

MVC4 greitojo patarimo 3-ojo ekstrakto XML formatavimo priemonė iš ASP.Net interneto sąsajos

Global.asax pridėkite eilutę:

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

taip:

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); BundleTable.Bundles.RegisterTemplateBundles(); GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); } 
164
02 апр. Yakiro dvaro atsakymas 02 Bal 2012-04-02 19:11 '12, 11:11 PM 2012-04-02 19:11

WebApiConfig.cs“ įrašykite registracijos funkciją iki galo:

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

Šaltinis

94
06 янв. Atsakymą pateikė Michael Vashchinsky 06 06 2013-01-06 01:43 '13 ne 1:43 2013-01-06 01:43

Global.asax“ sistemoje naudoju šį kodą. Mano URI, kad gautumėte JSON 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")); } 
85
06 июля '12 в 10:00 2012-07-06 10:00 atsakymą pateikė Diganta Kumar liepos 12 d. 12 val. 10:00 2012-07-06 10:00

Pažvelkite į turinio derybas „WebAPI“. Tai ( 1 ir 2 dalys ) puikiai išsamūs ir išsamūs dienoraščio įrašai paaiškina, kaip jis veikia.

Trumpai tariant, esate teisus ir jums tereikia nustatyti „ Accept arba „ Content-Type užklausos antraštes. Jei jūsų veiksmas nėra užkoduotas tam, kad grąžintumėte konkretų formatą, galite nustatyti „ Accept: application/json .

47
24 марта '12 в 7:24 2012-03-24 07:24 atsakymą pateikė Aaron Daniels kovo 12 d. 12 val. 2012-03-24 07:24

Kadangi klausimas susijęs su „Chrome“, galite gauti „ Postman“ plėtinį, kuris leidžia nustatyti užklausos turinio tipą.

2019

35
27 сент. Chris S atsakymas, pateiktas rugsėjo 27 d 2013-09-27 13:40 '13, 13:40 2013-09-27 13:40

Vienas greitas variantas yra naudoti „MediaTypeMapping“ specializaciją. Toliau pateikiamas „QueryStringMapping“ naudojimo pavyzdys „Application_Start“ renginyje:

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

Dabar, kai URL yra prašymas, a = b, „Json“ atsakymas bus rodomas naršyklėje.

29
27 марта '12 в 8:08 2012-03-27 08:08 atsakymas pateikiamas suhair kovo 27 d. 12 val. 8:08 2012-03-27 08:08

Šis kodas paleidžia mano numatytąjį ir leidžia naudoti XML formatą. Aš tiesiog pridėkite xml=true .

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

Ačiū visiems!

27
03 сент. Atsakymas pateikiamas jayson.centeno 03 rugsėjis. 2013-09-03 04:48 '13, 4:48, 2013-09-03 04:48

Nenaudokite naršyklės, kad patikrintumėte savo API.

Vietoj to, pabandykite naudoti HTTP klientą, kuris leidžia nurodyti užklausą, pvz., CURL ar net Fiddler.

Šios problemos problema kyla kliente, o ne API. Žiniatinklio API veikia tinkamai pagal naršyklės užklausą.

15
15 июля '12 в 3:24 2012-07-15 03:24 atsakymas pateikiamas dmyoko liepos 15 d., 12 val

Naudodamas pasaulinio veiksmo filtrą pašalinau „ Accept: application/xml kai User-Agent antraštėje yra „Chrome“:

 internal class RemoveXmlForGoogleChromeFilter : IActionFilter { public bool AllowMultiple { get { return false; } } public async Task<HttpResponseMessage> ExecuteActionFilterAsync( HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) { var userAgent = actionContext.Request.Headers.UserAgent.ToString(); if (userAgent.Contains("Chrome")) { var acceptHeaders = actionContext.Request.Headers.Accept; var header = acceptHeaders.SingleOrDefault( x => x.MediaType.Contains("application/xml")); acceptHeaders.Remove(header); } return await continuation(); } } 

Atrodo, kad tai veikia.

7
23 июня '13 в 17:47 2013-06-23 17:47 atsakymą pateikė Roger Lipscombe , birželio 23 d., 13 val., 5:47, 2013-06-23 17:47

Dauguma pirmiau minėtų atsakymų yra prasmingi. Kadangi matote, kad duomenys yra suformatuoti XML formatu, tai reiškia, kad naudojamas XML, SO formatas, JSON formatą galite matyti paprasčiausiai pašalinant XMLFormatter iš HttpConfiguration parametro, pvz.

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

nes „Json“ yra standartinis formatas

6
13 апр. atsakymas pateikiamas pavan kumar 13 balandžio. 2017-04-13 09:26 '17 ne 9:26 2017-04-13 09:26

Radau, kad „Chrome“ išplėstinė „REST“ kliento programa veikia gerai su „REST“ paslaugomis. Galite nustatyti turinio tipą application/json , beje: Išplėstinis REST klientas

5
29 марта '12 в 0:57 2012-03-29 00:57 Atsakymą pateikė Mike Rowley kovo 29 d. 12 val. 0:57 2012-03-29 00:57

Čia yra sprendimas, panašus į „ jayson.centeno“ ir kitus atsakymus, bet naudojant „ System.Net.Http.Formatting integruotą plėtinį.

 public static void Register(HttpConfiguration config) { // add support for the 'format' query param // cref: http://blogs.msdn.com/b/hongyes/archive/2012/09/02/support-format-in-asp-net-web-api.aspx config.Formatters.JsonFormatter.AddQueryStringMapping("$format", "json", "application/json"); config.Formatters.XmlFormatter.AddQueryStringMapping("$format", "xml", "application/xml"); // ... additional configuration } 

Sprendimas daugiausia buvo skirtas $ OData formato palaikymui ankstyvuosiuose „WebApi“ leidimuose, tačiau jis taip pat taikomas ne OData įgyvendinimui ir grąžina Content-Type: application/json; charset=utf-8 atsakant į Content-Type: application/json; charset=utf-8 .

Tai leidžia jums prijungti > arba > į savo uri pabaigą bandant su naršykle. Tai netrukdo kitiems numatomiems veiksmams, kai naudojamas ne naršyklės klientas, kuriame galite nustatyti savo antraštes.

3
12 янв. Atsakymas pateikiamas mdisibio sausio 12 d 2016-01-12 20:06 '16 at 20:06 2016-01-12 20:06

Įdomu, kodėl tai yra visa tai sudėtinga. Žinoma, yra daug būdų tai padaryti, su QueryStrings, antraštėmis ir parametrais ... bet tai, ką manau kaip geriausias, yra paprasta. Jūs prašote paprasto URL (pvz., http://yourstartup.com/api/cars ) ir, priešingai, gauti JSON. Jūs gaunate JSON su atitinkamu atsakymo antrašte:

 Content-Type: application/json 

Ieškodami atsakymo į šį klausimą, radau šią temą ir turėjau tęsti darbą, nes šis priimtas atsakymas neveikia tiksliai. Radau atsakymą, kuris, mano nuomone, yra per paprastas, kad nebūtų geriausias:

Nustatykite numatytąjį webAPI formatą

Aš taip pat pridėsiu savo patarimus.

 WebApiConfig.cs namespace com.yourstartup { using ...; using System.Net.Http.Formatting; ... config.Formatters.Clear(); //because there are defaults of XML.. config.Formatters.Add(new JsonMediaTypeFormatter()); } 

Turiu klausimą apie tai, iš kur gaunamos numatytosios vertės (bent jau tos, kurias matau). Ar jie standartiniai .NET numatytieji, ar galbūt sukurti kažkur kitur (kažkas mano projekte). Anway, tikiuosi, kad tai padės.

2
09 окт. Atsakymas pateikiamas Nick 09 Oct. 2015-10-09 19:19 '15, 19:19, 2015-10-09 19:19

pagal naujausią ASP.net WebApi 2 versiją,

WebApiConfig.cs , tai veiks

 config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter); 
2
27 окт. atsakymas pateiktas spalio 27 d 2016-10-27 13:26 '16, 13:26 pm 2016-10-27 13:26

Jūs tiesiog pakeiskite „ App_Start/WebApiConfig.cs taip:

 public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes(); //Below formatter is used for returning the Json result. var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"); config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType); //Default route config.Routes.MapHttpRoute( name: "ApiControllerOnly", routeTemplate: "api/{controller}" ); } 
2
08 февр. Atsakymą pateikė vaheeds 08 Feb. 2016-02-08 08:03 '16 at 8:03 2016-02-08 08:03

Tiesiog pridėkite šias dvi kodo eilutes į „ WebApiConfig“ klasę .

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { //add this two line config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); ............................ } } 
1
Atsakymas pateikiamas Md. 10 нояб. Sabbir Ahamed lapkritis 10 2016-11-10 14:11 '16 at 14:11 pm 2016-11-10 14:11

Čia yra paprasčiausias būdas, kurį naudoju savo programose. Register funkcijoje į „ App_Start\\WebApiConfig.cs pridėkite šias 3 kodų eilutes

  var formatters = GlobalConfiguration.Configuration.Formatters; formatters.Remove(formatters.XmlFormatter); config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json")); 

„Asp.net“ žiniatinklio API automatiškai konvertuoja grįžtamąjį objektą į „JSON“ ir prideda antraštę, kad naršyklė ar gavėjas suprastų, kad grąžinate JSON rezultatą.

1
28 мая '16 в 13:49 2016-05-28 13:49 atsakymą pateikė Vikas Bansal , gegužės 28 d., 16 d., 1:49 2016-05-28 13:49

Nuo prašymo (ir atsakymo) praėjo šiek tiek laiko, tačiau kita parinktis yra nepaisyti serverio priėmimo antraštės, apdorojant užklausą naudojant „MessageHandler“, kaip parodyta toliau:

 public class ForceableContentTypeDelegationHandler : DelegatingHandler { protected async override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var someOtherCondition = false; var accHeader = request.Headers.GetValues("Accept").FirstOrDefault(); if (someOtherCondition  accHeader.Contains("application/xml")) { request.Headers.Remove("Accept"); request.Headers.Add("Accept", "application/json"); } return await base.SendAsync(request, cancellationToken); } } 

Kai kurios someOtherCondition gali būti bet kokios, įskaitant naršyklės tipą ir kt. Tai būtų sąlyginiai atvejai, kai tik kartais norime pakeisti numatytąsias turinio derybas. Priešingu atveju, pagal kitus atsakymus, paprasčiausiai pašalinate nereikalingą formatavimą iš konfigūracijos.

Žinoma, turėsite ją užregistruoti. Tai galite padaryti visame pasaulyje:

  public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new ForceableContentTypeDelegationHandler()); } 

arba maršrutas:

 config.Routes.MapHttpRoute( name: "SpecialContentRoute", routeTemplate: "api/someUrlThatNeedsSpecialTreatment/{id}", defaults: new { controller = "SpecialTreatment" id = RouteParameter.Optional }, constraints: null, handler: new ForceableContentTypeDelegationHandler() ); 

Ir kadangi tai yra pranešimo tvarkytojas, jis veiks tiek dujotiekyje, tiek ant dujotiekio, kaip ir „ HttpModule . Taigi galite lengvai patvirtinti nepaisymą naudodami pasirinktinę antraštę:

 public class ForceableContentTypeDelegationHandler : DelegatingHandler { protected async override Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken) { var wasForced = false; var someOtherCondition = false; var accHeader = request.Headers.GetValues("Accept").FirstOrDefault(); if (someOtherCondition  accHeader.Contains("application/xml")) { request.Headers.Remove("Accept"); request.Headers.Add("Accept", "application/json"); wasForced = true; } var response = await base.SendAsync(request, cancellationToken); if (wasForced){ response.Headers.Add("X-ForcedContent", "We overrode your content prefs, sorry"); } return response; } } 
1
06 дек. atsakymas suteiktas rismui 06 gruodis. 2015-12-06 09:32 '15 ne 9:32 2015-12-06 09:32
  config.Formatters.Remove(config.Formatters.XmlFormatter); 
1
01 июля '17 в 7:31 2017-07-01 07:31 Atsakymą pateikė Gaurav Dubey liepos 1 d. 17 d. 7:31 2017-07-01 07:31

Tinkamo formato grąžinimas atliekamas pagal medijos tipo formatą. Kaip minėta, tai galite padaryti „ WebApiConfig klasėje:

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { ... // Configure Web API to return JSON config.Formatters.JsonFormatter .SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html")); ... } } 

Daugiau informacijos rasite:

Jei jūsų veiksmai grįžta į XML (numatytasis yra teisingas), ir jums reikia tik specialaus metodo, kaip grąžinti JSON, galite naudoti „ ActionFilterAttribute ir taikyti jį šiam konkrečiam veiksmui.

Filtruoti atributą:

 public class JsonOutputAttribute : ActionFilterAttribute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { ObjectContent content = actionExecutedContext.Response.Content as ObjectContent; var value = content.Value; Type targetType = actionExecutedContext.Response.Content.GetType().GetGenericArguments()[0]; var httpResponseMsg = new HttpResponseMessage { StatusCode = HttpStatusCode.OK, RequestMessage = actionExecutedContext.Request, Content = new ObjectContent(targetType, value, new JsonMediaTypeFormatter(), (string)null) }; actionExecutedContext.Response = httpResponseMsg; base.OnActionExecuted(actionExecutedContext); } } 

Taikymas veiksmui:

 [JsonOutput] public IEnumerable<Person> GetPersons() { return _repository.AllPersons(); // the returned output will be in JSON } 

Atkreipkite dėmesį, kad dekoravimo veiksme galite praleisti žodį Attribute ir vietoj [JsonOutputAttribute] naudoti tik [JsonOutputAttribute] .

1
08 дек. atsakymas pateikiamas sukrauti 08 dec. 2016-12-08 22:03 '16 at 10:03 pm 2016-12-08 22:03

„WebApiConfig“ yra vieta, kurioje galite konfigūruoti, ar norite išleisti į „Json“ ar „xml“. numatytasis yra xml. registro funkcijoje galime naudoti „HttpConfiguration“ formatus, kad būtų galima formatuoti išvestį. System.Net.Http.Headers => MediaTypeHeaderValue ("text / html") yra reikalingas norint gauti išvestį json formatu. 2019

25 сент. atsakymas pateikiamas Parag 25 sep . 2016-09-25 03:13 '16 at 3:13 2016-09-25 03:13

MSDN Sukurkite vieną puslapį su ASP.NET ir AngularJS (apie 41 min.).

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { // ... possible routing etc. // Setup to return json and camelcase it! var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; formatter.SerializerSettings.ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(); } 

Jis turėtų būti dabartinis, aš jį bandžiau ir jis dirbo.

0
30 сент. atsakymas pateikiamas lko 30 sep . 2014-09-30 22:19 '14, 10:19 PM 2014-09-30 22:19

Lengviausias būdas:

  GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 
-1
28 нояб. atsakymą Leo pateikė lapkričio 28 d. 2016-11-28 17:01 '16 at 17:01 2016-11-28 17:01

Pridėti $ format = json į MVC4 + webapi funkcijos pabaigą dabar grąžina rezultatą kaip json, o $ format = xml grąžina XML. Tai yra normalu „Chrome“, nes ekrane rodomi JSON duomenys, tačiau IE bus paprašyta įkelti gautus „Json“ duomenis.

-4
05 авг. Atsakymą pateikė JSobell 05 rug . 2013-08-05 01:24 '13 ne 1:24 2013-08-05 01:24

Kiti klausimai apie „ žymes arba Užduoti klausimą