Я пытаюсь установить заголовок на своем веб-сервере Go. Я использую gorilla/mux
и net/http
пакеты.
Я хотел бы Access-Control-Allow-Origin: *
разрешить междоменный AJAX.
Вот мой код Go:
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)
}
В net/http
пакете есть документация, описывающая отправку заголовков HTTP-запроса, как если бы это был клиент - я не совсем уверен, как установить заголовки ответа?
http
go
cors
http-headers
Zen
источник
источник
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(значение «*» не допускается при отправке учетных данных, что является распространенным случаем использования). Вы должны установить источник запроса (см. Ответ Мэтта Буччи ниже).Все вышеприведенные ответы неверны, поскольку они не могут обработать предварительный запрос OPTIONS, решение состоит в том, чтобы переопределить интерфейс мультиплексорного маршрутизатора. Смотрите AngularJS $ http: запрос на получение не выполнен с пользовательским заголовком (разрешено в CORS)
источник
Access-Control-Allow-Credentials": "true"
о запросах с httpOnly Cookies.Не используйте '*' для Происхождения, пока Вам действительно не нужно абсолютно публичное поведение.
Как говорит Википедия :
Это означает, что вы получите много ошибок, особенно в Chrome, когда вы попытаетесь реализовать, например, простую аутентификацию.
Вот исправленная обертка:
И не забудьте ответить на все эти заголовки на предварительный запрос OPTIONS.
источник
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))
менее, поскольку у меня есть около 16 маршрутов, это не идеально, есть ли способ указать его в качестве оболочки на уровне пакета http или mux-маршрутизатораУстановите правильное промежуточное ПО golang, чтобы вы могли использовать его на любой конечной точке.
Тип и функция помощника
Актуальное промежуточное ПО
Конечная точка
Remeber! Промежуточные программы применяются в обратном порядке (ExpectGET () сначала срабатывает)
источник
Если вы не хотите переопределять свой маршрутизатор (если ваше приложение не настроено так, чтобы это поддерживалось, или вы хотите настроить CORS на маршруте по маршруту), добавьте обработчик OPTIONS для обработки запроса перед полетом ,
То есть с Gorilla Mux ваши маршруты будут выглядеть так:
Обратите внимание, что в дополнение к нашему обработчику POST мы определяем определенный обработчик метода OPTIONS .
А затем для фактической обработки метода предварительной проверки OPTIONS вы можете определить AccountsCreatePreFlight следующим образом:
Что действительно заставило меня все это щелкнуть (в дополнение к собственному пониманию того, как работает CORS), так это то, что HTTP-метод предварительного запроса отличается от HTTP-метода реального запроса. Чтобы инициировать CORS, браузер отправляет предварительный запрос с опциями метода HTTP, который вы должны явно обработать в своем маршрутизаторе, а затем, если он получает соответствующий ответ
"Access-Control-Allow-Origin": origin
(или «*» для всех) от вашего приложения, он инициирует фактический запрос.Я также считаю, что вы можете делать «*» только для стандартных типов запросов (например, GET), но для других вам придется явно указать источник, как я делал выше.
источник
Я создаю обертку для этого случая:
источник
У меня была та же проблема, что и описанная выше, приведенные выше решения верны, у меня есть следующие настройки: 1) Angularjs для клиента 2) Beego Framework для GO-сервера
Пожалуйста, следуйте этим пунктам 1) Настройки CORS должны быть включены только на сервере GO 2) НЕ добавляйте заголовки любого типа в angularJS, за исключением этого
На вашем GO-сервере добавьте параметры CORS до начала обработки запроса, чтобы предварительный запрос получил 200 OK, после чего метод OPTIONS будет преобразован в GET, POST, PUT или любой другой тип запроса.
источник
Я знаю, что это другой поворот в ответе, но разве это не проблема для веб-сервера? Например, nginx , может помочь.
Добавление nginx перед вашим сервисом go в производстве кажется разумным. Он предоставляет гораздо больше возможностей для авторизации, регистрации и изменения запросов. Кроме того, это дает возможность контролировать, кто имеет доступ к вашему сервису, и не только это, но и можно указать другое поведение для определенных местоположений в вашем приложении, как показано выше.
Я мог бы продолжить о том, почему использовать веб-сервер с вашим go api, но я думаю, что это тема для другого обсуждения.
источник