应该返回哪种MIME类型?

3
我有一个包含JavaScript代码的HTML页面,它发送AJAX请求。请求由我的servlet处理。我认为从servlet(响应内容类型)以“application/json” MIME类型返回数据是“更好”和“更正确”的。然而,这会让MSIE出现问题——也就是说,浏览器似乎无法显示/处理此MIME类型(Chrome/FF没有问题)。当我不明确指定类型时,在所有浏览器中都可以正常工作。是否真的应该对AJAX请求不返回任何MIME类型?
更新:我的服务器端使用Java实现,并通过以下行定义MIME类型:
response.setContentType("application/json");

响应是以下文本(仅为示例):
{ "status" : "DONE", "progress" : 100, "url" : "/7909118672283641787.docx" , "totalBytes" : 17696 } 

更新2:代码片段由我的客户端代码制成(纯JavaScript,无库)
function display_progress(http) {
    if (http.readyState == 4) {
        var again = false;

        if (http.status != 200) {
            document.getElementById('progress_bar').innerHTML = "Wrong response status received: " + http.status + "! Fix the server-side code.";
        } else {
            try {
                var resp = eval('(' + http.responseText + ')');             
                var status = resp['status'];

                if (status == 'DOING') {
                    document.getElementById('progress_bar').innerHTML = "Uploaded: " + resp['progress'] + "%";
                    again = true;
                } else if (status == 'DONE'){
                    document.getElementById('progress_bar').innerHTML = 
                        "Uploaded 100% (" + resp['totalBytes'] + " bytes)! Your file is <a href=\"" + resp['url'] + "\"/>" + "here" + "</a>";
                } else if (status == 'ERROR') {
                    document.getElementById('progress_bar').innerHTML = "Error while uploading!";
                } else {
                    document.getElementById('progress_bar').innerHTML = "Unexpected state: " + status + "! Fix the server-side code.";
                }
            } catch (ex) {
                document.getElementById('progress_bar').innerHTML = "Wrong response received: " + resp + "! Fix the server-side code.";
            }
        }

        if (again) {
            setTimeout("update_progress()", 500);
        }
    }

1
你具体使用了哪些代码来处理响应? - Pekka
JSON数据应该作为application/json提供。如果有什么问题,那么问题就在其他地方。 - gen_Eric
不,我的意思是你在客户端使用什么代码来处理它?具体是什么出了问题? - Pekka
@Pekka:请看一下更新2。实际上没有任何东西损坏,只是进度条上的状态未更新。 - BreakPhreak
setTimeout("update_progress()", 500); 应改为 setTimeout(update_progress, 500); ,这样可以避免对字符串进行 eval 操作。根据 @user400908 的回答,应该使用 JSON.parse 而不是 eval - gen_Eric
3个回答

3

将其作为原始文本返回,然后使用JSON.parse()转换为可用的JSON。

JSON不是文本,因此Firefox不知道该如何处理它。因此,您需要基本上将其作为某些它知道的东西提供。


刚刚添加了我正在动态构建的原始文本。 - BreakPhreak
不是所有的浏览器都支持 JSON。你可能需要从这里使用 json2.js:https://github.com/douglascrockford/JSON-js - gen_Eric

0

不,这不是真的...你可以为 AJAX 请求设置 MIME 类型...如果你没有设置它们...它们会采用默认值...而默认值恰好是..."text/plain"。 所以我猜默认值对你来说已经很好了...更常见的响应类型是"text/html"。这完全取决于你将使用哪些代码来处理来自 Servlet 的响应...问题可能出在代码的那一部分...


默认值是指,无论Web服务器配置为什么类型,都会使用该值。流行的类型包括text/plain、text/html和application/octet-stream。 - T-Bull
@T-Bull 谢谢您的纠正...我的大学讲师教我那样做...我会和他商量的... - knurdy
刚刚在问题描述中添加了一些示例,你有什么想法我做错了什么吗? - BreakPhreak

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接