отправка javascript запроса API на golang сервер на другом порту - PullRequest
0 голосов
/ 21 июня 2020

Я новичок в API для отдыха с использованием golang. Я пытаюсь отправить данные JSON с помощью javascript выборки на сервер golang, работающий на порту 8080, веб-сайт работает на другом порт на локальном хосте. всякий раз, когда я отправляю данные, я получаю сообщение об ошибке, я думаю, что это связано с COR, но я не знаю, как это исправить, вот код

main. go

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "github.com/gorilla/mux"
    gosocketio "github.com/graarh/golang-socketio"
    "github.com/graarh/golang-socketio/transport"
)

type TxData struct {
    To    string
    From  string
    Value int
    Key   string
}

func createeWsSocketServer() *gosocketio.Server {
    return gosocketio.NewServer(transport.GetDefaultWebsocketTransport())
}

func transactionHandler(w http.ResponseWriter, r *http.Request) {
    (w).Header().Set("Access-Control-Allow-Origin", "*")
    fmt.Fprintf(w, "transactionHandler Hit")
    fmt.Println("endpoint hit")
    var t TxData

    decoder := json.NewDecoder(r.Body)
    fmt.Println("response BOdy:", decoder)
    err := decoder.Decode(&t)

    if err != nil {
        panic(err)
    }

    fmt.Printf("%+v", t)
}

func handleRequests() {
    wsServer := createeWsSocketServer()
    wsServer.On(gosocketio.OnConnection, func(c *gosocketio.Channel) {
        c.Join("room")
        wsServer.BroadcastToAll("serverEvent", "New Client Joined!")
    })

    wsServer.On("clientEvent", func(c *gosocketio.Channel, msg string) string {
        c.BroadcastTo("room", "roomEvent", msg)
        return "returns OK"
    })

    myRouter := mux.NewRouter().StrictSlash(true)
    myRouter.Handle("/", http.FileServer(http.Dir("./static")))
    myRouter.Handle("/socket.io/", wsServer)
    myRouter.HandleFunc("/transaction", transactionHandler)
    log.Panic(http.ListenAndServe(":8080", myRouter))
}

func main() {
    handleRequests()
}

index. html (сервер на локальном хосте: 5050)

function postData(fileString) {
        let Body = {};
        Body.key = fileString;
        Body.to = document.getElementById("to").value;
        Body.from = document.getElementById("from").value;
        Body.amount = document.getElementById("amount").value;
        console.log(Body);

        fetch("http://localhost:8080/transaction", {
          method: "POST",
          headers: {
            "Content-Type": "application/json",
          },

          body: JSON.stringify(Body),
        }).then((resp) => {
          console.log(resp);
        });
      }

отображается ошибка:

net/http.(*conn).serve.func1(0xc0002a80a0)
        c:/go/src/net/http/server.go:1772 +0x140
panic(0x7816a0, 0xc000040040)
        c:/go/src/runtime/panic.go:973 +0x3a4
main.transactionHandler(0x874940, 0xc0001402a0, 0xc000144500)
        C:/Users/emman/Desktop/testing/main.go:35 +0x448
net/http.HandlerFunc.ServeHTTP(0x807e88, 0x874940, 0xc0001402a0, 0xc000144500)
        c:/go/src/net/http/server.go:2012 +0x4b
github.com/gorilla/mux.(*Router).ServeHTTP(0xc000138000, 0x874940, 0xc0001402a0, 0xc000144300)
        C:/Users/emman/go/src/github.com/gorilla/mux/mux.go:210 +0xe9
net/http.serverHandler.ServeHTTP(0xc000140000, 0x874940, 0xc0001402a0, 0xc000144300)
        c:/go/src/net/http/server.go:2807 +0xaa
net/http.(*conn).serve(0xc0002a80a0, 0x8750c0, 0xc00001e400)
        c:/go/src/net/http/server.go:1895 +0x873
created by net/http.(*Server).Serve
        c:/go/src/net/http/server.go:2933 +0x363
exit status 2

1 Ответ

0 голосов
/ 21 июня 2020

Кажется, что полезная нагрузка, которую вы публикуете из javascript, имеет поле Body.amount, тогда как ваша структура TxData в Go имеет Value int.

Если вы не предоставляете json теги, декодер ищет поле JSON, названное в честь структуры один (value), и терпит неудачу, потому что вы предоставляете вместо него amount.

Попробуйте следующее:

type TxData struct {
    To    string `json:"to"`
    From  string `json:"from"`
    Value int    `json:"amount"`
    Key   string `json:"key"`
}
...