【问题标题】:dataType vs accepts - Ajax Request数据类型与接受 - Ajax 请求
【发布时间】:2016-01-08 17:27:19
【问题描述】:

我试图了解 Ajax 请求中接受和数据类型之间的区别。文档状态:

Documentation

接受(默认:取决于数据类型) 类型:PlainObject 请求头中发送的内容类型,告诉服务器它将接受什么样的响应作为回报。

dataType(默认:智能猜测(xml、json、script 或 html)) 类型:字符串 您期望从服务器返回的数据类型。

基本上,是一样的吗,目的是一样的。

【问题讨论】:

  • “你发送”与“你期待”
  • 要发送的是 contentType,我的问题是关于 dataType 并接受它们显然是我对服务器的期望。
  • 看起来accepts 是您必须告诉服务器您想要什么类型的答案的方式,以防它提供许多选项,而dataType 是您所期望的响应,以便正确解析响应。
  • 谢谢阿尔瓦罗。让我们看看是否有更准确的答案出来。

标签: jquery ajax


【解决方案1】:

希望这是一个准确的答案:

accepts 选项可让您更改请求中的 Accept 标头

当您更改此选项时,请求中的 Accept 标头将设置为指定的标头。请注意,它不是字符串,而是映射接受响应的 MIME 类型的对象。喜欢{ text: "text/plain", html: "text/html" }。服务器可以使用Accept 标头以请求所期望的格式提供响应,或者在它无法以请求所期望的格式之一提供响应的情况下失败。

一个非常重要的事情是,至少在 jQuery 1.11.3(我测试的地方)中,这个选项似乎不起作用,相反,我设法使用 headers 选项更改标题:headers: {Accept : "text/json"}

dataType 选项可让您预处理响应

如果你定义了一个dataType,请求的响应将在被成功处理程序使用之前由jQuery进行预处理。例如:

如果指定了json,则使用jQuery.parseJSON 解析响应,然后作为对象传递给成功处理程序。

如果指定了script$.ajax() 将执行从服务器接收到的 JavaScript,然后将其作为字符串传递给成功处理程序。

更多示例here,在“数据类型”部分。

如果未设置dataType,则响应的Content-Type 将确定应对响应进行哪些预处理。请注意,更改 dataType 也会更改 Accept 标头。通常不需要自己更改Accept 标头。

示例

request.php

<?php
if(strpos($_SERVER["HTTP_ACCEPT"],"text/javascript") === false)
    exit("I only provide text/javascript responses");

echo "alert('This is my response!')";

index.html

<button id="send">Send</button>
<div id="response"></div>

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script>
$(function(){
    
    $("#send").click(function(){
        $.ajax({
            method: "GET",
            url: "request.php",
            dataType: "script" // Change this to "text" and you will see the difference
        }).done(function(data) {
            $("#response").text(data);
        });
    });
    
    
});
</script>

dataType 设置为"script" 时,Accept 标头将包含"text/javascript",因此request.php 上的测试将通过。它将返回 "alert('This is my response!')" 并且因为 dataType 设置为 "script" jQuery 将尝试将其作为 javascript 执行,然后将其作为纯文本传递给成功处理程序。

如果您将dataType 更改为"text"Accept 标头将不包含"text/javascript",因此request.php 上的测试将失败。它将返回 "I only provide text/javascript responses" 并且因为 dataType 设置为 "text" jQuery 会将其作为纯文本传递给成功处理程序。

【讨论】:

  • 我在 1.11.2 上也遇到了接受标头的问题,使用 headers: {Accept : "application/json"}使它工作。出于某种原因,它正在发送Accept: */*,即使 contentType 和 dateType 等都设置为 json。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多