花了一个小时努力解决这个(coffeescript)问题,不知道到底为什么。
$.ajax
accepts: "application/json; charset=utf-8"
完全没有改变接受标头,而这个
$.ajax
dataType: "json"
正确地设置了接受头部为application/json; charset=utf-8
完全困惑了,是我漏了什么还是接受属性是一年四季的愚人节玩笑?
像往常一样,文档是你的好朋友:
accepts
默认值:取决于DataType
请求头中发送的内容类型告诉服务器它将接受什么类型的响应。如果需要修改 accepts 设置,建议在 $.ajaxSetup() 方法中进行一次性设置。
dataType
默认值:Intelligent Guess(xml、json、script 或 html)
从服务器返回的数据类型。如果没有指定,则 jQuery 会根据响应的 MIME 类型尝试推断出来(XML MIME 类型将产生 XML,在 1.4 版本中,JSON 将产生 JavaScript 对象,在 1.4 版本中,脚本将执行该脚本,而其他任何内容都将作为字符串返回)。可用的类型(以及作为成功回调的第一个参数传递的结果)为:
"xml": 返回可以通过 jQuery 处理的 XML 文档。
"html": 作为纯文本返回 HTML;当插入到 DOM 中时,包括的脚本标签会被评估。
"script": 将响应作为 JavaScript 进行评估,并将其作为纯文本返回。通过在 URL 后面添加查询字符串参数
_=[TIMESTAMP]
来禁用缓存,除非将 cache 选项设置为 true。注意:这会将 POST 请求转换为远程域请求的 GET 请求。"json": 将响应解析为 JSON 并返回 JavaScript 对象。在 jQuery 1.4 中以严格的方式解析 JSON;任何格式不正确的 JSON 都将被拒绝并抛出一个解析错误。(有关正确的 JSON 格式的更多信息,请参见 json.org)
"jsonp": 使用 JSONP 加载 JSON 块。在 URL 的末尾添加额外的
?callback=?
来指定回调函数。通过在 URL 后面添加查询字符串参数_=[TIMESTAMP]
来禁用缓存。"text": 纯文本字符串。多个以空格分隔的值:从 jQuery 1.5 开始,jQuery 可以将 dataType 从 Content-Type 标头接收到的类型转换为你需要的类型。例如,如果你想将文本响应视为 XML 来处理,则使用 "text xml" 作为 dataType。你还可以进行 JSONP 请求,将其接收为文本,并由 jQuery 解释为 XML:"jsonp text xml." 类似地,类似 "jsonp xml" 的缩写字符串将首先尝试从 jsonp 转换为 xml,如果失败,则从 jsonp 转换为 text,然后从 text 转换为 xml。
现在回到你的问题。我不熟悉 Coffeescript,但与 dataType
不同,accepts
参数是一个映射,应该像这样使用:
$.ajax({
url: ...
dataType: 'json',
accepts: {
xml: 'text/xml',
text: 'text/plain'
}
});
dataType
也没有指定accepts
,那么会发送什么HTTP Accepts头呢?是空的吗? - Ciro Santilli OurBigBook.com