首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将HTTP/REST请求转发给另一个REST服务器

将HTTP/REST请求转发给另一个REST服务器
EN

Stack Overflow用户
提问于 2015-01-17 00:13:25
回答 2查看 4.8K关注 0票数 9

我有许多现有的REST服务(下面是#1和#2 ),它们运行在仅在内部使用的不同端点上。现在,我想使用Spray向外部公开一些REST (API-1和API-2),因为这个外部端点还将提供一些额外的API (API-3,API-4)。

是否有一种简单/推荐的方法将外部REST请求转发到我的新端点到现有的REST端点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-17 14:02:32

听起来,您想要的是建议的proxyTo指令:

代码语言:javascript
运行
复制
path("foo") {
  get {
    proxyTo("http://oldapi.example.com")
  }
}

(或者更有可能是proxyToUnmatchedPath)。有一个问题有待解决:

https://github.com/spray/spray/issues/145

看来有人一直在研究这个问题;下面是一个喷雾器中的提交:

https://github.com/bthuillier/spray/commit/d31fc1b5e1415e1b908fe7d1f01f364a727e2593

但提交似乎还没有在主喷雾回购。您可以在问题页面上询问它的状态。

另外,下面是CakeSolutions的一篇关于如何手动执行代理的博客文章:

http://www.cakesolutions.net/teamblogs/http-proxy-with-spray

该页面上的一条评论指出,喷雾有一个名为ProxySettings的无文档的东西,并指出了对它的以下测试:

https://github.com/spray/spray/blob/master/spray-can-tests/src/test/scala/spray/can/client/ProxySpec.scala

Soumya已经在喷雾用户Google上询问了喷雾小组:

https://groups.google.com/forum/#!topic/spray-user/MlUn-y4X8RE

票数 4
EN

Stack Overflow用户

发布于 2015-01-17 15:16:39

我能够在CakeSolution博客的帮助下代理单个服务。在下面的示例中,代理在http://localhost:20000上运行,实际的REST端点在http://localhost:7001上运行。

不确定如何使用此方法代理多个服务。

我喜欢@cmbaxter使用Nginx作为代理的解决方案,但是我仍然很好奇是否有一种方法可以扩展下面的方法来在喷雾中实现它。

代码语言:javascript
运行
复制
import akka.actor.{ActorRef, Props}
import akka.io.IO
import akka.util.Timeout
import spray.can.Http
import spray.can.Http.ClientConnectionType
import spray.http.HttpResponse
import spray.routing.{RequestContext, HttpServiceActor, Route}


import scala.concurrent.duration._
import akka.pattern.ask


object ProxyRESTService {

   def main(args: Array[String]) {

   //create an actor system
   implicit val actorSystem = akka.actor.ActorSystem("proxy-actor-system")
   implicit val timeout: Timeout = Timeout(5 seconds)
   implicit val dis = actorSystem.dispatcher

   //host on which proxy is running
   val proxyHost = "localhost"
   //port on which proxy is listening
   val proxyPort = 20000

  //host where REST service is running
  val restServiceHost = "localhost"
  //port where REST service is running
  val restServicePort = 7001

  val setup = Http.HostConnectorSetup(
   proxyHost,
   proxyPort,
   connectionType = ClientConnectionType.Proxied(restServiceHost,   restServicePort)
)

IO(Http)(actorSystem).ask(setup).map {
  case Http.HostConnectorInfo(connector, _) =>
    val service = actorSystem.actorOf(Props(new ProxyService(connector)))
    IO(Http) ! Http.Bind(service, proxyHost, port = proxyPort)
}
}

}

代码语言:javascript
运行
复制
class ProxyService(connector: ActorRef) extends HttpServiceActor  {
  implicit val timeout: Timeout = Timeout(5 seconds)
  implicit def executionContext = actorRefFactory.dispatcher
  val route: Route = (ctx: RequestContext) => ctx.complete(connector.ask(ctx.request).mapTo[HttpResponse])
  def receive: Receive = runRoute(route)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27994748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档