dataType vs accepted - Ajax请求

D.B*_*D.B 13 ajax jquery

我试图理解Ajax请求中的accept和dataType之间的区别.文件说明:

文档

接受(默认值:取决于DataType)类型:PlainObject在请求标头中发送的内容类型,它告诉服务器它将接受哪种响应.

dataType(默认值:Intelligent Guess(xml,json,script或html))类型:String您希望从服务器返回的数据类型.

基本上,它是一样的吗?它有相同的目的.

Alv*_*ndo 15

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

accepts选项允许您更改Accept请求中的标头

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

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

dataType选项允许您预处理响应

如果定义a dataType,请求的响应将由jQuery预处理,然后可用于succes处理程序.例如:

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

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

更多的例子在这里,"数据类型"部分.

如果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!')";
Run Code Online (Sandbox Code Playgroud)

的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>
Run Code Online (Sandbox Code Playgroud)

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:*/*`,即使为json设置了contentType和dateType等. (3认同)