【问题标题】:How to use dataType: 'jsonp' but still have application/json in Accept header?如何使用 dataType: 'jsonp' 但在 Accept 标头中仍然有 application/json?
【发布时间】:2012-07-28 08:42:02
【问题描述】:

我想访问另一个域上的 REST 服务。如果,在 JQuery 中,我指定:

dataType: 'json'

正如预期的那样失败,因为对于跨域调用,必须使用 JSONP。

当我将其更改为:

dataType: 'jsonp'

它应该可以工作,但是失败了,因为服务器需要 application/jsonapplication/xmltext/html 等,而不是 */*,由 JSONP 请求发送。

有没有办法强制 JQuery 在执行 JSON 请求时将 application/json 放入 Accept 请求标头中?

【问题讨论】:

  • 我认为这是不可能的,因为将标头添加到响应中的服务器不是客户端
  • @Jorge:抱歉,我的问题不够明确。我说的是请求标头,而不是响应标头。

标签: jquery json http jsonp


【解决方案1】:

AFAIK jQuery 的 JSONP 实现使用了一个<script> 标记,该标记被注入到 DOM 中(因此仅限于 GET 动词),您无法控制 Accept 请求内容类型标头。这个script 标签的src 只是简单地指向远程域的url。浏览器只是简单地获取发送常规 GET 请求的底层端点。

因此,如果您希望能够为跨域调用设置请求标头,则必须在您的域上设置一个服务器端脚本,将调用委托给远程域(并设置相应的标头),然后发送向您的脚本发出 AJAX 请求。

【讨论】:

    【解决方案2】:

    这可能不适合您的用例,但是当我不得不做跨域 AJAX 时,我通常会在我的域中添加一个额外的资源,然后调用外部资源(通过 cURL 或其他)和将值返回给调用客户端。本质上,您正在为 AJAX 调用构建代理。这肯定会增加开销,但您可以通过为此类调用添加缓存层来缓解这种情况。

    【讨论】:

      【解决方案3】:

      我想你会想尝试一下这些方面的东西:

      $.ajax({
          headers: { 
              Accept : "application/json; charset=utf-8",
              "Content-Type": "text/plain; charset=utf-8"
          }
          dataType: 'jsonp',
          success : function(response) {
              ...
          }
      })
      

      【讨论】:

      • 我怀疑这是否可行,尽管我还没有实际测试过。 jQuery 为 JSONP 使用<script> 标签。
      • 失败,您可以随时尝试添加:contentType: 'application/json'
      • 当然,值得一试,只是我的直觉告诉我这行不通。
      • 同意,我刚刚尝试了其他几个解决方案,虽然它返回数据,但它不会修改 Accepts 标头。 +1 你的原始答案。
      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-25
      相关资源
      最近更新 更多