我在这里设置相当简单,如下面的代码所述.但我无法CORS
上班.我一直收到这个错误:
XMLHttpRequest无法加载http:// localhost:3000/signup.对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此不允许来源' http:// localhost:8000 '访问.响应具有HTTP状态代码403.
我相信我在这里缺少一些简单的东西.
这是我的代码:
package main
import (
"log"
"net/http"
"github.com/gorilla/handlers"
"github.com/gorilla/mux"
"myApp/src/controllers"
)
func main() {
ac := new(controllers.AccountController)
router := mux.NewRouter()
router.HandleFunc("/signup", ac.SignUp).Methods("POST")
router.HandleFunc("/signin", ac.SignIn).Methods("POST")
log.Fatal(http.ListenAndServe(":3000", handlers.CORS()(router)))
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Gorilla mux和net/http包创建一些路由,如下所示
package routes
//some imports
//some stuff
func AddQuestionRoutes(r *mux.Router) {
s := r.PathPrefix("/questions").Subrouter()
s.HandleFunc("/{question_id}/{question_type}", getQuestion).Methods("GET")
s.HandleFunc("/", postQuestion).Methods("POST")
s.HandleFunc("/", putQuestion).Methods("PUT")
s.HandleFunc("/{question_id}", deleteQuestion).Methods("DELETE")
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写测试来测试这些路线.例如,我试图测试GET
路由专门尝试400
返回,所以我有以下测试代码.
package routes
//some imports
var m *mux.Router
var req *http.Request
var err error
var respRec *httptest.ResponseRecorder
func init() {
//mux router with added question routes
m = mux.NewRouter()
AddQuestionRoutes(m)
//The response recorder used to record HTTP responses
respRec = httptest.NewRecorder()
}
func TestGet400(t *testing.T) {
//Testing get of non existent question …
Run Code Online (Sandbox Code Playgroud) 我一直在研究golang,我注意到很多人使用这个http.NewServeMux()
函数创建服务器,我真的不明白它的作用.
我看了这个:
在go ServeMux是一个HTTP请求多路复用器.它将每个传入请求的URL与已注册模式的列表进行匹配,并调用与URL最匹配的模式的处理程序.
这与做以下事情有什么不同:
http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)
Run Code Online (Sandbox Code Playgroud)
使用多路复用的目的是什么?
在go程序中,我想同时运行两个Web服务器,
显然它们将在两个不同的端口上服务(如果需要,还有ip地址),
问题是调用时http.handle
,当我尝试注册处理程序时' /'对于第二台服务器,它恐慌并说已经有一个与'/'关联的处理程序,
我想我需要创建一个多路复用器DefaultServeMux
以及我试图用它来做gorillaMux
但无法搞清楚,
在同一个程序/进程中运行两个Web服务器是否存在根本性的问题.
为了更清楚,两个Web服务器中的一个是用作常规Web服务器,我需要第二个作为RPC服务器来在集群的不同节点上运行的程序的实例之间进行通信,
编辑:为了使它更清楚,这不是实际的代码,但它是要点
myMux := http.NewServeMux()
myMux.HandleFunc("/heartbeat", heartBeatHandler)
http.Handle("/", myMux)
server := &http.Server{
Addr: ":3400",
Handler: myMux,
}
go server.ListenAndServe()
gorillaMux := mux.NewRouter()
gorillaMux.HandleFunc("/", indexHandler)
gorillaMux.HandleFunc("/book", bookHandler)
http.Handle("/", gorillaMux)
server := &http.Server{
Addr: ":1234",
Handler: gorillaMux,
}
log.Fatal(server.ListenAndServe())
Run Code Online (Sandbox Code Playgroud) 鉴于您有两个实例http.ServeMux
,并希望它们在相同的端口号上提供,如下所示:
muxA, muxB http.ServeMux
//initialise muxA
//initialise muxB
combinedMux := combineMux([muxA, muxB])
http.ListenAndServe(":8080", combinedMux)
Run Code Online (Sandbox Code Playgroud)
combinedMux
如上所述,如何编写函数?
......还是有另一种方法来完成同样的事情?
go ×5
servemux ×5
gorilla ×3
http ×2
cors ×1
multiplexing ×1
mux ×1
unit-testing ×1
webserver ×1