英文:
Can I host Angular2 frontend and Golang backend in one server
问题
我想使用Golang创建一个RESTful API,并使用Angular2创建前端。通信将通过HTTP请求进行。Angular2将向Golang API发送请求。我知道对于Angular2,我应该运行自己的HTTP服务器进行路由和服务。
我可以在一个主机上运行Golang服务器,在另一个主机上运行Angular2服务器,并将它们连接在一起吗?
英文:
I want to create RESTful API with Golang and frontend with Angular2.
Communication will be made with http requests. Angular2 will send requests to Golang API's. I know for Angular2 I should run own http server for routing and services.
Can I run Golang server on one host and Angular2 server on another one and connect them together?
答案1
得分: 7
Angular2应用程序对应一组静态文件(依赖项和应用程序代码)。要通过Go来提供您的应用程序,您需要添加一些代码来提供这些文件。
这似乎是可能的。请参考以下链接:
编辑
根据您的评论:
> 如果您想在一个服务器上托管Angular2和golang。例如,我将通过链接mywebsite.com访问网站,并通过链接api.mywebsite.com访问golang API。
我看不出任何不这样做的理由。只需小心在API中支持CORS(在响应中发送CORS头并支持预检请求)。请参考以下链接:
- http://restlet.com/blog/2015/12/15/understanding-and-using-cors
- http://restlet.com/blog/2016/09/27/how-to-fix-cors-problems/
英文:
Angular2 applications correspond to a set of static files (dependencies and application code). To have your application served by Go, you need to add some code to serve these files.
It seems possible. See this link:
Edit
Following your comment:
> If you want to host Angular2 and golang in one server. For example i will have access to web site with link mywebsite.com and access to golang api api.mywebsite.com
I can't see any reason not to do that. Just be careful to support CORS in your API (send the CORS headers in the response and support prefligthed requests). See these links:
答案2
得分: 6
实际实现与标准库
type Adapter func(http.Handler) http.Handler
// 适配函数以在标准库上启用中间件
func Adapt(h http.Handler, adapters ...Adapter) http.Handler {
for _, adapter := range adapters {
h = adapter(h)
}
return h
}
// 创建新的服务 mux
mux := http.NewServeMux()
// 为静态文件服务创建空间
mux.Handle("/node_modules/", http.StripPrefix("/node_modules", http.FileServer(http.Dir("./node_modules"))))
mux.Handle("/html/", http.StripPrefix("/html", http.FileServer(http.Dir("./html"))))
mux.Handle("/js/", http.StripPrefix("/js", http.FileServer(http.Dir("./js"))))
mux.Handle("/ts/", http.StripPrefix("/ts", http.FileServer(http.Dir("./ts"))))
mux.Handle("/css/", http.StripPrefix("/css", http.FileServer(http.Dir("./css"))))
// 进行 API 处理**
mux.Handle("/api/register", Adapt(api.RegisterHandler(mux),
api.GetMongoConnection(),
api.CheckEmptyUserForm(),
api.EncodeUserJson(),
api.ExpectBody(),
api.ExpectPOST(),
))
mux.HandleFunc("/api/login", api.Login)
mux.HandleFunc("/api/authenticate", api.Authenticate)
// 对于任何其他请求,我们应该渲染我们的 SPA 的唯一 HTML 文件,
// 允许 Angular 在除 API 和其自身所需的文件之外的任何其他内容上进行路由
// 这里的顺序很关键。此 HTML 应包含类似于 <base href="/" /> 的基本标签
// 此处的 href 应与下面的 HandleFunc 路径匹配
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "html/index.html")
})
以上是使用标准库的实际实现代码。
英文:
Actual implementation with the stadand library
type Adapter func(http.Handler) http.Handler
// Adapt function to enable middlewares on the standard library
func Adapt(h http.Handler, adapters ...Adapter) http.Handler {
for _, adapter := range adapters {
h = adapter(h)
}
return h
}
// Creates a new serve mux
mux := http.NewServeMux()
// Create room for static files serving
mux.Handle("/node_modules/", http.StripPrefix("/node_modules", http.FileServer(http.Dir("./node_modules"))))
mux.Handle("/html/", http.StripPrefix("/html", http.FileServer(http.Dir("./html"))))
mux.Handle("/js/", http.StripPrefix("/js", http.FileServer(http.Dir("./js"))))
mux.Handle("/ts/", http.StripPrefix("/ts", http.FileServer(http.Dir("./ts"))))
mux.Handle("/css/", http.StripPrefix("/css", http.FileServer(http.Dir("./css"))))
// Do your api stuff**
mux.Handle("/api/register", Adapt(api.RegisterHandler(mux),
api.GetMongoConnection(),
api.CheckEmptyUserForm(),
api.EncodeUserJson(),
api.ExpectBody(),
api.ExpectPOST(),
))
mux.HandleFunc("/api/login", api.Login)
mux.HandleFunc("/api/authenticate", api.Authenticate)
// Any other request, we should render our SPA's only html file,
// Allowing angular to do the routing on anything else other then the api
// and the files it needs for itself to work.
// Order here is critical. This html should contain the base tag like
// <base href="/"> *href here should match the HandleFunc path below
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, "html/index.html")
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论