Як змусити веб-API ASP.NET повернути JSON замість XML за допомогою Chrome?


1220

Використовуючи новіший веб-API ASP.NET , у Chrome я бачу XML - як я можу змінити його, щоб запросити JSON, щоб я міг його переглянути у браузері? Я вважаю, що це лише частина заголовків запитів, чи я в цьому правильний?


8
Тут обговорюється питання про те, щоб повернути JSON лише поведінкою за замовчуванням: github.com/aspnet/Mvc/isissue/1765
Natan

Відповіді:


1736

Я просто додаю наступне на App_Start / WebApiConfig.csуроці у свій проект MVC Web API .

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

Це гарантує отримання JSON більшості запитів, але ви можете отримати його XMLпри надсиланні text/xml.

Якщо вам потрібна відповідь Content-Type, application/jsonперевірте відповідь Тодда нижче .

NameSpaceвикористовує System.Net.Http.Headers.


115
Це несподівано проігнорована відповідь, і хоча початкове запитання було не зовсім зрозумілим, це безпосередньо робить JSON відповіддю за замовчуванням для веб-браузера (який надсилає Accept: text / html). Хороша робота.
gregmac

16
+1 Далеко і далеко найкраща відповідь. Я гадаю, що є безліч ppl, які вирішили повністю видалити XML лише тому, що вони не бачать JSON у браузері.
Дерек Гунзікер

3
Коли я це зробив, я виявив, що дані, надані третьою стороною з тегами розриву HTML, у них закінчуються поверненнями перевезення. Тоді JSON був недійсним. Краще скористатися прийнятою відповіддю, якщо це впливає на вас.
Стоунтіп

23
Зауважте, що Content-Typeзаголовок відповіді все ще буде text/html.
Mrchief

78
Це жахливо. Заголовок типу вмісту відповіді повинен бути application / json. Це "рішення" робить його text / html.
meffect

501

Якщо ви це зробите в, WebApiConfigви отримаєте JSON за замовчуванням, але він все одно дозволить вам повернути XML, якщо ви передасте text/xmlяк Acceptзаголовок запиту

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);
    }
}

Якщо ви не використовуєте тип проекту MVC і тому не мали цього класу для початку, перегляньте цю відповідь, щоб дізнатися, як його включити.


51
Зазначимо, оригінальна поведінка правильна. Chrome запитує application/xmlз пріоритетом 0,9 та */*з пріоритетом 0,8. Видаляючи, application/xmlви видаляєте можливість веб-API повертати XML, якщо клієнт спеціально цього вимагає. наприклад, якщо ви надішлете "Прийняти: application / xml", ви все одно отримаєте JSON.
porges

11
Це я чи це перше речення неправильне? Здається, що код повністю видаляє XML, а не просто змінює типові.
NickG

6
@ NickG: рішення, яке тут не помічено, і IMHO є набагато кращим варіантом (збереження програми / xml) - це рішення, запропоноване Феліпе Леусіном нижче на цій сторінці. Використання config.Formatters.XmlFormatter.SupportedMediaTypes.Add (новий MediaTypeHeaderValue ("текст / html"));
Коен

1
Отже, як це зробити через веб-конфігурацію, щоб ми отримали json за замовчуванням та XML, якщо це вимагається?
Кайл

4
@Felipse Leusin відповідь нижче фактично коротше і працює краще.
Кен Сміт

313

Використання RequestHeaderMapping працює ще краще, оскільки він також встановлює Content-Type = application/jsonу заголовку відповіді, що дозволяє Firefox (з додатком JSONView) форматувати відповідь як JSON.

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

6
Це найскладніше і найпростіше рішення, і Fiddler також визначає тип вмісту, який повертається як josn.
Стів Джонсон

4
Приємно! Де ви б запропонували ввести це в код?
Тім Абелл

9
Він повинен зайти на WebApiConfig.cs
Animesh

9
Працювали для мене. Мені потрібно було додати використання System.Net.Http.Formatting;
bbsimonbb

1
Пов’язання для власної зручності: Ця відповідь чудово поєднується з іншим кроком налаштування, який я зазвичай виконую: stackoverflow.com/a/28337589/398630 .
BrainSlugs83

308

Найкраще мені подобається підхід Феліпе Леусіна - переконайтеся, що браузери отримують JSON, не порушуючи переговорів щодо вмісту від клієнтів, які насправді хочуть XML. Єдиним недоліком для мене було те, що заголовки відповідей все ще містили тип вмісту: text / html. Чому це була проблема? Оскільки я використовую розширення JSON Formatter Chrome , яке перевіряє тип вмісту, і я не отримую гарного форматування, до якого я звик. Я вирішив це за допомогою простого користувальницького форматера, який приймає текстові / html запити та повертає відповіді програми / 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");
    }
}

Зареєструйтесь так:

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

24
У конструктор додайте, this.SerializerSettings.Formatting = Formatting.Indented;якщо хочете, щоб він був надрукований без розширення для браузера.
Аластер Мау

10
чому б ви хотіли, щоб він сильно друкував через дріт?
meffect

8
Чи не @ dmit77 «s Відповідь краще (більш коротким) , ніж ця?
Х.Волпер

8
@eddiegroves ви не хочете, щоб симпатичний друк через провід. Ви хочете, щоб сервер надсилав найменшу кількість бітів по дроту (тобто немає пробілів). Тоді ви хочете, щоб браузер його добре відформатував, з доповненнями тощо. Javascript потрібно зазвичай розбирати JSON, чому це робить повільніше, вводячи непотрібне форматування
meffect

13
Для гуглерів, які шукають: не забудьте додати using System.Net.Http.Formattingіusing Newtonsoft.Json
Берріель,

186

Швидкий рада MVC4 №3 - Видалення XML-формату з веб-API ASP.Net

У Global.asaxдодайте рядок:

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

так:

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

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

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

9
Працює - набагато приємніше, щоб JSON був за замовчуванням замість XML.
Уїтніленд

5
але ви все одно можете повернути xml тоді?
Томас Сток

99
Я перевірив це, а ви не можете. Таким чином, це усуває підтримку XML. Попереджуйте вас, шановні люди Google
Томас Сток

3
Якщо ви подивитесь на мою відповідь нижче, це дозволить xml все-таки повернутись, якщо ви хочете, але дозвольте сайту відповісти JSON браузеру
Glenn Slaven,

3
@GlennSlaven так, ваша відповідь повинна бути такою, яка позначена як правильна.
radu florescu

114

У WebApiConfig.cs додайте до кінця функції Реєстрація :

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

Джерело .


Чи новий XmlFormatter новий у MVC4?
Гленн Славен

1
У MVC5 це можна зробити, замінивши config на GlobalConfiguration.Configuration
Стівен

4
Для проекту, який повинен підтримувати лише JSON і ні в якому разі не можна дозволити випромінювати XML, це, безумовно, найкращий варіант.
Люк C

1
config.Formatters.Add (config.Formatters.JsonFormatter);
Cas Bloem

3
Це жахливо. - Це завжди поверне JSON незалежно від того, навіть якщо клієнт спеціально запитує XML у заголовку Content-Type.
BrainSlugs83

94

У Global.asax я використовую наведений нижче код. Мій URI для отримання 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"));
}

2
Чудовий. Який метод очікує параметр? як localhost: 61044 / api / values ​​/ getdate? json = true, дата = 2012-08-01
LT.Nolo

який формат даних веб-api повертаються за замовчуванням. це json чи webapi? дякую
Томас

54

Погляньте на узгодження контенту в WebAPI. Ці ( частина 1 та частина 2 ) дивовижно деталізовані та ретельні публікації в блогах пояснюють, як це працює.

Словом, ви праві, і вам просто потрібно встановити заголовки Acceptабо Content-Typeзапит. З огляду на те, що ваша дія не кодується для повернення певного формату, ви можете встановити Accept: application/json.


6
"щоб я міг переглядати це у браузері"
Spongman

1
@Spongman, так можна. Але використовуйте розширення типу REST Client - у більшості браузерів таке є. Пряме введення URL-адреси у веб-переглядачі: 1. Занадто обмежує (немає контролю над заголовками, не можна публікувати дані тощо); 2. Неправильно - веб-переглядач не використовує веб-програми, як вони призначені для споживання - ви не можете розраховувати на те, що він перевірить її належним чином. Отже, знову ж таки, добрий додаток REST для клієнтів це виправить.
Івайло Славов

45

Оскільки питання стосується Chrome, ви можете отримати розширення Postman, яке дозволяє встановити тип вмісту запиту.

Листоноша


У Firefox просто перейдіть до про: config, шукайте accept.default та змініть вміст network.http.accept.defaultконфігурації на text/html,application/xhtml+xml,application/json;q=0.9,application/xml;q=0.8,*/*;q=0.7.
Bjartur Thorlacius

Або ще краще, text/html,application/xhtml+xml;q=1.0,*/*;q=0.7щоб уникнути випадкових хостів, таких як Bitbucket, випадково обслуговувати ваш браузер JSON замість HTML.
Bjartur Thorlacius

URL-адреса мертва. Новий - chrome.google.com/webstore/detail/postman/… .
Falcon Momot

35

Одним із швидких варіантів є використання спеціалізації MediaTypeMapping. Ось приклад використання QueryStringMapping у події Application_Start:

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

Тепер, коли URL містить рядок запитів? A = b в цьому випадку, відповідь Json відображатиметься в браузері.


2
Це було дуже корисно. Ви також можете використовувати UriPathExtensionMapping замість QueryStringMapping, якщо ви хочете використовувати path.to/item.json
nuzzolilo

32

Цей код робить json моїм за замовчуванням і дозволяє мені також використовувати формат XML. Я просто додаю xml=true.

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

Дякую всім!


1
Це найбільш гнучка відповідь (і справді це має бути конфігурація за замовчуванням в ці дні). Щоб додати цю відповідь, за замовчуванням є JSON, у тому числі від браузера. Щоб переглянути XML, додайте рядок запиту:? Xml = true
raider33

Спробував ряд стратегій. Провели простий тест і для XML, і для JSON, і це вийшло з коробки
пат capozzi

23

Не використовуйте веб-переглядач для тестування свого API.

Натомість спробуйте використовувати клієнт HTTP, який дозволяє вказати ваш запит, наприклад, CURL або навіть Fiddler.

Проблема з цим питанням полягає в клієнті, а не в API. Веб-API поводиться правильно, відповідно до запиту браузера.


30
Чому б не використовувати браузер? Це очевидний інструмент для цього.
Андерс Лінден

4
Я вважаю, що тут важливий пункт - ми не повинні перефіксувати робочу частину програми (інфраструктуру MVC WebAPI), якщо проблема викликана клієнтом. Справжній випадок використання Api має бути належним чином використаний (надавши правильні заголовки), що є обов'язком програми. Я не погоджуюся з тим, що повністю відкинути браузер - для тестування існує безліч інструментів для майже будь-якого браузера (для початку потрібні розширення, схожі на клієнта).
Івайло Славов

6
Це, мабуть, має бути коментарем.
бон

17

Більшість наведених відповідей має ідеальний сенс. Оскільки ви бачите, що дані форматуються у форматі XML, це означає, що застосовано формат XML, так що ви можете побачити формат JSON просто видаливши XMLFormatter з параметра HttpConfiguration, наприклад

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();
        }

оскільки JSON - це стандартний формат


12

Я використовував глобальний фільтр дій, щоб видалити, Accept: application/xmlколи User-Agentзаголовок містить "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();
    }
}

Здається, працює.



10

Повернення правильного формату виконується за допомогою форматера медіа-типу. Як згадували інші, це можна зробити на WebApiConfigуроці:

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"));

        ...
    }
}

Докладніше:

Якщо ваші дії повертають XML (це за замовчуванням), і вам потрібен лише певний метод для повернення JSON, ви можете використовувати ActionFilterAttributeта застосувати його до цієї конкретної дії.

Атрибут фільтра:

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);
    }
}

Застосування до дії:

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

Зауважте, що ви можете опустити слово Attributeна декорі дії та використовувати лише [JsonOutput]замість [JsonOutputAttribute].


7
        config.Formatters.Remove(config.Formatters.XmlFormatter);

3
Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді. Прочитайте цей stackoverflow.com/help/how-to-answer
SR

6

відповідно до останньої версії ASP.net WebApi 2,

під WebApiConfig.cs, це буде працювати

config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);

6

Мені незрозуміло, чому є вся ця складність у відповіді. Звичайно, існує багато способів зробити це за допомогою QueryStrings, заголовків та параметрів ... але те, що я вважаю найкращою практикою, просте. Ви вимагаєте звичайну URL-адресу (наприклад:), http://yourstartup.com/api/carsа взамін отримуєте JSON. Ви отримуєте JSON з відповідним заголовком відповіді:

Content-Type: application/json

Шукаючи відповіді на це саме те питання, я знайшов цю тему, і мені довелося продовжувати роботу, оскільки ця прийнята відповідь не працює точно. Я знайшов відповідь, який мені здається занадто простим, щоб не бути найкращим:

Встановіть формат форматного формату WebAPI

Я також додам свою пораду тут.

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());
}

У мене є питання, звідки беруться параметри за замовчуванням (принаймні ті, кого я бачу). Вони за замовчуванням .NET або, можливо, створені десь ще (хтось інший у моєму проекті). Завжди, сподіваюся, це допомагає.


5

Ось рішення, схоже на відповіді jayson.centeno та інші відповіді, але з використанням вбудованого розширення від System.Net.Http.Formatting.

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
 }

Рішення в першу чергу було спрямоване на підтримку формату $ для OData у ранніх випусках WebApi, але воно також стосується і реалізації не-OData, і повертає Content-Type: application/json; charset=utf-8заголовок у відповідь.

Це дозволяє вам під час тестування за допомогою браузера приєднати &$format=jsonабо &$format=xmlдо кінця свого урі. Це не заважає іншій очікуваній поведінці під час використання клієнта, який не переглядає браузер, де ви можете встановити власні заголовки.


5

Ви можете використовувати як нижче:

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

Якщо ви робите додаток WebAPI для просто передачі повідомлень JSON, врахуйте цю відповідь.
allen1

4

Просто додайте ці два рядки коду до класу WebApiConfig

public static class WebApiConfig
{
     public static void Register(HttpConfiguration config)
     {
          //add this two line 
          config.Formatters.Clear();
          config.Formatters.Add(new JsonMediaTypeFormatter());


          ............................
      }
}

3

Ви просто змінюєте App_Start/WebApiConfig.csтак:

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}"
       );
    }

Видалення форматера, як правило, не є хорошою ідеєю, ви видаляєте функціонал.
naspinski

Насправді в цьому випадку для мене це добре працює, також багато інших пропонують такий спосіб. Я дізнався це з книги myview.rahulnivi.net/building-spa-angular-mvc-5 !
vaheeds

2

З MSDN Створення програми на одній сторінці за допомогою ASP.NET та AngularJS (близько 41 хв.).

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();
    }

Це повинно бути поточним, я спробував це, і це спрацювало.


2

З моменту запитання (і відповіді) минуло певний час, але інший варіант - замінити заголовок Accept на сервері під час обробки запиту за допомогою MessageHandler, як показано нижче:

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);
    }
}

Де someOtherConditionможе бути що завгодно, включаючи тип браузера тощо. Це було б для умовних випадків, коли лише іноді ми хочемо змінити переговори щодо вмісту за замовчуванням. Інакше, як і за іншими відповідями, ви просто видалите непотрібний форматник із конфігурації.

Вам, звичайно, потрібно буде його зареєструвати. Ви можете це зробити у всьому світі:

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

або на маршруті за маршрутом:

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

А оскільки це обробник повідомлень, він буде працювати як на запиті, так і на відповідях кінця конвеєра, як на HttpModule. Таким чином, ви можете легко визнати заміщення за допомогою спеціального заголовка:

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;
    }
}

2

Ось найпростіший спосіб, який я використовував у своїх програмах. Додайте наведені нижче 3 рядки коду App_Start\\WebApiConfig.csу Registerфункціонуванні

    var formatters = GlobalConfiguration.Configuration.Formatters;

    formatters.Remove(formatters.XmlFormatter);

    config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));

Веб-API Asp.net автоматично серіалізує ваш об’єкт, що повертається, до JSON, і як application/jsonдодається у заголовку, щоб браузер або отримувач зрозуміли, що ви повертаєте результат JSON.


1

WebApiConfig - це місце, де можна налаштувати, чи потрібно виводити в json або xml. за замовчуванням це xml. у функції реєстрації ми можемо використовувати формати форматів HttpConfiguration для форматування виводу. System.Net.Http.Headers => MediaTypeHeaderValue ("текст / html") потрібно отримати вихід у форматі json. введіть тут опис зображення


1

Використовуючи відповідь Феліпе Леусіна протягом багатьох років, після недавнього оновлення основних бібліотек та Json.Net, я наткнувся на System.MissingMethodException: SupportedMediaTypes. У моєму випадку, сподіваємось, корисним для інших, хто відчуває такий же несподіваний виняток, є встановлення System.Net.Http. NuGet, очевидно, видаляє його за деяких обставин. Після встановлення вручну проблему було вирішено.


-3

Я здивований, коли я бачив так багато відповідей, що вимагають кодування для зміни одного випадку використання (GET) в одному API, замість того, щоб використовувати належний інструмент, що має бути встановлено один раз, і його можна використовувати для будь-якого API (власного чи третього боку) та всіх випадки використання.

Тож хороша відповідь:

  1. Якщо ви хочете лише попросити json або інший тип вмісту, встановіть Requestly або подібний інструмент та змініть заголовок Accept.
  2. Якщо ви також хочете використовувати POST і добре відформатовані json, xml тощо, скористайтеся правильним розширенням для тестування API, наприклад Postman або ARC .

Деякі вважають за краще робити речі, не додаючи роздуття у вигляді додаткових інструментів та бібліотек.
tno2007

Вносити зміни в API все ще неправильно лише тому, що хтось використовує неправильний інструмент для роботи. Веб-браузер не призначений для тестування API, навіть для перегляду вихідних даних API, а для перегляду документів. Ще гірше, якщо хтось вважає, що інструмент тестера API роздутий замість частини обов'язкового набору інструментів для будь-якого розробника API, і, чесно кажучи, я також додав би розробників на передньому кінці, оскільки їм також потрібно взаємодіяти та експериментувати з API. Можливо, це також недостатньо, оскільки браузер без надбудов не дозволяє встановлювати заголовки, розміщувати в API або навіть перевіряти заголовки відповідей.
користувач3285954

Я розумію, що ти кажеш, і ти не помилишся. Але просто поза темою, причина, по якій ви отримуєте голосування - це тон, в якому ви відповідаєте на питання. Ви звучите дуже бойово і натрапляєте на розробника, який вважає, що вони все знають, і це дуже неприємно. Я впевнений, що ви чудовий розробник, судячи з ваших відповідей. Але ви повинні навчитися, особливо в такому професійному середовищі QA, звертатися та переконувати людей у ​​більш дружній та людській формі. Можливо, спочатку дайте потрібну відповідь, потім поясніть кращий спосіб і мотивуйте, чому це краще.
tno2007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.