【问题标题】:Does http have to be a request/response protocol?http 必须是请求/响应协议吗?
【发布时间】:2017-03-07 22:51:58
【问题描述】:

我要问一个哀伤的问题。我知道http通常是请求响应。可以请求完成吗?

我们有一种情况,我们希望将 ajax 调用发送到一个服务器,然后在完成后将表单发布到另一台服务器。我们不能在不协调它们的情况下同时发送它们,因为帖子会使浏览器导航到另一台服务器,并且我们失去了上下文。

当我目前正在做的是做第一个ajax调用,然后在它的回调中,我正在做document['order-form'].submit()。我的老板指出,如果 ajax 调用有一段时间没有完成,用户会看到他的浏览器没有进展,即使它仍然响应。他希望我在 ajax 调用上设置一个合理的超时时间。

但实际上,ajax 调用是一个“不错但没有必要”的东西。如果我们可以发送它并忘记它,我的老板会同样高兴。

我在为 Google 制定合适的查询时遇到了很多麻烦。 “像 UDP 一样使用 HTTP”不起作用。很多事情都行不通。是时候问问人类了。

【问题讨论】:

  • 正如你所说“我的老板指出,如果有一段时间没有完成 ajax 调用,用户会看到他的浏览器没有进展,即使它仍然是响应式的。”所以为什么不添加一个 UI 元素——比如可以向用户显示的进度条或旋转轮——浏览器在等待 AJAX 返回时仍在酝酿一些东西。同样据我了解 HTTP,因为它基于客户端 - 服务器范式是基于请求 - 响应并且是无状态的 (tools.ietf.org/html/rfc7230#section-2.1)
  • 表达“我正在工作”的 UI 元素肯定会有所改进。我还是宁愿发送一个 udp 数据包然后忘记它。

标签: ajax http xmlhttprequest


【解决方案1】:

如果您查看 ISO-OSI 网络模型,HTTP 是应用层协议,而 UDP 位于传输层。 HTTP 通常使用 TCP,很少使用 UDP。然而,RTP(实时传输协议)使用 UDP 并用于媒体流。还有一件事,UDP 不会保证 100% 传输,而 TCP 会尝试(当检测到数据包丢失时,TCP 会尝试重新传输)。所以我们预计UDP会下降。因此,当您说 - 触发并忘记 - 当您的数据包无法到达时会发生什么?

所以我猜你对 UDP 和 HTTP 感到困惑(如果不是这种情况,我很抱歉,因为我现在还不知道 HTTP 使用 UDP 来处理网页确实存在一些问题)

恕我直言,协调这样的异步过程的最佳方法是像您当前编写的那样进行 AJAX 调用(如果需要,启用 CORS),再加上智能显示进度的良好 UI/UX 前端/状态给最终用户。

另外 - 也许我们可以调整使 AJAX 响应变慢的过程。说应该返回数据的 DB 调用可以调整一下。

【讨论】:

  • 是的,就是这样。如果数据包无法到达,哦,好吧。我们没有得到这些数据。 // 这就是我的朋友和同事所说的:“除非您发出 getRequests,否则不需要响应。OPTIONS(Preflight)、PUT 或 POST 不一定需要发送回响应头才能使用。”他是对的吗?我想我不会有 xhr.onload 或 xhr.ontimeout 函数。
  • 我不完全理解你同事的说法,但我想你不担心 AJAX 调用会响应什么?那么 - 那么为什么不尝试类似于此链接中答案的功能块 - stackoverflow.com/questions/35776803/…
  • 有趣。我想知道当请求完全发出但尚未收到响应时是否会发出事件。我不认为 beforeSend 是它。 "beforeSend,在 Ajax 请求启动之前触发,......"
  • 如果我知道请求何时结束(可能是请求正文中的一个大文件),我可以继续下一步,包括导航到另一个页面。
【解决方案2】:

埃里克·比德尔曼是这样说的:

// Listen to the upload progress.
  var progressBar = document.querySelector('progress');
  xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
      progressBar.value = (e.loaded / e.total) * 100;
      progressBar.textContent = progressBar.value; // Fallback for unsupported browsers.
    }
  };

我认为这有一个答案。 1)我们可以找出请求何时完全消失。 2) 我们可以选择不为响应设置处理程序。

一旦您被告知请求已发出,您就可以进行下一步,包括导航到另一个页面。

不过,我不确定有多少浏览器支持xhr.upload.onprogress

【讨论】:

    【解决方案3】:

    如果某事值得做,那么肯定值得知道您的要求是否已完成。否则你怎么能调试问题,或提供任何良好的用户体验?

    响应是任何类型的响应,它不需要携带消息体。一个简单的 204 响应可能表明某事成功,而 403 或 401 可能需要更多操作。

    【讨论】:

      【解决方案4】:

      我想我已经找到了答案。它非常简单。在所有浏览器上都很好。

      只需将 xhr.timeout = 100; 添加到您的 ajax 调用中。如果服务器需要整整一秒钟的时间来响应,那么您不在乎。您已经在 1/10 秒处继续前进。

      所以在我的情况下,我将document['order-form'].submit() 放在我的超时处理程序中。当浏览器离开时,我确信请求已经完成。

      不使用任何深奥的协议知识或任何最近的创新。

      【讨论】:

        猜你喜欢
        • 2015-06-22
        • 2012-06-08
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-23
        相关资源
        最近更新 更多