Estou tentando definir um cabeçalho no meu servidor web Go. Estou usando gorilla/mux
e net/http
pacotes.
Eu gostaria de definir Access-Control-Allow-Origin: *
para permitir AJAX entre domínios.
Aqui está o meu código 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)
}
O net/http
pacote possui documentação descrevendo o envio de cabeçalhos de solicitação http como se fosse um cliente - não sei exatamente como definir cabeçalhos de resposta?
http
go
cors
http-headers
zen
fonte
fonte
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(o valor "*" não é permitido quando credenciais são enviadas, que é um caso de uso comum). Você deve definir a origem para o solicitante (consulte a resposta de Matt Bucci abaixo para saber como).Todas as respostas acima estão erradas porque não conseguem lidar com a solicitação de comprovação de OPTIONS, a solução é substituir a interface do roteador mux. Consulte Falha na solicitação de obtenção do AngularJS $ http com cabeçalho personalizado (permitido no CORS)
fonte
Access-Control-Allow-Credentials": "true"
de solicitações com httpOnly Cookies.Não use '*' para o Origin até que você realmente precise de um comportamento completamente público.
Como a Wikipedia diz :
Isso significa que você receberá muitos erros, especialmente no Chrome, quando tentar implementar, por exemplo, uma autenticação simples.
Aqui está um wrapper corrigido:
E não se esqueça de responder a todos esses cabeçalhos à solicitação OPTIONS de comprovação.
fonte
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))
, porém, como eu tenho cerca de 16 rotas este não é o ideal, há alguma maneira de especificar isso como um wrapper para o pacote http ou camada router muxDefina um middleware golang adequado para poder reutilizar em qualquer terminal.
Tipo e Função do Auxiliar
Middleware real
Ponto final
LEMBRE-SE! Middlewares são aplicados em ordem inversa (ExpectGET () é acionado primeiro)
fonte
Se você não deseja substituir seu roteador (se você não tiver seu aplicativo configurado de uma maneira que ofereça suporte a isso, ou desejar configurar o CORS em uma rota por rota), adicione um manipulador de OPTIONS para lidar com a solicitação de pré-vôo .
Ou seja, com o Gorilla Mux, suas rotas se pareceriam com:
Observe acima que, além de nosso manipulador POST, estamos definindo um manipulador de método OPTIONS específico .
E, para lidar com o método de comprovação OPTIONS, você pode definir AccountsCreatePreFlight da seguinte maneira:
O que realmente fez tudo isso clicar para mim (além de realmente entender como o CORS funciona) é que o método HTTP de uma solicitação de comprovação é diferente do método HTTP da solicitação real. Para iniciar o CORS, o navegador envia uma solicitação de comprovação com o método HTTP OPTIONS, que você precisa manipular explicitamente no roteador e, em seguida, se receber a resposta apropriada
"Access-Control-Allow-Origin": origin
(ou "*" para todos) do seu aplicativo, inicia a real solicitação.Eu também acredito que você só pode fazer "*" para tipos padrão de solicitações (por exemplo: GET), mas para outros você precisará definir explicitamente a origem, como eu faço acima.
fonte
Eu crio o wrapper para este caso:
fonte
Eu tive o mesmo problema, conforme descrito acima, as soluções fornecidas acima estão corretas, a configuração que tenho é a seguinte 1) Angularjs para o cliente 2) Estrutura do Beego para servidor GO
Por favor, siga estes pontos 1) As configurações do CORS devem ser ativadas apenas no servidor GO 2) NÃO adicione nenhum tipo de cabeçalho no angularJS, exceto este
No servidor GO, adicione as configurações do CORS antes que a solicitação comece a ser processada, para que a solicitação de comprovação receba 200 OK, após o que o método OPTIONS será convertido em GET, POST, PUT ou qualquer que seja o seu tipo de solicitação.
fonte
Sei que essa é uma reviravolta diferente na resposta, mas isso não é mais uma preocupação para um servidor web? Por exemplo, nginx , poderia ajudar.
Adicionar nginx na frente do seu serviço go na produção parece sábio. Ele fornece muito mais recursos para autorizar, registrar e modificar solicitações. Além disso, permite controlar quem tem acesso ao seu serviço e não apenas isso, mas é possível especificar um comportamento diferente para locais específicos no seu aplicativo, como demonstrado acima.
Eu poderia continuar falando sobre o porquê de usar um servidor da Web com sua API go, mas acho que esse é um tópico para outra discussão.
fonte