2 votes

Comment compléter la carte renvoyée par la fonction Header() d'un ResponseWriter ?

Je suis sûr que j'essaie de tricher ici, mais la documentation de ResponseWriter contient une méthode 'Header()' qui renvoie l'objet Header qu'il utilise. https://pkg.go.dev/net/http#ResponseWriter.Header

Maintenant, je reçois une réponse http.Response d'un autre endroit, et je veux copier tous les en-têtes de cette réponse dans mon ResponseWriter.

Maintenant, je pourrais utiliser une boucle for comme ça :

for k := range resp.Header 
    w.Header().Add(k, resp.Header.Get(k))
}

Logiquement, il m'aurait suffi de changer la référence de l'en-tête du ResponseWriter à l'en-tête de la réponse, mais il semble que le type ResponseWriter essaie activement de m'en empêcher.

Quelque chose de stupide comme ceci me vient à l'esprit

w.Header() = resp.Header

Ou

rwHeader := w.Header()
rwHeader = resp.Header

Il est évident que ces deux exemples n'ont aucun sens et ne fonctionnent pas du tout, mais j'espère qu'ils transmettent l'idée de ce que j'essaie de faire.

Quelqu'un peut-il m'expliquer pourquoi ce que j'essaie de faire ne fonctionne pas ? Ou peut-être que ça marche et que je ne vois pas comment le faire ?

3voto

Jubobs Points 1246

Vous n'avez pas besoin d'écrire cette boucle vous-même. Go 1.18 a vu l'ajout du paquet golang.org/x/exp/maps qui fournit un moyen pratique Copy fonction :

func Copy[M ~map[K]V, K comparable, V any](dst, src M)

Copy copie toutes les paires clé/valeur dans src en les ajoutant à dst . Lorsque une clé dans src est déjà présent dans dst la valeur dans dst sera écrasée par la valeur associée à la clé dans le fichier src .

import "golang.org/x/exp/maps"
// ...
maps.Copy(w.Header(), resp.Header)

Cependant, notez que, comme une réponse peut contenir en-têtes en double l'utilisation de maps.Copy n'est pas exactement équivalent à votre boucle :

for k := range resp.Header 
    w.Header().Add(k, resp.Header.Get(k))
}

Contrairement à maps.Copy votre boucle ne récupère que le premièrement correspondant à chaque nom d'en-tête présent dans l'en-tête resp.Header .

2voto

colminator Points 2707

Tu ne peux pas.

w est un http.ResponseWriter qui est un type d'interface - il ne possède donc que des méthodes et aucun champ directement accessible. Il possède, comme vous le savez, une méthode pour obtenir l'information sous-jacente de l'interface. Header carte.

Il ne dispose cependant pas d'une méthode "Setter" pour remplacer la carte. La seule façon de copier les valeurs d'en-tête est donc de le faire à la main, comme le fait votre boucle citée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X