【问题标题】:Decode JSON sent from Javascript to golang server解码从 Javascript 发送到 golang 服务器的 JSON
【发布时间】:2016-10-20 17:50:59
【问题描述】:

我无法解码从我的 JavaScript 文件中获取的 JSON(处理请求的服务器是用 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 && 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(&r)
if err != nil {
    return nil, e.New(err.Error() + " at " + u.GetFile_line())
}

return &r, nil
}

Request 结构如下所示。

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

io.reader 获取 request.body 作为参数。该代码适用于例如我使用 firefox 的 HttpRequester 插件发送相同的内容。

我收到一个 EOF 错误,它说请求为零。我认为请求的正文是空的,但我不确定。

我在这里错过了什么?

【问题讨论】:

  • 如果您的代码在一种情况下有效,则意味着 newRequestFromJSON 有效。请说明在失败的情况下您是如何使用该功能的。
  • 检查浏览器中的网络选项卡以查看请求。您应该能够查看请求部分,其中将包含有效负载。
  • 在这两种情况下,方法的调用方式相同(通过处理传入请求的句柄函数)我检查了网络选项卡,发现有一个“跨源请求被阻止”错误 - 这就是原因?但是为什么会出现这样的错误,因为一切都在同一台机器上运行...

标签: javascript json go decode


【解决方案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)

【讨论】:

    猜你喜欢
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多