【问题标题】:jQuery AJAX CORS request / Content-Type / OPTIONSjQuery AJAX CORS 请求/内容类型/选项
【发布时间】:2015-09-29 04:37:38
【问题描述】:

我正在对另一个来源的 API 进行 AJAX 调用。如您所知,对于 CORS 请求,如果将 Content-Type 设置为 application/json,则会导致预检请求 (OPTIONS)。但是我正在调用的 API 为 OPTIONS 请求返回“404 not found”。所以实际的 POST 请求并没有发送出去。

当然,如果我没有明确设置内容类型,它只会发送 POST 请求,我会收到“400 Bad request”,因为格式问题。

我已经在具有相同参数的 Google Chrome 高级 REST 客户端扩展上测试了此调用。内容类型设置为“应用程序/json”。当我发送请求并查看 chrome 的控制台时,我看到只发送了实际的 POST 请求,服务器返回“200 OK”以及我实际需要的数据。

是不是很奇怪?我错过了什么吗?在这种情况下有没有办法只发送 POST 请求?

我的 AJAX 调用 sn-p 如下所示,没什么特别的:

 $.ajax({
        type: "POST",
        url: myURL,
        data: JSON.stringify({
            someJSON
        }),
        contentType: 'application/json',
        dataType: 'json',
        success: function (resp) {
            ...
        },
        error: function (x, y, z) {
            ...
        }
    });

谢谢。

【问题讨论】:

  • 我相信如果您设置自定义标题,它只会执行预检选项
  • 您需要配置您的服务器来处理 CORS 请求或使用 jsonp
  • 据我了解,根据 W3 规范,设置内容类型标头也会导致此问题。 @mplungjan
  • @devconcept,是的,我知道,但是 Chrome 的 REST 客户端呢?它如何只发送 POST 请求并检索所需的数据?

标签: jquery ajax json http-headers cors


【解决方案1】:

解决您的问题的最简单方法是删除您的请求设置,这些设置会导致预飞被发送到服务器。根据spec,基本上所有可能修改数据的 AJAX 和 HTTP 请求方法都受 CORS 限制。

简单的方法是以下之一

  1. GET
  2. HEAD
  3. POST

简单的标题是以下之一

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type 如果是 application/x-www-form-urlencodedmultipart/form-datatext/plain 之一

在您的情况下,您可以删除 ajax 调用的内容类型设置

$.ajax({
    type: "POST",
    url: myURL,
    // remove content-type and allow jquery to process your data
    data: someData,
    dataType: 'json',
    success: function (resp) {
        ...
    },
    error: function (x, y, z) {
        ...
    }
});

当然,这不适用于发送到服务器的复杂数据对象。在这种情况下,您需要将服务器配置为允许此类请求,方法是响应 OPTIONS 请求以正确的标头响应,通常为Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Request-Headers

【讨论】:

  • 更具体地说,我的问题是:当内容类型设置为 application/json 时,像 Chrome 的 REST 客户端这样的应用程序如何在没有预检请求的情况下发出这样的 POST 请求?在这种情况下,删除内容类型设置不是一个选项,因为没有它我会收到 400 - Bad request 错误。
  • 检查en.wikipedia.org/wiki/Same-origin_policy同源检查和相关机制的行为在许多极端情况下没有明确定义,例如对于没有明确定义的主机名或与其 URL 关联的端口(文件:数据:, 等等。)。这在历史上引起了相当多的安全问题,例如任何本地存储的 HTML 文件通常无法访问磁盘上的所有其他文件,或与 Internet 上的任何站点通信。这可能是一个可能的答案。
  • @DenizAlpaslan 看起来您无法控制您尝试访问的服务器。在这种情况下,您必须遵守服务器访问规则。 CORS 在应用程序安全中扮演着重要的角色,你必须遵守它的规则。这里没有捷径。你确定这个端点不接受json以外的任何东西吗?尝试发送包含数据的表单并检查结果。
猜你喜欢
  • 2012-09-01
  • 2019-08-01
  • 2015-12-15
  • 2013-12-24
  • 1970-01-01
  • 2013-12-06
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多