Сервер блокирует CORS, даже если я включил localhost

#http #go #http-headers #cors

# #http #Вперед #http-заголовки #cors

Вопрос:

Я запускаю сервер Go и делаю POST-запросы через Axios в React.js . Кажется, я перепробовал практически все в StackOverflow, что смог найти, но по какой-то причине он просто не работает.

Вот мой серверный код (я тестировал с / test endpoint:

 func main() {

    r := mux.NewRouter()

    r.HandleFunc("/api/patients", getPatients).Methods("GET")
    r.HandleFunc("/api/patients", createPatient).Methods("POST")
    r.HandleFunc("/api/login", validateAdmin).Methods("POST")
    r.HandleFunc("/test", testPOST).Methods("POST", "OPTIONS")

    // set up server on port 8000
    log.Fatal(http.ListenAndServe(":8080", handlers.CORS(handlers.AllowedHeaders([]string{"X-Requested-With", "Content-Type", "Authorization"}), handlers.AllowedMethods([]string{"GET", "POST", "PUT", "HEAD", "OPTIONS"}), handlers.AllowedOrigins([]string{"http://localhost:3000"}))(r)))
}

// Test POST requests
func testPOST(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Header().Set("Access-Control-Allow-Origin", "*")

    decoder := json.NewDecoder(r.Body)

    // irrelevant code that retrieves data from MySQL
    // irrelevant code that retrieves data from MySQL
    // irrelevant code that retrieves data from MySQL 

    w.WriteHeader(http.StatusOK)

    // encode inserted patient as json and send back
    json.NewEncoder(w).Encode(patient)

}
 

и вот как я делаю запрос POST:

 function submitData(event) {
        console.log("SUBMITTED FORM DATA");
        event.preventDefault(); // prevent from page refreshing
        const patient = {
            name: name,
            dob: dob,
            phone: phone,
            email: email,
            address: address
        };

        // send post request to API
        axios.post('http://localhost:8080/test', { patient }, {headers: {'Access-Control-Allow-Origin': '*'}}, { crossdomain: true })
            .then (res => {
                console.log(res);
                console.log(res.data);
            })
        event.preventDefault(); // prevent from page refreshing
    }
 

Мое сообщение об ошибке:

Доступ к XMLHttpRequest по адресу ‘http://localhost:8080/test » из источника «http://localhost:3000 ‘ заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: заголовок ‘Access-Control-Allow-Origin’ отсутствует на запрошенном ресурсе.

Любая помощь приветствуется!

Ответ №1:

Я тестировал на своем компьютере из браузера, обязательно проверьте обновленный разрешенный метод ‘PATCH’.

 package main

import (
    "log"
    "net/http"
    "github.com/gorilla/mux"
    "github.com/rs/cors"
)
func main() {
    r := mux.NewRouter()
    r.HandleFunc("/api/patients", getPatients).Methods("GET")
    r.HandleFunc("/api/patients", createPatient).Methods("POST")
    r.HandleFunc("/api/login", validateAdmin).Methods("POST")
    r.HandleFunc("/test", testPOST).Methods("POST", "OPTIONS")

    cors := cors.New(cors.Options{
        AllowedOrigins: []string{"*"},
        AllowedHeaders: []string{"Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization"},
        AllowedMethods: []string{"GET", "PATCH", "POST", "PUT", "OPTIONS", "DELETE"},
    })
    srv := amp;http.Server{
        Handler:      cors.Handler(r),
        Addr:         ":8080",
        WriteTimeout: 1 * time.Minute,
        ReadTimeout:  1 * time.Minute,
    }
    log.Fatal(srv.ListenAndServe())
}