jQuery AJAX CORS请求/ Content-Type / OPTIONS

时间:2015-07-10 12:18:46

标签: jquery ajax json http-headers cors

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

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

我已使用相同的参数在Google Chrome高级REST客户端扩展程序上测试了此调用。 content-type设置为“application / json”。当我发送请求并查看chrome的控制台时,我看到只发送了实际的POST请求,服务器返回“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) {
            ...
        }
    });

感谢。

1 个答案:

答案 0 :(得分:1)

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

简单方法是以下之一

  1. GET
  2. HEAD
  3. POST
  4. 简单标题是以下之一

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

      在您的情况下,您可以删除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