浏览器对 json ajax 响应的 Content-Type 标头有啥要求?

Posted

技术标签:

【中文标题】浏览器对 json ajax 响应的 Content-Type 标头有啥要求?【英文标题】:What do browsers want for the Content-Type header on json ajax responses?浏览器对 json ajax 响应的 Content-Type 标头有什么要求? 【发布时间】:2011-03-01 10:26:04 【问题描述】:

我正在返回一些需要由 javascript 处理的 json 作为对 XMLHTTPRequest 的响应。

如果我将响应的内容类型设置为“text/plain”,除 Chrome 之外的所有浏览器都会接受它并将其传递给我的 JS,没有问题。但是,Chrome 会将响应包装在

<pre style="word-wrap: break-word; white-space: pre-wrap;"> 

在将其传递给我的 javascript 之前。

如果我将响应的内容类型设置为“正确”“应用程序/json”,所有浏览器,但 Firefox 将接受它并将其传递给我的 JS,没有问题。但是,Firefox 会要求将响应保存或打开为文件。

什么是正确的跨浏览器内容类型?

【问题讨论】:

The right JSON content type? 的可能重复项 也许吧。除了那个线程有 wrong 答案(如果你在那里使用答案,firefox 的行为就像一个任性的孩子) Firefox 的行为异常如何?如果您指的是保存和下载,请尝试此处提到的“在浏览器中打开”建议:***.com/questions/94767 已经观察到 Chrome 的这种奇怪行为。见***.com/questions/18411670/… 【参考方案1】:

您可以通过使用 jQuery 函数 parseJSON - http://api.jquery.com/jQuery.parseJSON/ 将响应解析为 JSON 对象来解决此问题

您传递给函数的参数是 JSON 对象字符串,您从响应数据中提取:

function AjaxResponse (data)   // AJAX post callback 
  var jsonResult = $.parseJSON(data.substring(data.indexOf(""), data.lastIndexOf("") + 1));

在 FF 和 IE8 中针对以下简单 JSON 结果进行了测试(除了 Chrome 解决了哪个问题),对于其他浏览器和更复杂的响应,无法保证...


注意:我认为这种情况下的内容类型是 text/plain 或 text/html - 我使用了以下 ASP.Net MVC 函数来返回结果

ContentResult System.Web.Mvc.Controller.Content(string content);

我返回 JSON 对象的位置,如

System.Web.Script.Serialization.JavaScriptSerializer jsonSerializer 
    = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonResponse = jsonSerializer.Serialize(
    new  IArticleMediaId = 0
        , ImageUrl = Url.Content(fullImgPath)
        );
return Content(jsonResponse);

【讨论】:

【参考方案2】:

在 ajaxFileUpload.js 中的 uploadCallback() 替换

io.contentWindow.document.body.innerHTML.innerHTML

$(io.contentWindow.document.body.innerHTML).html()

【讨论】:

以上是关于浏览器对 json ajax 响应的 Content-Type 标头有啥要求?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法访问serveride ajax响应作为临时文件?

简单AJAX请求JSon数据

如何使用ASP.NET MVC增加对AJAX JSON响应的2MB限制

Ajax和Json

Ajax Json对PHP7和IIS 7的限制

jQuery / AJAX - 响应格式