IT-Swarm.Net

Dodajte zaglavlje u AJAX zahtjevu s jQuery

Želio bih dodati prilagođeno zaglavlje na AJAX POST zahtjev iz jQuery.

Pokušao sam ovo:

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

Kad šaljem ovaj zahtjev i gledam s FireBug-om, vidim ovo zaglavlje:

OPCIJE xxxx/gggg HTTP/1.1
Domaćin: 127.0.0.1:6666
Korisnički agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv: 11.0) Gecko/20100101 Firefox/11.0
Prihvati: tekst/html, aplikacija/xhtml + xml, aplikacija/xml; q = 0.9, /; q = 0.8
Jezik prihvaćanja: fr, fr-fr; q = 0,8, en-us; q = 0,5, en; q = 0,3
Accept-Encoding: gzip, ispuhavanje
Veza: ostanite živi
Podrijetlo: nula
Način kontrole pristupa-zahtjeva: POST
Zaglavi za pristup-nadzor-zahtjev: moj-prvi-zaglavlje, moj-drugi-zaglavlje
Pragma: nema predmemorije
Nadzor predmemorije: nema predmemorije

Zašto moja prilagođena zaglavlja idu na Access-Control-Request-Headers:

Zahtjevi za kontrolu pristupa-zaglavlja: moj-prvi-zaglavlje, moj-drugi-zaglavlje

Očekivao sam ove vrijednosti zaglavlja:

My-First-Header: prva vrijednost
Moja druga glava: druga vrijednost

Je li moguće?

349
fingerup

Ono što ste vidjeli u Firefoxu nije bio stvarni zahtjev; imajte na umu da je HTTP metoda OPTIONS, a ne POST. Zapravo, preglednik "prije leta" zahtijeva da preglednik utvrdi treba li dopustiti zahtjev za više domena AJAX:

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

Zaglavlje Access-Control-Request-Headers u zahtjevu prije leta uključuje popis zaglavlja u stvarnom zahtjevu. Očekuje se da će poslužitelj izvijestiti da li su podržana zaglavlja u ovom kontekstu podržana ili ne, prije nego što preglednik podnese stvarni zahtjev.

123
karlgold

Evo primjera kako postaviti Zahtjevnu zaglavu u pozivu 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));
  }
});
399
milkovsky

Ovaj kod ispod djeluje kod mene. Uvijek koristim samo pojedinačne citate, i to djeluje u redu. Predlažem da koristite samo pojedinačne navodnike OR samo dvostruke navodnike, ali ne i miješane.

$.ajax({
    url: 'YourRestEndPoint',
    headers: {
        'Authorization':'Basic xxxxxxxxxxxxx',
        'X-CSRF-TOKEN':'xxxxxxxxxxxxxxxxxxxx',
        'Content-Type':'application/json'
    },
    method: 'POST',
    dataType: 'json',
    data: YourData,
    success: function(data){
      console.log('succes: '+data);
    }
  });

Nadam se da će ovo odgovoriti na vaše pitanje ...

139
G-raph

Budući da šaljete prilagođene zaglavlja, pa CORS zahtjev bude NIJE jednostavni zahtjev , pa preglednik prvo pošalje zahtjev za OPTIONS predpošiljanja kako bi provjerio dopušta li vaš zahtjev zahtjev.

enter image description here

Ako na poslužitelju uključite CORS, tada će vaš kôd raditi. Također možete upotrijebiti js dohvaćanje ( ovdje )

let url='https://server.test-cors.org/server?enable=true&status=200&methods=POST&headers=My-First-Header,My-Second-Header';


$.ajax({
    type: 'POST',
    url: url,
    headers: {
        "My-First-Header":"first value",
        "My-Second-Header":"second value"
    }
}).done(function(data) { 
    alert(data[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"></script>

Ovdje je primjer konfiguracije koja uključuje CORS na nginx (nginx.conf datoteka)

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;
    }
}

Ovdje je primjer konfiguracije koja uključuje CORS na Apacheu (.htaccess datoteka)

# ------------------------------------------------------------------------------
# | 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"
4
Kamil Kiełczewski

I zato ne možete stvoriti robota s Javascriptom, jer su vaše mogućnosti ograničene na ono što vam preglednik dopušta. Ne možete samo naručiti preglednik koji slijedi pravila CORS, koja većina preglednika slijedi, da šalje slučajne zahtjeve drugog podrijetla i omogućava vam da jednostavno dobijete odgovor!

Uz to, ako ste pokušali ručno urediti neke zaglavlje zahtjeva, poput Origin-header, iz alata za razvojne programere koji dolaze s preglednicima, preglednik će odbiti vašu izmjenu i možda poslati zahtjev OPTIONS predbilježbe.

1
the accountant