Mux 和 http.HandleFunc 甚至适用于 Google App Engine 上的 helloworld 端点

Posted

技术标签:

【中文标题】Mux 和 http.HandleFunc 甚至适用于 Google App Engine 上的 helloworld 端点【英文标题】:Mux nor http.HandleFunc is working for even a helloworld endpoint on Google App Engine 【发布时间】:2018-03-31 05:31:57 【问题描述】:

我无法让名为 emptysuccess 的处理程序工作。我正在将 sendgrid 变成一个 apppot 微服务。至今 来电

http://localhost:8080/emptysuccess

返回

404 页面未找到

这种行为是真实的 dev_appserver.py,也适用于真实的 apppot.com。如何让 /emptysuccess 工作?

package sendmail

import (
    "fmt"
    "github.com/sendgrid/sendgrid-go"
    "net/http"
    "google.golang.org/appengine"
    "github.com/gorilla/mux"
    "google.golang.org/appengine/log"

)

func main() 
    r := mux.Router
    r.HandleFunc("/send", sendhardcoded)
    r.HandleFunc("/emptysuccess", emptysuccess)
    //appengine.Main() // Starts the server to receive requests


func emptysuccess(w http.ResponseWriter, r *http.Request) 
    fmt.Println(w, "Hello Success")



func sendhardcoded(w http.ResponseWriter, r *http.Request) 
    ctx := appengine.NewContext(r)

    log.Infof(ctx, "Running Sendhardcoded")
    request := sendgrid.GetRequest("SG.OYPDF6hA.zk_XibKbJEUVLQfrkY-SBu5FejFakeC9ODFv1bE", "/v3/mail/send", "https://api.sendgrid.com")
    request.Method = "POST"
    request.Body = []byte(` 
    "personalizations": [
        
            "to": [
                
                    "email": "darian.hickman@gmail.info"
                
            ],
            "subject": "Sending with SendGrid is Fun"
        
    ],
    "from": 
        "email": "darian.hickman@ccc.com"
    ,
    "content": [
        
            "type": "text/plain",
            "value": "and easy to do anywhere, even with Go"
        
    ]
`)
    response, err := sendgrid.API(request)
    if err != nil 
        log.Errorf(ctx, "Problems: %v" ,err)
     else 
        fmt.Println(w, response.StatusCode)
        fmt.Println(w, response.Body)
        fmt.Println(w, response.Headers)
        fmt.Println(w, "Sendmail should have worked")
    

还要确保所有请求都转到我的 app.yaml 所在的 go 应用程序:

runtime: go
api_version: go1.9

handlers:

- url: /static
  static_dir: static

- url: /.*
  script: _go_app
  login: required
  secure: always

【问题讨论】:

你不缺http.Handle("/", r)吗?或者您的应用如何知道使用 mux 路由器处理传入的 http 请求? 我不确定它应该如何知道。我直接从 mux 站点复制粘贴了一个示例。看来我得挖更多了。 您没有复制将 mux 指定为请求处理程序的代码。 【参考方案1】:

以下是最终奏效的方法: 1. 我修复了 mkopriva 指出的多路复用器代码。 (注意:http.handleFunc 代替 http.Handle 不起作用)。 2. 我不得不将 main() 更改为 init(),然后应用引擎确认了我的多路复用器设置。

所以基本上我学到了 Go 应用程序引擎本身无法处理多个处理程序的艰难方法,并且我在设置多路复用器时搞砸了。

工作代码:

package sendmail

import (
    "fmt"
    _"github.com/sendgrid/sendgrid-go"
    "net/http"
    "google.golang.org/appengine"
    "github.com/gorilla/mux"
    "google.golang.org/appengine/log"

)

func init() 
    r := mux.NewRouter()
    r.HandleFunc("/send", sendhardcoded)
    r.HandleFunc("/emptysuccess", emptysuccess)
    //appengine.Main() // Starts the server to receive requests
    http.Handle("/", r)


func emptysuccess(w http.ResponseWriter, r *http.Request) 
    fmt.Println(w, "Hello Success")



func sendhardcoded(w http.ResponseWriter, r *http.Request) 
    ctx := appengine.NewContext(r)

    log.Infof(ctx, "Running Sendhardcoded")


【讨论】:

以上是关于Mux 和 http.HandleFunc 甚至适用于 Google App Engine 上的 helloworld 端点的主要内容,如果未能解决你的问题,请参考以下文章

如何在golang中动态编写http.HandleFunc()?

从ListenAndServe了解http请求的处理—— HandleFunc

golang JSON webservice - nginx load balance

Go.网络篇-2

golang 简单的http服务

响应http的三种方法