【问题标题】:$.ajax - dataType$.ajax - 数据类型
【发布时间】:2011-02-12 22:40:33
【问题描述】:

有什么区别

contentType: "application/json; charset=utf-8",
dataType: "json",

对比

contentType: "application/json",
dataType: "text",

【问题讨论】:

    标签: jquery


    【解决方案1】:
    • contentType 是发送到服务器的 HTTP 标头,指定特定格式。
      示例:我正在发送 JSON 或 XML
    • dataType 你是在告诉 jQuery 期望什么样的响应
      期待 JSON,或 XML,或 HTML 等。默认是让 jQuery 尝试找出它。

    $.ajax() 文档也有这些的完整描述。


    在您的特定情况下,第一个是要求 响应UTF-8 中,第二个不在乎。第一个是将 response 视为 JavaScript 对象,第二个是将其视为字符串。

    所以第一个是:

    success: function(data) {
      // get data, e.g. data.title;
    }
    

    第二个:

    success: function(data) {
      alert("Here's lots of data, just a string: " + data);
    }
    

    【讨论】:

    • 哪种方式更受欢迎或最值得推荐。
    • @Adu - 没有直接的答案,取决于你想对结果做什么......他们正在做两件不同的事情。理想情况下,除非它是一个非常简单的结果,否则您可能希望处理 JSON,在这种情况下,第一个会更容易。
    • Musa 是对的,contentType 表示我们发送到服务器的格式(即帖子正文),而不是请求返回的格式。
    • @antinome 这两个通常非常结合,这在 Stack Overflow 上的许多地方都很重要示例。严格来说,它们是独立的,我已经更新以反映这一点。
    • 虽然答案的开头已经更新并且现在是正确的,但部分内容是:“在您的特定情况下,第一个要求响应为 utf-8,第二个不不在乎。”对我来说似乎仍然不正确。 Content-type 选项表示随请求发送的数据将采用 utf-8 格式,与响应无关(正如答案的第一部分正确反映的那样)。
    【解决方案2】:

    根据docs:

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

    【讨论】:

      【解决方案3】:

      contentType 指定作为请求的一部分发送到服务器的数据格式(它也可以作为响应的一部分发送,稍后会详细介绍)。

      dataType 指定客户端(浏览器)要接收的数据的预期格式。

      两者不可互换。

      • contentType 是发送到服务器的标头,指定发送到服务器的数据格式(即消息正文的内容)。这用于 POST 和 PUT 请求。通常当您发送 POST 请求时,消息正文包括传入的参数,例如:

      ================================

      示例请求:

      POST /search HTTP/1.1 
      Content-Type: application/x-www-form-urlencoded 
      <<other header>>
      
      name=sam&age=35
      

      ================================

      “name=sam&age=35”上方的最后一行是消息正文,contentType 将其指定为 application/x-www-form-urlencoded,因为我们在消息正文中传递表单参数。 但是我们不仅限于发送参数,我们可以发送 json, xml,... 像这样(发送不同类型的数据对于 RESTful Web 服务特别有用):

      ================================

      示例请求:

      POST /orders HTTP/1.1
      Content-Type: application/xml
      <<other header>>
      
      <order>
         <total>$199.02</total>
         <date>December 22, 2008 06:56</date>
      ...
      </order>
      

      ================================

      所以这次的 ContentType 是:application/xml,因为这就是我们要发送的内容。 上面的示例显示了示例请求,同样,从服务器发送的响应也可以具有 Content-Type 标头,指定服务器发送的内容,如下所示:

      ================================

      示例响应:

      HTTP/1.1 201 Created
      Content-Type: application/xml
      <<other headers>>
      
      <order id="233">
         <link rel="self" href="http://example.com/orders/133"/>
         <total>$199.02</total>
         <date>December 22, 2008 06:56</date>
      ...
      </order>
      

      ================================

      • dataType 指定期望的响应格式。它与 Accept 标头有关。 JQuery 将尝试根据响应的 Content-Type 推断它。

      ================================

      示例请求:

      GET /someFolder/index.html HTTP/1.1
      Host: mysite.org
      Accept: application/xml
      <<other headers>>
      

      ================================

      以上请求需要来自服务器的 XML。

      关于你的问题,

      contentType: "application/json; charset=utf-8",
      dataType: "json",
      

      在这里,您使用 UTF8 字符集发送 json 数据,并且您希望从服务器返回 json 数据。根据数据类型的 JQuery 文档,

      json 类型将获取的数据文件解析为 JavaScript 对象,并 将构造的对象作为结果数据返回。

      所以你在成功处理程序中得到的是正确的 javascript 对象(JQuery 为你转换 json 对象)

      contentType: "application/json",
      dataType: "text",
      

      这里您发送的是 json 数据,因为您没有根据 JQuery 文档提及编码,

      如果没有指定字符集,数据将被传输到服务器 使用服务器的默认字符集;你必须适当地解码 在服务器端。

      并且由于 dataType 被指定为文本,因此您在成功处理程序中得到的是纯文本,根据 dataType 的文档,

      text 和 xml 类型返回数据而不进行处理。数据是 简单地传递给成功处理程序

      【讨论】:

        【解决方案4】:

        同时调用两个 API 时,jQuery Ajax 加载器无法正常工作。要解决此问题,您必须使用 Ajax 设置中的 isAsync 属性一一调用 API。您还需要确保设置中没有任何错误。否则,加载程序将无法工作。例如,未定义的内容类型、POST/PUT/DELETE/GET 调用的数据类型。

        【讨论】:

        • 如果您提供更好的描述,这是一个很好的答案......请在这篇文章中提供更多信息。
        猜你喜欢
        • 2014-09-21
        • 2010-11-17
        • 1970-01-01
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        相关资源
        最近更新 更多