Как получить ASP.NET Web API для возврата JSON вместо XML с помощью Chrome?


1220

Используя более новый ASP.NET Web API , в Chrome я вижу XML - как я могу изменить его для запроса JSON, чтобы я мог просматривать его в браузере? Я действительно считаю, что это только часть заголовков запроса, я прав в этом?


8
Здесь обсуждается, чтобы возвращать JSON только по умолчанию: github.com/aspnet/Mvc/issues/1765
Натан,

Ответы:


1738

Я просто добавляю следующее в 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 Далеко и далеко лучший ответ. Я предполагаю, что есть тонна людей, которые решили полностью удалить XML только потому, что они не видят JSON в браузере.
Дерек

3
Когда я это сделал, я обнаружил, что данные, предоставленные третьей стороной с тегами HTML break, содержат возврат каретки. JSON был тогда недействительным. Лучше использовать принятый ответ, если это влияет на вас.
Stonetip

23
Обратите внимание, что Content-Typeзаголовок ответа по- прежнему будет text/html.
Mrchief

78
Это ужасно Заголовок типа содержимого ответа должен быть application / json. Это «решение» делает его текстовым / html.
эффект

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вы удаляете возможность для Web API возвращать XML, если клиент запрашивает это специально. Например, если вы отправите «Accept: application / xml», вы все равно получите JSON.
porges

11
Это я или неверное первое предложение? Код, по-видимому, полностью удаляет XML, а не просто меняет значение по умолчанию.
NickG

6
@NickG: решение, которое здесь упускается, и IMHO, гораздо лучший вариант (сохранение application / xml) - это решение, предложенное Фелипе Леусином ниже на этой странице. Использование config.Formatters.XmlFormatter.SupportedMediaTypes.Add (new MediaTypeHeaderValue ("text / html"));
Коэн

1
Итак, как нам это сделать через веб-конфигурацию, чтобы мы получили json по умолчанию и XML, если требуется?
Кайл

4
Ответ @Felipse Leusin ниже на самом деле короче и работает лучше.
Кен Смит

314

Использование 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
Анимеш

9
Работал на меня. Мне нужно было добавить использование System.Net.Http.Formatting;
bbsimonbb

1
Ссылка для собственного удобства. Этот ответ прекрасно сочетается с другим шагом настройки, который я обычно выполняю: stackoverflow.com/a/28337589/398630 .
BrainSlugs83

309

Мне больше нравится подход Фелипе Леусина - убедитесь, что браузеры получают JSON без ущерба для согласования контента от клиентов, которые действительно хотят XML. Единственное, чего мне не хватало, так это того, что заголовки ответов по-прежнему содержали тип содержимого: text / html. Почему это было проблемой? Потому что я использую расширение JSON Formatter Chrome , которое проверяет тип контента, и я не получаю красивое форматирование, к которому я привык. Я исправил это с помощью простого пользовательского средства форматирования, которое принимает запросы text / html и возвращает ответы application / 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
почему вы хотите, чтобы он печатался поверх провода?
эффект

8
Не @ dmit77 «s Ответ лучше (более кратким) , чем эта?
H.Wolper

8
@eddiegroves, ты не хочешь красивую печать по проводам. Вы хотите, чтобы сервер отправлял наименьшее количество битов по проводам (то есть: без пробелов). Затем вы хотите, чтобы браузер хорошо отформатировал его, с помощью дополнений и тому подобного. Javascript должен обычно анализировать JSON, зачем
замедлять

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

186

Совет MVC4 № 3 - Удаление XML Formatter из ASP.Net Web API

В 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.
Whitneyland

5
но можете ли вы вернуть XML тогда?
Томас Сток

99
Я проверил это, а ты не можешь. Так что это убирает поддержку XML. Будьте осторожны, дорогие люди из Google
Thomas Stock

3
Если вы посмотрите на мой ответ ниже, это позволит xml по-прежнему возвращаться, если вы хотите, но позволяет сайту отвечать JSON браузеру
Glenn Slaven

3
@GlennSlaven да, ваш ответ должен быть помечен как правильный.
Раду Флореску

114

В файле WebApiConfig.cs добавьте в конец функцию Register :

// 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);
Кас Блум

3
Это ужасно. - Это всегда будет возвращать JSON, несмотря ни на что, даже если клиент специально запрашивает XML в заголовке Content-Type.
BrainSlugs83

94

В Global.asax я использую код ниже. Мой URI для получения JSONhttp://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 ) удивительно подробные и подробные сообщения в блоге объясняют, как это работает.

Короче говоря, вы правы, и вам просто нужно установить заголовки Acceptor или Content-Typerequest. Поскольку ваше действие не закодировано для возврата определенного формата, вы можете установить Accept: application/json.


6
«чтобы я мог просматривать его в браузере»
Spongman

1
@ Спонгман, да, можешь. Но используйте расширение как REST Client - у большинства браузеров оно есть. Прямой ввод URL в браузере: 1. Слишком ограниченно (нет контроля над заголовками, не может публиковать данные и т. Д.); 2. Неверно - браузер не использует веб-интерфейс API, поскольку он предназначен для использования - вы не можете рассчитывать на его правильное тестирование. Итак, опять же, хорошее клиентское дополнение REST исправит это.
Ивайло Славов

45

Поскольку вопрос относится к Chrome, вы можете получить расширение Postman, которое позволяет вам устанавливать тип содержимого запроса.

Почтальон


В Firefox просто зайдите в about: 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.
Бьяртур Торлациус

Или еще лучше, просто text/html,application/xhtml+xml;q=1.0,*/*;q=0.7чтобы избежать ошибочного хоста, такого как Bitbucket, от случайного обслуживания вашего браузера JSON вместо HTML.
Бьяртур Торлациус

URL мертв. Новым является chrome.google.com/webstore/detail/postman/… .
Сокол Момот

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

Перепробовал ряд стратегий. Был простой тест для XML и JSON, и он работал "из коробки"
pat capozzi

23

Не используйте ваш браузер для тестирования вашего API.

Вместо этого попробуйте использовать HTTP-клиент, который позволяет указать ваш запрос, например, CURL или даже Fiddler.

Проблема с этим вопросом в клиенте, а не в API. Веб-API работает правильно, в соответствии с запросом браузера.


30
Почему бы не использовать браузер? Это очевидный инструмент для этого.
Андерс Линден

4
Я думаю, что здесь правильный и важный момент - мы не должны перегружать рабочую часть приложения (инфраструктуру MVC WebAPI), если проблема вызвана клиентом. Реальный вариант использования Api должен использоваться правильно (путем предоставления правильных заголовков), что является ответственностью приложения. Я не согласен с полным отказом от браузера, хотя - для тестирования есть множество инструментов практически для любого браузера (например, для расширений Rest Client).
Ивайло Славов

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 (ex:) 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 и другие ответы, но с использованием встроенного расширения from 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
 }

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

Это позволяет вам прикрепить &$format=jsonили &$format=xmlдо конца URI при тестировании с браузером. Это не мешает другому ожидаемому поведению при использовании клиента без браузера, где вы можете установить свои собственные заголовки.


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

Удаление форматера, как правило, не очень хорошая идея, вы удаляете функциональность.
наспинский

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

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 Formatters для форматирования вывода. System.Net.Http.Headers => MediaTypeHeaderValue ("text / 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 или даже проверять заголовки ответов.
user3285954

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