Go简单API网关代理

标签 go proxy martini

我一直在互联网上搜索如何执行此操作,但一直找不到。我正在尝试使用 Go 和 Martini 为我的系统构建一个简单的 API 网关,该系统具有一些运行 REST 接口(interface)的微服务。例如,我的 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 工作得很好

最佳答案

标准库版本

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    target, err := url.Parse("http://192.168.2.8:8000")
    if err != nil {
        log.Fatal(err)
    }
    http.Handle("/users/", http.StripPrefix("/users/", httputil.NewSingleHostReverseProxy(target)))
    http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./Documents"))))
    log.Fatal(http.ListenAndServe(":8080", nil))
}

用一个函数包装 http.StripPrefix,如果您需要日志记录,则在调用它之前记录它。

关于Go简单API网关代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29476611/

相关文章:

go run 找不到包

video - 为什么在使用 youtube-dl 设置代理参数时无法下载视频标题?

python - 使用 Python 以编程方式通过代理发出 HTTP 请求

node.js - NPM 安装在 Docker 容器内失败,但在带有企业代理的主机上运行

html - 带有命名参数的 Martini 路由无法加载静态文件

golang - 如何将字节 slice 转换为 bool 值?

sqlite - 使用gorm的sqlite中的时间列

go - 将位映射到 int

go - Martini 模板和测试