Javascript 如何在golang中接收jsonp请求

Javascript 如何在golang中接收jsonp请求,javascript,jquery,go,jsonp,Javascript,Jquery,Go,Jsonp,我使用jquery以jsonp格式发送一些数据: console.log(data.location.lng); console.log(data.location.lat); console.log(data.accuracy); var urlgr = "http://127.0.0.1:9220/geo/rec_geo/"; var pfg = { //lo: data.location.lng, lo: 1.0, //la: data.location.lat,

我使用jquery以jsonp格式发送一些数据:

console.log(data.location.lng);
console.log(data.location.lat);
console.log(data.accuracy);
var urlgr = "http://127.0.0.1:9220/geo/rec_geo/";
var pfg = {
    //lo: data.location.lng,
    lo: 1.0,
    //la: data.location.lat,
    la: 2.0,
    //ac: data.accuracy,
    ac: 3,
};
$.ajax({
    type: 'GET',
    url: urlgr,
    crossDomain: true,
    data: JSON.stringify(pfg),
    dataType: 'jsonp',
    contentType: "application/json; charset=utf-8",
    success: function (data) {
        console.log("data rec geo");
        console.log(data);

    }
});
这是我在golang的代码以接收它:

type geoData struct {
    Long float32 `json:"lo"`
    Lat   float32  `json:"la"`
    Accuracy  int `json:"ac"`
}

func recordGeo(w http.ResponseWriter, r *http.Request) {
    s := strings.Split(r.RemoteAddr, ":")
    ip := s[0]
    Info.Println("4")
    var geoRec geoData
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&geoRec)
    fmt.Println("geoRec")
    fmt.Println(geoRec)
    checkErr(err)
}
但我有一个EOF错误:

2017/07/01 07:16:22 http: panic serving 127.0.0.1:50680: EOF
所以我的问题是如何在golang中正确地接收jsonp请求并将其解析为结构

以下是我在golang服务器端收到的请求:

GET /geo/rec_geo/?callback=jQuery31108538596418163691_1498913991164&{%22lo%22:1,%22la%22:2,%22ac%22:3}&_=1498913991166 HTTP/1.1
Host: 127.0.0.1:9220
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36
accept-encoding: gzip, deflate, sdch, br
accept-language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
referer: http://localhost:8080/
cookie: csrftoken=Y7WA181u22l9sScw9UbPxM38wCGQzjaLMMysAesJSWZm89Pj6CCdBkEF01ibpUjW
alexatoolbar-alx_ns_ph: AlexaToolbar/alx-4.0.1
connection: keep-alive
编辑删除了以下内容: 信息打印行 但我仍然有同样的错误


谢谢

JSONP
是从服务器接收数据,而不是相反

您可以阅读更多关于JSONP-和的信息

实际上,它不是特定于Go语言的,您可以在任何服务器端编程中实现JSONP处理


出于您的目的,似乎需要来自JavaScript/Jquery的JSON Post请求。而且在路上你会做什么-

func recordGeo(w http.ResponseWriter, req *http.Request) {
    decoder := json.NewDecoder(req.Body)
    var geoRec geoData
    if err := decoder.Decode(&geoRec); err != nil {
        fmt.Println(err)
    }
    defer req.Body.Close()
    fmt.Println(geoRec)
}

JSONP
是从服务器接收数据,而不是相反

您可以阅读更多关于JSONP-和的信息

实际上,它不是特定于Go语言的,您可以在任何服务器端编程中实现JSONP处理


出于您的目的,似乎需要来自JavaScript/Jquery的JSON Post请求。而且在路上你会做什么-

func recordGeo(w http.ResponseWriter, req *http.Request) {
    decoder := json.NewDecoder(req.Body)
    var geoRec geoData
    if err := decoder.Decode(&geoRec); err != nil {
        fmt.Println(err)
    }
    defer req.Body.Close()
    fmt.Println(geoRec)
}

您的
golang
代码中有问题,以下几行:

decoder := json.NewDecoder(r.Body)
Info.Println(r.Body)
err := decoder.Decode(&geoRec)
Info.Println
decoder.Decode
都是从请求体读取的,请求体是一个
io.Reader
。执行
Info.Println
后,读卡器处于
EOF
状态。从这一点开始,任何进一步的
读取
都将导致
EOF
错误,即您在应用程序中看到的错误。如果删除(注释掉)
Info.Println
,则可以将数据解码到结构中

编辑:
我忘记了,也没有注意到JSONP是
GET
request。JSON数据嵌入到查询中。尝试以下方法提取JSON数据(请根据需要进行调整)

如果在客户端将数据设置为
data:pfg
(不带
JSON.stringify
),那么在服务器端,每个参数都可以通过查询参数访问:

//
lon := queries.Get("lo")
lat := queries.Get("la")
acc := queries.Get("ac")
或者,如果将AJAX请求数据设置为
数据:“mydata=“+JSON.stringify(pfg)
,则可以将数据提取为:

mydata := queries.Get("mydata")
dec := json.NewDecoder(bytes.NewBufferString(mydata))
err := dec.Decode(&geoRec)

处理后,需要向客户端发送正确的JSONP响应,即
回调(数据)

您的
golang
代码中有一个问题,如下几行:

decoder := json.NewDecoder(r.Body)
Info.Println(r.Body)
err := decoder.Decode(&geoRec)
Info.Println
decoder.Decode
都是从请求体读取的,请求体是一个
io.Reader
。执行
Info.Println
后,读卡器处于
EOF
状态。从这一点开始,任何进一步的
读取
都将导致
EOF
错误,即您在应用程序中看到的错误。如果删除(注释掉)
Info.Println
,则可以将数据解码到结构中

编辑:
我忘记了,也没有注意到JSONP是
GET
request。JSON数据嵌入到查询中。尝试以下方法提取JSON数据(请根据需要进行调整)

如果在客户端将数据设置为
data:pfg
(不带
JSON.stringify
),那么在服务器端,每个参数都可以通过查询参数访问:

//
lon := queries.Get("lo")
lat := queries.Get("la")
acc := queries.Get("ac")
或者,如果将AJAX请求数据设置为
数据:“mydata=“+JSON.stringify(pfg)
,则可以将数据提取为:

mydata := queries.Get("mydata")
dec := json.NewDecoder(bytes.NewBufferString(mydata))
err := dec.Decode(&geoRec)

处理后,需要向客户端发送正确的JSONP响应,即
回调(数据)

我遇到了同样的问题。然后我找到了echo框架(即
github.com/labstack/echo
包及其中间件),它可以完美地处理jsonp请求。这是演示


希望这能有所帮助。

我也遇到过同样的问题。然后我找到了echo框架(即
github.com/labstack/echo
包及其中间件),它可以完美地处理jsonp请求。这是演示


希望这能有所帮助。

即使删除info.Println,我仍然有相同的EOF错误…@user462794要调试,在
recordGeo
函数之后,使用读取请求正文的内容,然后将其打印到控制台并发布到此处。@user462794我已经编辑了答案,请看一看附近的fmt.Sprintf而不是fmt.Printfend@spekary非常感谢。答案被修改。即使删除了info.Println,我仍然有相同的EOF错误…@user462794要调试,就在
recordGeo
函数之后,使用读取请求正文的内容,然后将其打印到控制台并发布在这里。@user462794我已经编辑了答案,请看一看附近的fmt.Sprintf而不是fmt.Printfend@spekary非常感谢。答案被修改了。