jQuery AJAX CORS 请求/内容类型/选项

jQuery AJAX CORS request / Content-Type / OPTIONS

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

当然,如果我没有明确设置内容类型,它只会发送 POST 请求,并且由于格式问题,我会收到“400 错误请求”。

我已经使用相同的参数在 Google Chrome 高级 REST 客户端扩展上测试了这个调用。内容类型设置为 "application/json"。当我发送请求并查看 chrome 的控制台时,我看到只发送了实际的 POST 请求并且服务器 returns “200 OK” 包含我实际需要的数据。

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

我的 AJAX 调用片段如下所示,没什么特别的:

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

谢谢。

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

一个简单的方法是以下之一

  1. GET
  2. HEAD
  3. POST

而一个简单的header是以下之一

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

在您的情况下,您可以删除 ajax 调用的 content-type 设置

$.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) {
        ...
    }
});

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