我想添加一个自定义头的AJAX POST请求从jQuery。

我试过了:

$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
    //OR
    //beforeSend: function(xhr) { 
    //  xhr.setRequestHeader("My-First-Header", "first value"); 
    //  xhr.setRequestHeader("My-Second-Header", "second value"); 
    //}
}).done(function(data) { 
    alert(data);
});

当我发送这个请求,我看FireBug,我看到这个头:

OPTIONS xxxx/yyyy HTTP/1.1 Host: 127.0.0.1:6666 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Origin: null Access-Control-Request-Method: POST Access-Control-Request-Headers: my-first-header,my-second-header Pragma: no-cache Cache-Control: no-cache

为什么我的自定义头去访问-控制-请求-头:

Access-Control-Request-Headers: my-first-header my-second-header

我期待的头值是这样的:

My-First-Header:第一个值 My-Second-Header:第二个值

这可能吗?


当前回答

这就是为什么不能用JavaScript创建机器人的原因,因为您的选项受限于浏览器允许您执行的操作。您不能只是命令一个遵循CORS策略的浏览器(大多数浏览器都遵循CORS策略)向其他源发送随机请求,并允许您简单地获得响应!

此外,如果你试图手动编辑一些请求头,比如浏览器自带的开发者工具中的origin-header,浏览器会拒绝你的编辑,并可能会发送一个preflight OPTIONS请求。

其他回答

尝试添加'Content-Type':'application/json':

 $.ajax({
        type: 'POST',
        url: url,
        headers: {
            'Content-Type':'application/json'
        }
        //OR
        //beforeSend: function(xhr) {
        //  xhr.setRequestHeader("My-First-Header", "first value");
        //  xhr.setRequestHeader("My-Second-Header", "second value");
        //}
    }).done(function(data) {
        alert(data);
    });

这就是为什么不能用JavaScript创建机器人的原因,因为您的选项受限于浏览器允许您执行的操作。您不能只是命令一个遵循CORS策略的浏览器(大多数浏览器都遵循CORS策略)向其他源发送随机请求,并允许您简单地获得响应!

此外,如果你试图手动编辑一些请求头,比如浏览器自带的开发者工具中的origin-header,浏览器会拒绝你的编辑,并可能会发送一个preflight OPTIONS请求。

你在Firefox中看到的并不是实际的请求;注意HTTP方法是OPTIONS,而不是POST。它实际上是浏览器做出的“pre-flight”请求,以确定是否应该允许跨域AJAX请求:

http://www.w3.org/TR/cors/

预飞行请求中的Access-Control-Request-Headers头包含实际请求中的头列表。然后,在浏览器提交实际请求之前,服务器将报告这些头在此上下文中是否受支持。

因为你发送自定义报头,所以你的CORS请求不是一个简单的请求,所以浏览器首先发送一个preflight OPTIONS请求来检查服务器是否允许你的请求。

如果您在服务器上打开CORS,那么您的代码将正常工作。你也可以使用JavaScript获取(这里)

让url = https://server.test-cors.org/server?enable=true&status=200&methods=POST&headers=My-First-Header, My-Second-Header”; . ajax({美元 类型:“文章”, url: url、 标题:{ “My-First-Header”:“第一个值”, “My-Second-Header”:“第二价值” } }) .done(功能(数据){ 警报(数据[0].request。httpMethod + ' was send - open chrome console> network to see it'); }); < script src = " https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js " > < /脚本>

下面是一个在nginx上打开CORS的配置示例(nginx.conf文件):

location ~ ^/index\.php(/|$) { ... add_header 'Access-Control-Allow-Origin' "$http_origin" always; add_header 'Access-Control-Allow-Credentials' 'true' always; if ($request_method = OPTIONS) { add_header 'Access-Control-Allow-Origin' "$http_origin"; # DO NOT remove THIS LINES (doubled with outside 'if' above) add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Max-Age' 1728000; # cache preflight value for 20 days add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'My-First-Header,My-Second-Header,Authorization,Content-Type,Accept,Origin'; add_header 'Content-Length' 0; add_header 'Content-Type' 'text/plain charset=UTF-8'; return 204; } }

下面是在Apache上打开CORS的示例配置。htaccess)。

# ------------------------------------------------------------------------------ # | Cross-domain Ajax requests | # ------------------------------------------------------------------------------ # Enable cross-origin Ajax requests. # http://code.google.com/p/html5security/wiki/CrossOriginRequestSecurity # http://enable-cors.org/ # <IfModule mod_headers.c> # Header set Access-Control-Allow-Origin "*" # </IfModule> #Header set Access-Control-Allow-Origin "http://example.com:3000" #Header always set Access-Control-Allow-Credentials "true" Header set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT" Header always set Access-Control-Allow-Headers "My-First-Header,My-Second-Header,Authorization, content-type, csrf-token"

下面是一个如何在jQuery Ajax调用中设置请求头的示例:

$.ajax({
  type: "POST",
  beforeSend: function(request) {
    request.setRequestHeader("Authority", authorizationToken);
  },
  url: "entities",
  data: "json=" + escape(JSON.stringify(createRequestObject)),
  processData: false,
  success: function(msg) {
    $("#results").append("The result =" + StringifyPretty(msg));
  }
});