2017-11-28 4 views
2

私はフロントエンドの角型アプリとゴールデンapiを持っています。角型アプリが構築されています(うまく動作しています)。これは、外部サービスを呼び出すgo apiをいくつか呼び出します。外部サービスへの呼び出しの後、フロントエンドが成功ページにリダイレクトされるようにします。私は私のGoコードで動作するように見えることはできません。API呼び出し後にリダイレクトする方法

これは私が(リダイレクトを除く作品)持っているものです:私のコードのコメントで

package main 

import (
    "github.com/gin-gonic/gin" 
    "github.com/gin-contrib/static" 
    "net/http" 
    "io/ioutil" 
    "strings" 
    "encoding/json" 
    "strconv" 
    "net/http/cookiejar" 
) 

const BASE_ENDPOINT = "https://external.host.com/" 
const FIRST_CALL_ENDPOINT = BASE_ENDPOINT + "first" 
const SECOND_CALL_ENDPOINT = BASE_ENDPOINT + "second" 


func main() { 
    // create an http client with a cookie jar 
    cookieJar, _ := cookiejar.New(nil) 
    client := &http.Client{ 
     Jar: cookieJar, 
    } 

    router := gin.Default() 
    // this is the default route for the front end. The angular app will handle 
    // all non-api calls 
    router.Use(static.Serve("/", static.LocalFile("../frontend/dist", true))) 

    // Routes 
    api := router.Group("/") 
    { 
     // get post calls to this endpoint 
     api.POST("/my/first", func(c *gin.Context) { 

      userData := c.PostForm("userData") 
      rawTextBody := "data=" + userData 
      resp, err := client.Post(FIRST_CALL_ENDPOINT, "text/plain", strings.NewReader(rawTextBody)) 
      if err != nil { 
       panic(err) 
      } 
      body, _ := ioutil.ReadAll(resp.Body) 
      var data map[string]interface{} 
      jsonErr := json.Unmarshal([]byte(body), &data) 
      if jsonErr != nil { 
       panic(jsonErr) 
      } 
      // data comes back as a "float64", is converted to an int, then to a string 
      var jobId = strconv.Itoa(int(data["curjobId"].(float64))) 
      moreUserData := c.PostForm("moreUserData") 
      rawTextBodyCat := "secondUserData=" + moreUserData + "&jobid=" + jobId 
      _, secErr := client.Post(SECOND_CALL_ENDPOINT, "text/plain", strings.NewReader(rawTextBodyCat)) 
      if secErr != nil { 
       panic(secErr) 
      } 
      // TODO: need "successfully submitted" page. This already exists in the frontend angular server 
      // I can manually go to that page. ('/my/success') 

      // what i've tried: 
      //http.Redirect(w, r, "/my/success", http.StatusSeeOther) 
      //http.RedirectHandler("/my/success", http.StatusSeeOther) 

     }) 
    } 

    router.NoRoute(func(c *gin.Context) { 
     c.File("../frontend/dist/index.html") 
    }) 

    // Run server 
    router.Run(":8899") 
} 

、あなたは私がhttp.Redirect(w, r, "/my/success", http.StatusSeeOther)を試みたが、私はこれでそれを呼び出す方法がわからない見ることができますコンテキスト。私はルートリスナーを設定するのではなく、要求に応じてリダイレクトをトリガーしようとしています。何らかの角度のアプリケーションでこれを処理する必要がありますか?角度のあるアプリに「すべて完了しました」とどうやって伝えることができますか?

+0

解決策は、goサーバーからJSONを戻し、角度アプリでリダイレクトを処理することです。 – Jeff

+1

[Golang:URLにリダイレクトする方法]の複製があります(https://stackoverflow.com/questions/35934298/golang-how-to-redirect-to-a-url) – Flimzy

答えて

2

API応答でフロントエンドクライアントアプリをリダイレクトすることはできません。 これをクライアント側で処理し、ルータを使用して正しいページに移動する必要があります。

何API:何をすべきか、あなたの角度のクライアントのための命令簡単です

Redirect replies to the request with a redirect to url, which may be a path relative to the request path. 

source

$ http成功コールバックでは$location.url('/my/success')と呼ばれ、角度ルータを使用して'/my/success'にリダイレクトされます。

+0

これは私が何を考えているかを確認します。ありがとう。 – Jeff

関連する問題