【问题标题】:Long polling between javascript and revel golang serverjavascript和revel golang服务器之间的长轮询
【发布时间】:2016-11-09 12:52:35
【问题描述】:

我正在尝试进行 ajax 调用(使用 jquery)并在响应到达时立即呈现来自服务器的响应。在服务器中,我一准备好就发送不同的响应。如果我使用 curl 发出请求,我可以看到它们是如何在屏幕响应中逐个响应打印的。但我不能使用 jquery ajax 做类似的事情。

服务器上的代码是这样的:

flusher, ok := app.Response.Out.(http.Flusher)
if !ok {
  panic("expected http.ResponseWriter to be an http.Flusher")
}

app.Response.Out.Header().Set("Connection", "Keep-Alive")
app.Response.Out.Header().Set("Transfer-Encoding", "chunked")
app.Response.Out.Header().Set("X-Content-Type-Options", "nosniff")
fmt.Fprintf(app.Response.Out, string(JsonOffers))
flusher.Flush()

这段代码的 sn-p 正在调用一个循环。 app.Response.Outhttp.ResponseWriter

我做的请求,是一个普通的jquery.ajax函数:

  jQuery.ajax({
    url: '/ndc',
    type: "POST",
    data: ODRequest,
    success: function(offers){
      console.log( 'Offers', offers )
    },
    error: function(x,y,z){console.log("ERROR", x);}
  })

有了这个,我得到了所有的报价,但只有在处理最后一个响应时,而不是一个一个。

还有一件事......(我不知道它是否重要)在服务器控制台上我可以在每个请求中看到这一点:

server.go:2161: http: multiple response.WriteHeader calls

【问题讨论】:

  • 数据必须在 key->value 对中。在 ajax 函数内部将 data: ODRequest 重命名为 data: { control: 'ODRequest'} 并更新必要的服务器端也必须更新。还将dataType: 'json'添加到ajax函数
  • 嗨@AniketSahrawat ODRequest 是一个json对象。在服务器中,我可以获得所有字段......所以我认为现在不是这样。无论如何,谢谢。
  • 看起来你想stream数据..你可以看到卷曲打印响应,因为它是流式的。我不确定 ajax 方式,但如果不是严格要求,您可以通过 websocket 编写响应。

标签: jquery ajax go long-polling revel


【解决方案1】:

请更准确地描述该过程,您的应用程序以同样的方式工作,像这样?

js脚本应该向服务器发送请求,当收到响应时再次发送请求。

var ajaxFunc = function () {
  // handle response and again call
  ajaxFunc();
};

服务器收到请求后,必须循环运行一定的时间(可能是20-30秒),并向客户端发送更新

【讨论】:

  • 嗨@korchemkin。不......我的应用程序不能以这种方式工作。 js 必须只做一个请求(当用户点击一个按钮时)。该请求到达必须构建响应的服务器,该响应由三个块组成。这些块(通过内部处理)在它们之间具有不同的延迟,但是服务器在构建每个块后立即抛出它。在你公开的情况下,js似乎递归地调用ajax。
猜你喜欢
  • 2013-05-25
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多