Angular 애플리케이션에서 Go 서버로 HTTP 요청을 보내려고 할 때마다 다음 응답을 받습니다.
실행 전 요청에 대한 응답이 액세스 제어 확인에 실패했습니다. 'Access-Control-Allow-Origin' 헤더가 요청한 리소스에 없습니다.
오류 응답에 헤더를 자세히 추가했는데 오류가 지속됩니다.
server.go
으아악route.go
package rest import ( "context" "fmt" "net/http" "os" "os/signal" "sync" "syscall" "github.com/gorilla/mux" "github.com/randyVerduguez/randy-verduguez_06122023-BE-challenge/configs" "github.com/randyVerduguez/randy-verduguez_06122023-BE-challenge/http/rest/handlers" "github.com/randyVerduguez/randy-verduguez_06122023-BE-challenge/pkg/db" "github.com/rs/cors" "github.com/sirupsen/logrus" ) type Server struct { logger *logrus.Logger router *mux.Router config configs.Config } func NewServer() (*Server, error) { config, err := configs.NewParsedConfig() if err != nil { return nil, err } database, err := db.Connect(db.ConfigDB{ Host: config.Database.Host, Port: config.Database.Port, User: config.Database.User, Password: config.Database.Password, Name: config.Database.Name, }) if err != nil { return nil, err } log, err := NewLogger() if err != nil { return nil, err } router := mux.NewRouter() handlers.Register(router, log, database) server := Server{ logger: log, config: config, router: router, } return &server, nil } func (s *Server) Run(ctx context.Context) error { cors := cors.New(cors.Options{ AllowedMethods: []string{"GET, POST"}, AllowedOrigins: []string{"http://localhost:4200"}, AllowedHeaders: []string{"Content-Type", "Accept"}, }) server := http.Server{ Addr: fmt.Sprintf(":%d", s.config.ServerPort), Handler: cors.Handler(s.router), } stopServer := make(chan os.Signal, 1) signal.Notify(stopServer, syscall.SIGINT, syscall.SIGTERM) defer signal.Stop(stopServer) serverErrors := make(chan error, 1) var wg sync.WaitGroup wg.Add(1) go func(wg *sync.WaitGroup) { defer wg.Done() s.logger.Printf("REST API listening on %d", s.config.ServerPort) serverErrors <- server.ListenAndServe() }(&wg) select { case err := <-serverErrors: return fmt.Errorf("error: starting REST API server %w", err) case <-stopServer: s.logger.Warn("server recieved STOP signal") err := server.Shutdown(ctx) if err != nil { return fmt.Errorf("graceful shutdown did not complete: %w", err) } wg.Wait() s.logger.Info("server was shutdown gracefully") } return nil } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "http://localhost:4200") w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS") w.Header().Set("Access-Control-Allow-Credentials", "true") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, Accept, origin, Cache-Control, X-Requested-With") if r.Method == "OPTIONS" { return } s.router.ServeHTTP(w, r) }
내가 발견한 첫 번째 질문은 다음과 같습니다.
AllowedMethods: []string{"GET, POST"},
다음과 같아야 합니다.
AllowedMethods: []string{"GET", "POST"},
(或者稍微不易出错的 []string{http.MethodGet, http.MethodPost}
)
Documentation에 따르면 기본값은 다음과 같습니다(생략 가능).
다음 질문은 "원본이 무엇입니까?"입니다. CORS는 "교차 원본 리소스 공유"이며 목표는 "한 원본에서 실행되는 클라이언트 웹 애플리케이션이 다른 원본에서 검색된 데이터를 얻는 것을 방지하는 것"입니다. 요청을 작성하는 페이지는 매우 중요합니다. http://localhost:4200
(AllowedOrigins: []string{"http://localhost:4200"}
) 所以我假设您有两个服务器在本地主机上运行(但如果这不是案件)。如果您希望允许所有来源,请使用 "*"
허용합니다. 테스트를 위해 test-cors.org를 사용하겠습니다. 웹사이트로 이동하여 URL(예: "http://127.0.0.1:8080/weather/welcome")을 입력하고 "원격 URL"을 입력하세요. " "를 선택하고 "요청 보내기"를 클릭하여 테스트하세요.
귀하의 코드가 약간 혼란스럽습니다(예: (s *Server) ServeHTTP
사용되지 않음 - 여기에서 문의할 때 최소하고 재현 가능한 예제를 제공하는 것을 목표로 하세요). 따라서 상황을 조금 단순화했으며 다음 내용을 통해 올바른 방향을 제시할 수 있기를 바랍니다.
위 내용은 Golang 애플리케이션: 요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!