Клиент golang websocket, закрытие соединения после получения результата

Как я могу реализовать такой сценарий:

1.У меня есть LoginHandler, который получает некоторые пользовательские данные - электронную почту и подписанный XML:

func LoginHandler(c *gin.Context) {
    var (
        err  error
        data LoginPost
    )
    if err = c.BindJSON(&data); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"status": "error"})
        return
    }

    ...

    c.JSON(http.StatusOK, gin.H{"status": "ok"})
}

2. Мне нужно отправить подписанный XML на другой сервер через веб-сокет.

3. сохранить результат (успех или ошибка)

4. закрыть соединение

Каждый HTTP-запрос открывает соединение, отправляет 1 сообщение, получает 1 результат и, наконец, закрывает сокет. Я пытался с каналом, но безуспешно. Возможно ли это реализовать в моем случае?

ОБНОВЛЕНИЕ

package main

import (
    "log"
    "net/url"

    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
    "net/http"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
    message := r.FormValue("message")
    w.Write([]byte(message))
}

func postHandler(w http.ResponseWriter, r *http.Request) {
    var (
        message = r.FormValue("message")
        u = url.URL{Scheme: "ws", Host: "echo.websocket.org", Path: "/"}
        err error
        out []byte
        conn *websocket.Conn
    )
    log.Printf("message: %s\n", message)
    log.Printf("connecting to %s\n", u.String())
    conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    log.Println("write")
    if err = conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
        log.Fatal("write:", err)
    }
    log.Println("read")
    if _, out, err = conn.ReadMessage(); err != nil {
        log.Fatal("read:", err)
    }
    w.Write(out)
    log.Println("close")
    conn.Close()
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", indexHandler).Methods("GET")
    r.HandleFunc("/post", postHandler).Methods("POST")
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

person Daniyar Baitursynov    schedule 05.10.2017    source источник
comment
Можете ли вы сменить другой сервер? Веб-сокеты не кажутся подходящими для этой ситуации.   -  person Gavin    schedule 05.10.2017
comment
Наберите соединение, написать сообщение, прочтите сообщение, а затем закройте соединение. Нет необходимости использовать каналы. Покажи, что ты пробовал до сих пор.   -  person Cerise Limón    schedule 05.10.2017
comment
Я пробовал пример из github.com/gorilla/websocket/blob/ мастер / примеры / эхо /. Но они слушают, пока не будет получен сигнал прерывания, а затем закрывают соединение. Как я могу переписать этот пример без каналов и операторов выбора?   -  person Daniyar Baitursynov    schedule 05.10.2017


Ответы (1)


Позвоните Наберите, WriteMessage, ReadMessage и Закрыть последовательно.

c, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
    // handle error
}
err := c.WriteMessage(websocket.TextMessage, signedXML)
if err != nil {
     // handle error
}
_, p, err := c.ReadMessage()
if err != nil {
     // handle error
}
c.Close()

// p is a []byte with the first received message.
person Cerise Limón    schedule 05.10.2017
comment
Я тестировал приведенный выше код (ОБНОВЛЕНИЕ *), и он зависает после conn.ReadMessage() - person Daniyar Baitursynov; 05.10.2017
comment
Код в обновлении у меня работает. curl -d message=hello http://localhost:8080/post печатает hello. - person Cerise Limón; 06.10.2017