J'essaie de définir un en-tête dans mon serveur Web Go. J'utilise gorilla/mux
et des net/http
packages.
Je voudrais configurer Access-Control-Allow-Origin: *
pour autoriser le cross domain AJAX.
Voici mon code 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)
}
Le net/http
package contient une documentation décrivant l'envoi des en-têtes de demande http comme s'il s'agissait d'un client - je ne sais pas exactement comment définir les en-têtes de réponse?
http
go
cors
http-headers
Zen
la source
la source
w.Header().Add("Access-Control-Allow-Methods", "PUT") w.Header().Add("Access-Control-Allow-Headers", "Content-Type")
withCredentials:true
(la valeur "*" n'est pas autorisée lorsque les informations d'identification sont envoyées, ce qui est un cas d'utilisation courant). Vous devez définir l'origine sur le demandeur (voir la réponse de Matt Bucci ci-dessous pour savoir comment).Toutes les réponses ci-dessus sont fausses car elles ne parviennent pas à gérer la demande de contrôle en amont OPTIONS, la solution est de remplacer l'interface du routeur multiplexeur. Voir AngularJS $ http get request failed with custom header (alllowed in CORS)
la source
Access-Control-Allow-Credentials": "true"
demandes avec httpOnly Cookies.N'utilisez pas '*' pour Origin, jusqu'à ce que vous ayez vraiment besoin d'un comportement complètement public.
Comme le dit Wikipedia :
Cela signifie que vous obtiendrez beaucoup d'erreurs, en particulier dans Chrome lorsque vous tenterez de mettre en œuvre par exemple une authentification simple.
Voici un wrapper corrigé:
Et n'oubliez pas de répondre à tous ces en-têtes à la requête OPTIONS de contrôle en amont.
la source
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))
cependant, comme j'ai environ 16 routes, ce n'est pas idéal, y a-t-il un moyen de le spécifier comme wrapper au package http ou à la couche de routeur muxDéfinissez un middleware golang approprié pour pouvoir le réutiliser sur n'importe quel point de terminaison.
Type et fonction d'assistance
Intergiciel réel
Point final
RAPPELEZ-VOUS! Les middlewares sont appliqués dans l'ordre inverse (ExpectGET () obtient les incendies en premier)
la source
Si vous ne souhaitez pas remplacer votre routeur (si votre application n'est pas configurée d'une manière qui prend en charge cela, ou si vous souhaitez configurer CORS route par route), ajoutez un gestionnaire OPTIONS pour gérer la demande de pré-vol .
C'est-à-dire qu'avec Gorilla Mux, vos itinéraires ressembleraient à:
Notez ci-dessus qu'en plus de notre gestionnaire POST, nous définissons un gestionnaire de méthode OPTIONS spécifique .
Et puis pour gérer réellement la méthode de contrôle en amont OPTIONS, vous pouvez définir AccountsCreatePreFlight comme suit:
Ce qui a vraiment rendu tout cela cliqué pour moi (en plus de comprendre comment fonctionne CORS), c'est que la méthode HTTP d'une demande de contrôle en amont est différente de la méthode HTTP de la demande réelle. Pour lancer CORS, le navigateur envoie une requête de contrôle en amont avec OPTIONS de méthode HTTP, que vous devez gérer explicitement dans votre routeur, puis, s'il reçoit la réponse appropriée
"Access-Control-Allow-Origin": origin
(ou "*" pour tous) de votre application, il lance le demande.Je crois aussi que vous ne pouvez faire "*" que pour les types de requêtes standard (par exemple: GET), mais pour d'autres, vous devrez définir explicitement l'origine comme je le fais ci-dessus.
la source
Je crée un wrapper pour ce cas:
la source
J'ai eu le même problème que celui décrit ci-dessus, les solutions données ci-dessus sont correctes, la configuration que j'ai est la suivante 1) Angularjs pour le client 2) Framework Beego pour le serveur GO
Veuillez suivre ces points 1) Les paramètres CORS doivent être activés uniquement sur le serveur GO 2) N'ajoutez AUCUN type d'en-tête dans angularJS sauf pour cela
Dans votre serveur GO, ajoutez les paramètres CORS avant que la demande ne commence à être traitée afin que la demande de contrôle en amont reçoive un 200 OK, après quoi la méthode OPTIONS sera convertie en GET, POST, PUT ou quel que soit votre type de demande.
la source
Je sais que la réponse est différente, mais n'est-ce pas plus une préoccupation pour un serveur Web? Par exemple, nginx pourrait vous aider.
Ajouter nginx devant votre service go en production semble judicieux. Il fournit beaucoup plus de fonctionnalités pour l'autorisation, la journalisation et la modification des demandes. En outre, cela donne la possibilité de contrôler qui a accès à votre service et pas seulement cela, mais on peut spécifier un comportement différent pour des emplacements spécifiques de votre application, comme démontré ci-dessus.
Je pourrais expliquer pourquoi utiliser un serveur Web avec votre api go, mais je pense que c'est un sujet pour une autre discussion.
la source