30

花了整整一个小时试图弄清楚为什么会这样(咖啡脚本)

$.ajax
  accepts: "application/json; charset=utf-8"

完全没有改变接受头,而这

$.ajax
  dataType: "json"

将接受标头正确设置为application/json; charset=utf-8

完全困惑,我是否遗漏了什么或者接受属性是全年愚人节的玩笑?

4

1 回答 1

30

与往常一样,文档是您的朋友:

接受

默认值:取决于数据类型

在请求标头中发送的内容类型告诉服务器它将接受什么样的响应作为回报。如果接受设置需要修改,建议在 $.ajaxSetup() 方法中修改一次。

数据类型

默认值:智能猜测(xml、json、脚本或 html)

您期望从服务器返回的数据类型。如果没有指定,jQuery 将尝试根据响应的 MIME 类型推断它(XML MIME 类型将产生 XML,在 1.4 中 JSON 将产生一个 JavaScript 对象,在 1.4 中脚本将执行脚本,其他任何东西都会作为字符串返回)。可用的类型(以及作为第一个参数传递给成功回调的结果)是:

xml ”:返回一个可以通过 jQuery 处理的 XML 文档。

html ”:以纯文本形式返回 HTML;包含的脚本标签在插入 DOM 时进行评估。

script ”:将响应评估为 JavaScript 并将其作为纯文本返回。_=[TIMESTAMP]除非缓存选项设置为 true,否则通过将查询字符串参数 附加到 URL 来禁用缓存。注意:这会将 POST 转换为远程域请求的 GET。

json ”:将响应评估为 JSON 并返回一个 JavaScript 对象。在 jQuery 1.4 中,JSON 数据以严格的方式解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。(有关正确的 JSON 格式的更多信息,请参阅 json.org。)

jsonp ”:使用 JSONP 加载到 JSON 块中。在 URL 的末尾添加一个额外 ?callback=?的以指定回调。
_=[TIMESTAMP]除非缓存选项设置为 true,否则通过将查询字符串参数 附加到 URL 来禁用缓存。

text ”:纯文本字符串。多个空格分隔的值:从 jQuery 1.5 开始,jQuery 可以将 dataType 从它在 Content-Type 标头中接收到的内容转换为您需要的内容。例如,如果您希望将文本响应视为 XML,请使用“ text xml ”作为数据类型。您还可以发出 JSONP 请求,将其作为文本接收,并由 jQuery 解释为 XML:“jsonp text xml”。类似地,诸如“jsonp xml”之类的速记字符串将首先尝试从 jsonp 转换为 xml,如果失败,则从 jsonp 转换为文本,然后从文本转换为 xml。

现在回到你的问题。我不熟悉 cofeescript 但与它相反的dataType是一个字符串,accepts参数是一个映射,应该像这样使用:

$.ajax({
    url: ...
    dataType: 'json',
    accepts: {
        xml: 'text/xml',
        text: 'text/plain'
    }
});
于 2012-06-16T16:45:27.163 回答