> 백엔드 개발 > Golang > Golang 애플리케이션: 요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.

Golang 애플리케이션: 요청한 리소스에 'Access-Control-Allow-Origin' 헤더가 없습니다.

王林
풀어 주다: 2024-02-06 09:18:03
앞으로
997명이 탐색했습니다.

Golang 应用程序:请求的资源上不存在“Access-Control-Allow-Origin”标头

질문 내용

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿