nas*_*ski 1220 json google-chrome asp.net-web-api
使用较新的ASP.NET Web API,在Chrome中我看到了XML - 如何更改它以请求JSON,以便我可以在浏览器中查看它?我相信它只是请求标题的一部分,我是否正确?
Fel*_*sin 1695
我只是App_Start / WebApiConfig.cs
在我的MVC Web API项目中添加以下内容.
config.Formatters.JsonFormatter.SupportedMediaTypes
.Add(new MediaTypeHeaderValue("text/html") );
Run Code Online (Sandbox Code Playgroud)
这可以确保你在大多数查询中获得json,但是你可以xml
在发送时获得text/xml
.
如果您需要回复Content-Type
,application/json
请查看Todd的答案如下.
NameSpace
正在使用System.Net.Http.Headers
;
Gle*_*ven 499
如果你这样做,WebApiConfig
你将默认获得JSON,但如果你text/xml
作为请求Accept
头传递,它仍然允许你返回XML
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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您没有使用MVC项目类型,因此没有开始使用此类,请参阅此答案以获取有关如何合并它的详细信息.
Tod*_*ier 303
我最喜欢Felipe Leusin的方法 - 确保浏览器获得JSON而不会影响实际需要XML的客户端的内容协商.对我来说唯一缺少的部分是响应头仍然包含content-type: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");
}
}
Run Code Online (Sandbox Code Playgroud)
注册如下:
config.Formatters.Add(new BrowserJsonFormatter());
Run Code Online (Sandbox Code Playgroud)
小智 300
使用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"));
Run Code Online (Sandbox Code Playgroud)
Yak*_*nor 185
MVC4快速提示#3 - 从ASP.Net Web API中删除XML Formatter
在Global.asax
添加一行:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
Run Code Online (Sandbox Code Playgroud)
像这样:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
BundleTable.Bundles.RegisterTemplateBundles();
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*sky 115
在WebApiConfig.cs中,添加到Register函数的末尾:
// Remove the XML formatter
config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)
来源.
Dig*_*mar 93
在Global.asax我使用下面的代码.我获取JSON的URI是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"));
}
Run Code Online (Sandbox Code Playgroud)
suh*_*air 35
一个快速选项是使用MediaTypeMapping专门化.以下是在Application_Start事件中使用QueryStringMapping的示例:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("a", "b", "application/json"));
Run Code Online (Sandbox Code Playgroud)
现在,只要url包含查询字符串?a = b,在这种情况下,Json响应将显示在浏览器中.
jay*_*eno 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"));
Run Code Online (Sandbox Code Playgroud)
感谢大家!
小智 23
不要使用您的浏览器来测试您的API.
相反,尝试使用允许您指定请求的HTTP客户端,例如CURL,甚至Fiddler.
此问题的问题出在客户端,而不是API中.根据浏览器的请求,Web API行为正常.
pav*_*mar 17
大多数上述答案都非常有意义.由于您看到数据是以XML格式格式化的,这意味着应用了XML格式化程序,因此只需从HttpConfiguration参数中删除XMLFormatter即可看到JSON格式
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();
}
Run Code Online (Sandbox Code Playgroud)
因为JSON是默认格式
Rog*_*mbe 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();
}
}
Run Code Online (Sandbox Code Playgroud)
似乎工作.
返回正确的格式由媒体类型格式化程序完成.正如其他人提到的,你可以在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"));
...
}
}
Run Code Online (Sandbox Code Playgroud)
更多信息,请查看:
如果您的操作返回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);
}
}
Run Code Online (Sandbox Code Playgroud)
申请行动:
[JsonOutput]
public IEnumerable<Person> GetPersons()
{
return _repository.AllPersons(); // the returned output will be in JSON
}
Run Code Online (Sandbox Code Playgroud)
请注意,您可以省略Attribute
动作修饰上的单词,[JsonOutput]
而不是使用[JsonOutputAttribute]
.
我不清楚为什么答案中会包含所有这些复杂性。当然,可以使用QueryStrings,标头和选项有很多方法来实现此目的,但是我认为最好的做法很简单。您请求一个纯URL(例如:),http://yourstartup.com/api/cars
然后返回JSON。您将获得带有正确响应标头的JSON:
Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)
在寻找这个相同问题的答案时,我找到了这个线索,并且不得不继续前进,因为这个公认的答案无法正常工作。我确实找到了一个答案,我觉得这很简单,不能成为最佳答案:
我也会在这里添加提示。
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());
}
Run Code Online (Sandbox Code Playgroud)
我确实有一个关于默认值(至少是我所看到的)来自何处的问题。它们是.NET默认值,还是在其他地方(由我项目中的其他人创建)创建。Anways,希望这会有所帮助。
小智 6
config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)
小智 6
您可以使用如下:
GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)
这是一个类似于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
}
Run Code Online (Sandbox Code Playgroud)
该解决方案主要是为了在WebApi的早期版本中为OData支持$ format,但它也适用于非OData实现,并Content-Type: application/json; charset=utf-8
在响应中返回
标头。
使用浏览器进行测试时,它可让您补充&$format=json
或&$format=xml
结束uri。使用非浏览器客户端可以在其中设置自己的标头时,它不会干扰其他预期行为。
按照最新版本的ASP.net WebApi 2,
在下WebApiConfig.cs
,这将工作
config.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
config.Formatters.Add(GlobalConfiguration.Configuration.Formatters.JsonFormatter);
Run Code Online (Sandbox Code Playgroud)
只需在您的WebApiConfig类中 添加这两行代码
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//add this two line
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
............................
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
782967 次 |
最近记录: |