0

我是scala和spray的新手。我能够中止来自 reactJS 的请求。并且它在浏览器控制台的网络选项卡中显示请求被取消。但是从 scala 开始,它并没有中止。在日志中我可以看到 api 被击中。对于 Rest API,我在 scala 中使用喷雾。这是我的 reactJS 代码:

    new Promise((accept, _reject) => {
    fetch("/api/complete", {
      method: "post",
      signal: controller.signal,
      headers: {
        Accept: "application/json",
        "Content-Type": "application/json"
      },
      body: JSON.stringify(requestBody)
    })

Ans 这是我的 scala 代码:

pathPrefix("complete") {
    post {
        entity(as[completeRequest]) { completeRequest =>
            complete {
                    completeService()
            }
        }
    }
}

def completeService(): Future[HttpResponse] = {

    val pipeline: HttpRequest => Future[HttpResponse] = sendReceive ~> unmarshal[HttpResponse]
    val response: Future[HttpResponse] = pipeline(Post(someremoteUrl.concat("complete"), botCompleteRequest)
      ~> addHeader("demo", "test"))
    response
}

那么当它从 reactJS/promise 中止时如何中止这个完整的请求

4

1 回答 1

0

简短的回答:你没有。

客户端是否是 React(或 Angular 或 jQuery)并不重要,而服务器端(scala、PHP、.NET)是什么并不重要。

重要的是HTTP客户端和服务器之间的关系。

在 HTTP 中,您不能“捕获”已经发送的请求。js/browser 中的 abort 函数几乎只意味着它将忽略响应。一旦请求发送并在网络中,它将到达服务器,服务器将处理它。服务器永远不会收到客户端取消请求的通知。

这个问题和答案很好地涵盖了这个主题:https ://softwareengineering.stackexchange.com/questions/362187/can-a-caller-abort-an-execution-of-code-invoked-by-http-request

于 2020-03-04T15:26:27.820 回答