【问题标题】:How do I get GoLang's http.HandleFunc() to work without error?如何让 GoLang 的 http.HandleFunc() 正常工作?
【发布时间】:2017-01-24 18:46:31
【问题描述】:

我正在尝试创建一个 GoLang http.HandleFunc() 来监听 post 请求并解析一个 json 文件。处理程序在启动时似乎失败并返回错误:

2017/01/24 13:35:08 监听 tcp :8080: bind: 每个只用一次 套接字地址(协议/网络地址/端口)通常是允许的。

我假设它抛出了一个致命错误。

下面是我的功能:

 http.HandleFunc("/", func(w http.ResponseWriter, request *http.Request) {

        //debug
        fmt.Fprintf(w, "Hello, %q", html.EscapeString(request.URL.Path))

        var m Message

        if request.Body == nil {
            http.Error(w, "Please send a request body", 400)                
            return
        }

        err := json.NewDecoder(request.Body).Decode(&m)
        if err != nil {
            http.Error(w, err.Error(), 400)
            return
        }
 })
 log.Fatal(http.ListenAndServe(":8080", nil))

如何让这个 Handler 工作而不报错?

【问题讨论】:

  • 您的代码 sn-p 没有任何意义;为什么会有一个defer res.Body.Close() 呼叫“在不知道的地方”?
  • 这个错误表明已经有另一个进程或线程在监听该端口。您的计算机上是否有另一个程序服务于端口8080
  • @TimCooper 我不确定它应该去哪里?有什么建议吗?
  • @JordanLewis 我跑了 netstat -nc TCP |找到“8080”却一无所获
  • 我想通了。处理程序继续作为 Windows 上的进程运行,直到您关闭 Eclipse 或终止该进程。执行此操作后,您可以运行处理程序而不会出错。如何让处理程序停止在代码中以进行测试?

标签: json function go handler httplistener


【解决方案1】:

我已经解决了您的代码存在的几个问题,并对缺失的信息做出了最佳猜测。以下是接受具有“名称”和“文本”字段的消息的示例工作代码:

package main

import (
  "encoding/json"
  "fmt"
  "html"
  "log"
  "net/http"
)

type Message struct {
  Name string `json:"name"`
  Text string `json:"text"`
}

func main() {
  http.HandleFunc("/", func(w http.ResponseWriter, request *http.Request) {
    fmt.Fprintf(w, "Hello, %q", html.EscapeString(request.URL.Path))

    var m Message

    if request.Body == nil {
      http.Error(w, "Please send a request body", 400)
      return
    }

    err := json.NewDecoder(request.Body).Decode(&m)
    if err != nil {
      http.Error(w, err.Error(), 400)
      return
    }

    log.Println(m)
  })

  log.Fatal(http.ListenAndServe(":8080", nil))
}

【讨论】:

  • 我找不到太大的不同。我看到您添加了我拥有的主要功能和结构。我只显示 Handler 功能和日志,而不是我的整个代码。
  • 明白。我完成了代码,以便我可以运行它并验证它是否有效 - 这些信息可能会成为一个更好的问题。
  • 好的,谢谢。如果您遇到错误,请告诉我。
  • 我没有收到错误,如上面的 cmets 所示,您必须有一个进程挂在该端口上。
猜你喜欢
  • 2018-09-04
  • 2015-05-08
  • 2020-08-27
  • 2018-06-11
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多