2017-01-24 8 views
1

Я пытаюсь создать GoLang http.HandleFunc(), который будет прослушивать почтовые запросы и анализировать json-файл. Обработчик, кажется, не в состоянии, как он начинает и возвращает ошибку:Как получить http.HandleFunc() GoLang для работы без ошибок?

2017/01/24 13:35:08 listen tcp :8080: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

Я предполагаю, что это бросает фатальную ошибку.

Ниже моя функция:

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)) 

Как я могу получить этот обработчик, чтобы работать, а не получить ошибку?

+0

Ваш фрагмент кода не имеет никакого смысла; почему существует «defer res.Body.Close()« вызов »посередине в никуда»? –

+0

Эта ошибка указывает, что уже есть другой процесс или поток, прослушивающий порт. Возможно, у вас есть еще одна программа на вашем компьютере, работающая с портом '8080'? –

+0

@TimCooper Я не уверен, куда он должен идти? Какие-либо предложения? – antman1p

ответ

0

Я исправил несколько проблем с вашим кодом и сделал наилучшие предположения о недостающей информации. Вот пример рабочего кода, который будет принимать сообщение с полями «имя» и «текст»:

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)) 
} 
+0

Я не могу найти большой разницы. Я вижу, что вы добавили основную функцию и структуру, которые у меня есть. Я показывал только функцию Handler fugntion и log, а не весь мой код. – antman1p

+0

Понял. Я завершил код, чтобы запустить его и убедиться, что он работает - эта информация может сделать для лучшего вопроса. – Niko

+0

ОК, спасибо. Пожалуйста, дайте мне знать, если вы получаете ошибку. – antman1p