これを行う方法をインターネット全体で検索してきましたが、見つけることができませんでした。Go と Martini を使用して、REST インターフェイスが実行されているいくつかのマイクロサービスを備えたシステム用に単純な API ゲートウェイを構築しようとしています。たとえば、users
サービスを で実行していて192.168.2.8:8000
、 からアクセスしたいとします。/users
したがって、私の API ゲートウェイは次のようになります。
package main
import (
"github.com/codegangsta/martini"
"net/http"
)
func main(){
app := martini.Classic()
app.Get("/users/:resource", func(req *http.Request, res http.ResponseWriter){
//proxy to http://192.168.2.8:8000/:resource
})
app.Run()
}
編集
何かが機能していますが、表示されるのは次の[vhost v2] release 2.2.5
とおりです。
package main
import(
"net/url"
"net/http"
"net/http/httputil"
"github.com/codegangsta/martini"
"fmt"
)
func main() {
remote, err := url.Parse("http://127.0.0.1:3000")
if err != nil {
panic(err)
}
proxy := httputil.NewSingleHostReverseProxy(remote)
app := martini.Classic()
app.Get("/users/**", handler(proxy))
app.RunOnAddr(":4000")
}
func handler(p *httputil.ReverseProxy) func(http.ResponseWriter, *http.Request, martini.Params) {
return func(w http.ResponseWriter, r *http.Request, params martini.Params) {
fmt.Println(params)
r.URL.Path = "/authorize"
p.ServeHTTP(w, r)
}
}
編集 2
これは、ブラウザから直接使用する場合にのみ問題になるようで、問題なくXMLHttpRequest
動作します