#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())
}