Расшифровать JSON, отправленный из Javascript на сервер golang

#javascript #json #go #decode

#javascript #json #Вперед #расшифровать

Вопрос:

Я не могу расшифровать JSON, который я получаю из моего файла JavaScript (сервер, обрабатывающий запросы, написан на go)

Я использую следующий код JavaScript для отправки запроса.

 function Connect() {

var data = JSON.stringify({
    Version: "0.1",
    Action: "test",
    Data: {}
});

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState == XMLHttpRequest.DONE) {
        if(xhr.status >= 200 amp;amp; xhr.status < 300) {
            console.log(xhr.responseText);
        } else {
            console.warn(xhr);
        }
    }
};
xhr.open("Post", "http://localhost:5252", true);
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
xhr.send(data);
}
  

Насколько я прочитал, это должно сработать для отправки JSON на сервер.
Запросы принимаются моим сервером, но мне не удается их расшифровать.

 func newRequestFromJSON(jsonData io.Reader) (*Request, error) {
// Decode the JSON to the request value.
decoder := json.NewDecoder(jsonData)

var r Request
err := decoder.Decode(amp;r)
if err != nil {
    return nil, e.New(err.Error()   " at "   u.GetFile_line())
}

return amp;r, nil
}
  

Структура запроса выглядит следующим образом.

 type Request struct {
Version string
Action string
Data interface{}
}
  

И io.reader получит запрос.тело в качестве параметра. Код работает, если, например, я отправляю то же самое с помощью плагина HttpRequester из Firefox.

Я получаю ошибку EOF, и в ней говорится, что запрос равен нулю. Я думаю, что тело запроса пустое, но я не уверен в этом.

Чего мне здесь не хватает?

Комментарии:

1. Если ваш код работает в одном случае, это означает, что newRequestFromJSON работает. Пожалуйста, покажите, как вы используете эту функцию в случае сбоя.

2. проверьте вкладку сеть в браузере, чтобы просмотреть запрос. Вы должны иметь возможность просматривать часть запроса, которая будет включать полезную нагрузку.

3. В обоих случаях метод вызывается одинаково (через handlefunc, который обрабатывает входящие запросы) Я проверил вкладку «Сеть» и увидел, что там ошибка «Заблокирован запрос из разных источников» — это причина? Но почему возникает такая ошибка, поскольку все запущено на одном компьютере…

Ответ №1:

Если у кого-то такая же проблема: я, наконец, понял, какие изменения я должен сделать на своем сервере, чтобы разрешить такие запросы CORS.

 func init() {
     http.HandleFunc("/", net.HandleRequest)
}

func HandleRequest(rw http.ResponseWriter, req *http.Request) {
// Recover panics and send the error.

if origin := req.Header.Get("Origin"); origin != "" {
    rw.Header().Set("Access-Control-Allow-Origin", origin)
    rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
    rw.Header().Set("Access-Control-Allow-Headers",
        "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}

if req.Method == "OPTIONS" {
    return
}

...(normally handling real request)