2015-04-06 19 views
5

मैं इंटरनेट पर यह खोज रहा हूं कि यह कैसे करें, लेकिन मैं इसे नहीं ढूंढ पा रहा हूं। मैं अपने सिस्टम के लिए गो और मार्टिनी का उपयोग करके एक साधारण एपीआई गेटवे बनाने की कोशिश कर रहा हूं जिसमें आरईएसटी इंटरफेस चलने वाले कुछ माइक्रोस्कोप हैं। उदाहरण के लिए, मैं अपने users सेवा 192.168.2.8:8000 पर चल रहे हैं, और मैं के माध्यम से /usersजाओ सरल एपीआई गेटवे प्रॉक्सी

इसे उपयोग करने में तो मेरी एपीआई प्रवेश द्वार कुछ इस तरह दिखेगा हैं:

package main 

import (
    "github.com/codegangsta/martini" 
    "net/http" 
) 

func main(){ 
    app := martini.Classic() 
    app.Get("https://stackoverflow.com/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("https://stackoverflow.com/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 काम करता है ठीक माध्यम से एक समस्या लगती है

+3

उपयोगकर्ता मार्टिनी के लिए कोई कारण ... आप नेट/http पैकेज के साथ सब कुछ कर सकते हैं। –

+0

मुझे पता है, लेकिन इसे कुछ स्थिर फ़ाइल सेवा और अन्य चीजों को भी करना होगा, गेटवे केवल एप्लिकेशन का हिस्सा है – Dirk

उत्तर

5

stdlib संस्करण

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("https://stackoverflow.com/users/", http.StripPrefix("https://stackoverflow.com/users/", httputil.NewSingleHostReverseProxy(target))) 
    http.Handle("/public/", http.StripPrefix("/public/", http.FileServer(http.Dir("./Documents")))) 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

लपेटें http.StripPrefix एक फ़ंक्शन के साथ जो इसे कॉल करने से पहले लॉग इन करता है यदि आपको लॉगिंग की आवश्यकता है।

संबंधित मुद्दे