Scala 将Akka HTTP重定向到HTTPS

Scala 将Akka HTTP重定向到HTTPS,scala,https,akka-http,Scala,Https,Akka Http,目前我有一个适用于HTTP和HTTPS的API,但我需要它只路由到HTTPS,即使URL是使用HTTP调用的。例如,两者都在发挥作用: http://app1_0.cloud.example.net/getSomething https://app1_0.cloud.example.net/getSomething Akka文档中有关于为证书添加httpscontext的内容,但我不确定是否需要这样做,因为我已经有了HTTPS。这是调用它的路由的位置: Http().bindandhold(a

目前我有一个适用于HTTP和HTTPS的API,但我需要它只路由到HTTPS,即使URL是使用HTTP调用的。例如,两者都在发挥作用:

http://app1_0.cloud.example.net/getSomething
https://app1_0.cloud.example.net/getSomething
Akka文档中有关于为证书添加
httpscontext
的内容,但我不确定是否需要这样做,因为我已经有了HTTPS。这是调用它的路由的位置:

Http().bindandhold(aliveResponse~路由、主机、端口)

主机
端口
application.conf
中定义

有没有办法只添加重定向或强制转换以确保它发送到HTTPS

路线示例:

def marketsRoute = {
   pathPrefix("markets") {
     pathEnd{
       logRequestResult("Read markets", akka.event.Logging.InfoLevel) {
       get {
            implicit val timeout = Timeout(20, TimeUnit.SECONDS)

         val sitesResp = WaitListDAO.getMarkets
         complete(HttpResponse( entity = HttpEntity(MediaTypes.`application/json`, sitesResp.toJson.toString)))

         }
        }
      }
     }
    }
   }
我们来尝试一下答案:

def marketsRoute = {
    scheme("http") {
      extract(_.request.uri) { uri =>
        redirect( uri.withScheme("https"),
          StatusCodes.MovedPermanently
        )
      }
    } ~
   pathPrefix("markets") {
     pathEnd{
       logRequestResult("Read a waitlist enable markets", akka.event.Logging.InfoLevel) {
       get {
            implicit val timeout = Timeout(20, TimeUnit.SECONDS)

         val sitesResp = WaitListDAO.getMarkets
         complete(HttpResponse( entity = HttpEntity(MediaTypes.`application/json`, sitesResp.toJson.toString)))

         }
        }
      }
     }
    }
   }

除非HTTPS服务器也在同一个应用程序中被绑定和处理,否则您不需要定义
HttpsConnectionContext

HTTPS重定向的路由(摘自此相关文件)应如下所示:

val route =
  scheme("http") {
    extract(_.request.uri) { uri =>
      redirect( uri.withScheme("https").withAuthority(hostName, portHttps),
        StatusCodes.MovedPermanently
      )
    }
  }

请注意,如果您使用的是标准HTTPS端口(即443),则不需要
.withAuthority()

这是否回答了您的问题?不,我不这么认为。正如我在最初的问题中所说的,我不认为我需要答案所依赖的httpsContext。明白了,我只是添加了一条路线作为示例,所以我需要添加您在那里添加的内容?好吧,真的只需添加方案,然后在重定向后完成吗?@Kooky_Lukey,类似于链接博客文章中的示例代码,您可以使用tilde组合器(即
~
)简单地链接其他路由/路径匹配器(如果有)。