问题描述
我正在运行 Go 服务器并通过 React.js 中的 Axios 发出 POST 请求。 我似乎已经尝试了我能够找到的 StackOverflow 上的几乎所有内容,但由于某种原因,它仍然无法正常工作。
这是我的服务器代码(我一直在使用 /test 端点进行测试:
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
}
我的错误信息:
从源 'http://localhost:3000' 访问 XMLHttpRequest at 'http://localhost:8080/test' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 '请求的资源上存在 Access-Control-Allow-Origin 标头。
非常感谢任何帮助!
解决方法
我通过浏览器在我的机器上进行了测试,很想检查更新的 Allowedmethod '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 := &http.Server{
Handler: cors.Handler(r),Addr: ":8080",WriteTimeout: 1 * time.Minute,ReadTimeout: 1 * time.Minute,}
log.Fatal(srv.ListenAndServe())
}