Saya mencoba mengatur header di server web Go saya. Saya menggunakan gorilla/mux
dan net/http
paket.
Saya ingin mengatur Access-Control-Allow-Origin: *
untuk mengizinkan lintas domain AJAX.
Ini kode Go saya:
func saveHandler(w http.ResponseWriter, r *http.Request) {
// do some stuff with the request data
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/save", saveHandler)
http.Handle("/", r)
http.ListenAndServe(":"+port, nil)
}
The net/http
paket memiliki dokumentasi yang menggambarkan mengirimkan header permintaan http seolah-olah klien - Saya tidak tahu pasti bagaimana set header respon?
http
go
cors
http-headers
Zen
sumber
sumber
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(nilai "*" tidak diizinkan ketika kredensial dikirim, yang merupakan kasus penggunaan umum). Anda harus mengatur asal ke pemohon (lihat jawaban Matt Bucci di bawah ini untuk caranya).Semua jawaban di atas salah karena mereka gagal menangani permintaan preflight OPSI, solusinya adalah menimpa antarmuka router mux. Lihat AngularJS $ http dapatkan permintaan gagal dengan tajuk khusus (alllowed in CORS)
sumber
Access-Control-Allow-Credentials": "true"
untuk permintaan dengan hanya Cookie.Jangan gunakan '*' untuk Origin, sampai Anda benar-benar membutuhkan perilaku publik sepenuhnya.
Seperti yang dikatakan Wikipedia :
Itu berarti, Anda akan mendapatkan banyak kesalahan, terutama di Chrome ketika Anda akan mencoba menerapkan misalnya otentikasi sederhana.
Berikut ini adalah pembungkus yang diperbaiki:
Dan jangan lupa untuk membalas semua header ini dengan permintaan PILIHAN prelight.
sumber
router.HandleFunc("/user/action", user.UserAction) http.Handle("/", router) http.ListenAndServe(":8080", nil).Set("Access-Control-Allow-Origin", "*")
router.HandleFunc("/user/action", addDefaultHeaders(user.UserAction))
namun karena saya memiliki sekitar 16 rute ini tidak ideal apakah ada cara untuk menentukannya sebagai pembungkus pada paket http atau lapisan router muxTetapkan middleware golang yang tepat, sehingga Anda dapat menggunakan kembali pada titik akhir apa pun.
Jenis dan Fungsi Helper
Middleware yang sebenarnya
Titik akhir
REMEBER! Middlewares diaplikasikan dengan urutan terbalik (ExpectGET () mendapatkan api terlebih dahulu)
sumber
Jika Anda tidak ingin mengganti router Anda (jika Anda tidak memiliki aplikasi yang dikonfigurasi dengan cara yang mendukung ini, atau ingin mengkonfigurasi CORS pada rute dengan basis rute), tambahkan penangan OPSI untuk menangani permintaan pra penerbangan .
Yaitu, dengan Gorilla Mux rute Anda akan terlihat seperti:
Perhatikan di atas bahwa selain penangan POST kami, kami mendefinisikan penangan metode OPTIONS tertentu .
Dan kemudian untuk menangani metode preflight OPSI yang sebenarnya, Anda dapat mendefinisikan AccountsCreatePreFlight seperti:
Apa yang benar-benar membuat ini semua klik untuk saya (selain benar-benar memahami cara kerja CORS) adalah bahwa Metode HTTP dari permintaan preflight berbeda dari Metode HTTP dari permintaan aktual. Untuk memulai CORS, browser mengirimkan permintaan preflight dengan HTTP Method OPTIONS, yang harus Anda tangani secara eksplisit di router Anda, dan kemudian, jika ia menerima respons yang sesuai
"Access-Control-Allow-Origin": origin
(atau "*" untuk semua) dari aplikasi Anda, browser akan memulai aktual permintaan.Saya juga percaya bahwa Anda hanya dapat melakukan "*" untuk jenis permintaan standar (yaitu: GET), tetapi untuk yang lain Anda harus menetapkan secara eksplisit asal seperti yang saya lakukan di atas.
sumber
Saya membuat bungkus untuk kasus ini:
sumber
Saya memiliki masalah yang sama seperti yang dijelaskan di atas, solusi yang diberikan di atas benar, pengaturan yang saya miliki adalah sebagai berikut 1) Angularjs untuk Klien 2) kerangka Beego untuk server GO
Harap ikuti poin-poin ini 1) Pengaturan CORS harus diaktifkan hanya pada server GO 2) JANGAN menambahkan semua jenis header di angularJS kecuali untuk ini
Di server GO Anda menambahkan pengaturan CORS sebelum permintaan mulai diproses sehingga permintaan preflight menerima 200 OK setelah metode OPTIONS akan dikonversi menjadi GET, POST, PUT atau apa pun jenis permintaan Anda.
sumber
Saya tahu ini adalah twist yang berbeda pada jawabannya, tetapi bukankah ini lebih menjadi perhatian untuk server web? Misalnya, nginx , bisa membantu.
Menambahkan nginx di depan layanan go Anda dalam produksi tampaknya bijaksana. Ini memberikan lebih banyak fitur untuk mengotorisasi, masuk, dan memodifikasi permintaan. Selain itu, ini memberikan kemampuan untuk mengontrol siapa yang memiliki akses ke layanan Anda dan tidak hanya itu tetapi seseorang dapat menentukan perilaku yang berbeda untuk lokasi tertentu di aplikasi Anda, seperti yang ditunjukkan di atas.
Saya bisa terus tentang mengapa menggunakan server web dengan api go Anda, tapi saya pikir itu topik untuk diskusi lain.
sumber