
Rasto
Ich sende eine POST-Anfrage wie folgt vom Browser:
fetch(serverEndpoint, {
method: 'POST',
mode: 'no-cors', // this is to prevent browser from sending 'OPTIONS' method request first
redirect: 'follow',
headers: new Headers({
'Content-Type': 'text/plain',
'X-My-Custom-Header': 'value-v',
'Authorization': 'Bearer ' + token,
}),
body: companyName
})
Bis die Anfrage mein Back-End erreicht, enthält sie noch nicht X-My-Custom-Header
Noch Authorization
Header.
Mein Back-End ist die Google Cloud-Funktion für Firebase (im Grunde nur Node.js-Endpunkt), die so aussieht:
exports.createCompany = functions.https.onRequest((req, res) => {
let headers = ['Headers: ']
for (let header in req.headers) {
headers.push(`${header} : ${req.headers[header]}`)
}
console.log(headers)
...
}
Das Konsolenprotokoll dieser Google Cloud for Firebase-Funktion enthält keine X-My-Custom-Header
Noch Authorization
Header.
Was ist falsch?
Bearbeiten 1
Die Verwendung von Entwicklungstools in Chrome hat dies also nicht überprüft X-My-Custom-Header
Noch Authorization
Header wird vom Browser gesendet… Die Fragen sind jetzt: Warum? Wie kann ich es beheben?
Bearbeiten 2
Weitere Informationen zu meiner App: Es ist die React-App. Ich habe einen deaktivierten Servicemitarbeiter. Ich habe versucht zu erstellen Request
und fügen Sie speziell Header mit hinzu req.headers.append()
. Die Header würden immer noch nicht gesendet.

Wassilij Faronow
Das Same-Origin-Policy schränkt die Arten von Anforderungen ein, die eine Webseite an Ressourcen eines anderen Ursprungs senden kann.
In dem no-cors
Modusist der Browser darauf beschränkt, „einfache“ Anfragen zu senden – solche mit sichere Methoden und Überschriften auf der sicheren Liste nur.
Um eine Cross-Origin-Anfrage mit Headern wie Authorization
und X-My-Custom-Header
müssen Sie die fallen lassen no-cors
Modus und unterstützt Preflight-Anfragen (OPTIONS
).
Die Unterscheidung zwischen „einfachen“ und „nicht einfachen“ Anfragen ist historisch bedingt. Webseiten konnten immer einige Cross-Origin-Anfragen auf verschiedene Weise ausführen (z. B. Erstellen und Absenden eines Formulars). Als Webbrowser also ein prinzipielles Mittel zum Senden von Cross-Origin-Anfragen einführten (Cross-Origin-Ressourcenfreigabeoder CORS) wurde entschieden, dass solche „einfachen“ Anfragen vom Preflight ausgenommen werden können OPTIONS
überprüfen.

Damian
zuerst : Verwenden Sie ein Objekt anstelle von new Headers(..)
:
fetch('www.example.net', {
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'X-My-Custom-Header': 'value-v',
'Authorization': 'Bearer ' + token,
}
});
Zweitens : Gut zu wissen, Kopfzeilen werden in Kleinbuchstaben geschrieben fetch
!!
Drittens : no-cors
mode beschränkt die Verwendung von Headern auf diese weiße Liste:
Accept
Accept-Language
Content-Language
Content-Type
und dessen Wert ist ( application/x-www-form-urlencoded
, multipart/form-data
, text/plain
)
Deshalb nur Ihre Content-Type
Header gesendet wird und nicht X-My-Custom-Header
oder Authorization
.

Greeshma
Ich hatte auch das gleiche Problem. Ich habe es gelöst, indem ich „no-cors“ aus Javascript entfernt und Folgendes im serverseitigen Spring Boot hinzugefügt habe.
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity httpSecurity) throws Exception {
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
}
}

Timmehlkk
Erstens: Wenn Sie Header in Ihrer Funktion exports.createCompany aufrufen, haben Sie let headers = ['Headers: ']
mit Kapital H
statt Kleinbuchstaben h
was zu Fehlern führen kann. Sie haben auch ein Komma nach dem Token in den Headern, das nicht dort sein sollte.
2.: Jedes Mal, wenn ich Abrufanfragen in React Native verwendet habe, die header:
braucht die nicht new Headers
darauf.
Versuche dies:
fetch(serverEndpoint, {
method: 'POST',
mode: 'no-cors',
redirect: 'follow',
headers:{
'Content-Type': 'text/plain',
'X-My-Custom-Header': 'value-v',
'Authorization': 'Bearer ' + token
},
body: companyName
})
10113700cookie-checkfetch() sendet keine Header?yes
Sendet Ihr Browser tatsächlich die Header? Überprüfen Sie Ihre Entwicklungstools.
– Joe Ton
9. August 2017 um 13:10 Uhr
@JoeClay Ich bin ein erfahrener Entwickler (mobil, Backend), aber ziemlich neu in der Entwicklung von Web-Frontends. Viele Tools sind neu für mich – vor allem Dev-Tools in Brownser sind noch kein sehr guter Freund von mir. Können Sie vorschlagen, wie ich es in Chrome oder Safari überprüfen kann? Vielen Dank
– Rasto
9. August 2017 um 19:42 Uhr
Drücken Sie in Chrome F12, um Ihre Entwicklungstools zu öffnen, und wechseln Sie dann zur Registerkarte Netzwerk. Wenn Ihre Anwendung eine HTTP-Anforderung sendet, wird sie in der Liste angezeigt, und Sie können darauf klicken, um die Kopfzeilen/den Text der Anforderung und Antwort anzuzeigen. Sehen die Dokumente für weitere Informationen – zu lernen, wie man die Entwicklungstools Ihres Browsers verwendet, wird Ihnen sehr helfen, wenn Sie gerade erst mit der Webentwicklung beginnen 🙂
– Joe Ton
10. August 2017 um 8:10 Uhr
@JoeClay Die Antwort lautet also nein Der Browser sendet nicht
X-My-Custom-Header
NochAuthorization
. Jetzt sind die verbleibenden Fragen, warum? Und wie kann man es beheben?– Rasto
10. August 2017 um 16:45 Uhr
Siehe stackoverflow.com/questions/42311018/… unter Why does Fetch API Send the first PUT request as OPTIONS
– Gast271314
12. August 2017 um 18:55 Uhr