Scala 返回准确响应/标题?

Scala 返回准确响应/标题?,scala,scala-dispatch,Scala,Scala Dispatch,从webapp的客户端,我找到了一个服务器端路由,它只是第三方API的包装器。使用dispatch,我试图让服务器端请求返回确切的头和第三方API对客户端AJAX调用的响应 当我这样做时: val req = host("third-pary.api.com, 80) val post = req.as("user", "pass") / "route" << Map("key" -> "akey", "val" -> "aval") Http(post > as.

从webapp的客户端,我找到了一个服务器端路由,它只是第三方API的包装器。使用dispatch,我试图让服务器端请求返回确切的头和第三方API对客户端AJAX调用的响应

当我这样做时:

val req = host("third-pary.api.com, 80)
val post = req.as("user", "pass") / "route" << Map("key" -> "akey", "val" -> "aval")
Http(post > as.String)
编辑:

这里是我正在玩的建议的或匹配示例,但是
match
语法没有意义-我不在乎是否有错误,我只想返回它。而且,我似乎无法使用此方法返回尸体

val asHeaders = as.Response { response =>
  println("BODY: " + response.getResponseBody())
  scala.collection.JavaConverters.mapAsScalaMapConverter(
    response.getHeaders).asScala.toMap.mapValues(_.asScala.toList)
}

val response: Either[Throwable, Map[String, List[String]]] =
  Http(post > asHeaders).either()

response match {
  case Left(wrong) =>
    println("Left: " + wrong.getMessage())
    // return Action with header + body
  case Right(good) =>
    println("Right: " + good)
    // return Action with header + body
}

理想情况下,解决方案返回Scalatra
ActionResult(responseStatus(状态、原因)、正文、标题)

使用Dispatch时,实际上很容易获得响应头。例如,对于0.9.4:

import dispatch._
import scala.collection.JavaConverters._

val headers: java.util.Map[String, java.util.List[String]] = Http(
   url("http://www.google.com")
)().getHeaders
例如,现在:

scala> headers.asScala.mapValues(_.asScala).foreach {
     |   case (k, v) => println(k + ": " + v)
     | }
X-Frame-Options: Buffer(SAMEORIGIN)
Transfer-Encoding: Buffer(chunked)
Date: Buffer(Fri, 30 Nov 2012 20:42:45 GMT)
...
val asHeaders = as.Response { response =>
  scala.collection.JavaConverters.mapAsScalaMapConverter(
    response.getHeaders
  ).asScala.toMap.mapValues(_.asScala.toList)
}
如果您经常这样做,最好封装它,例如:

scala> headers.asScala.mapValues(_.asScala).foreach {
     |   case (k, v) => println(k + ": " + v)
     | }
X-Frame-Options: Buffer(SAMEORIGIN)
Transfer-Encoding: Buffer(chunked)
Date: Buffer(Fri, 30 Nov 2012 20:42:45 GMT)
...
val asHeaders = as.Response { response =>
  scala.collection.JavaConverters.mapAsScalaMapConverter(
    response.getHeaders
  ).asScala.toMap.mapValues(_.asScala.toList)
}
现在您可以编写以下内容:

val response: Either[Throwable, Map[String, List[String]]] =
  Http(url("http://www.google.com") OK asHeaders).either()

还有错误检查、漂亮的不可变集合等等。

我们需要对API的失败请求的响应体,因此我们提出了以下解决方案:

使用
code
body
定义您自己的
apichttpError
类(对于正文文本):

case类apittperror(代码:Int,正文:String)
扩展异常(“意外响应状态:%d”。格式(代码))
定义
OkWithBodyHandler
,类似于
dispatch
源代码中使用的内容:

类OkWithBodyHandler[T](f:Response=>T)扩展了AsyncCompletionHandler[T]{
def未完成(响应:响应)={
if(response.getStatusCode/100==2){
f(答复)
}否则{
抛出ApiHttpError(response.getStatusCode,response.getResponseBody)
}
}
}
现在,在调用可能引发和异常的代码(调用
API
)附近,将
隐式
覆盖添加到
ToupleBuilder
(再次类似于源代码),并在
请求
上调用
OkWithBody

classmyapiservice{
隐式类MyRequestHandlerTupleBuilder(req:req){
def-OKWithBody[T](f:Response=>T)=
(要求toRequest,新OkWithBodyHandler(f))
}
def callApi(请求:Req)={
Http(请求OKWithBody为.String)
}
}
从现在起,获取
将为您提供
[Throwable,String]
(使用
as.String)
,而
Throwable
是我们的
apithttpError
主体


希望有帮助。

问题是,我不需要在左边或右边进行匹配,这就是为什么两者都没有意义。我只想从第三方返回一个响应到客户端,其标题和正文与返回到服务器端的标题和正文相同。这不是需要在
左侧
右侧
上进行匹配的问题。任何时候,即使在本地发出HTTP请求,也有可能出现问题<代码>或
提供了一种简洁明了的建模方法。如果您不想使用它,您不必使用它(参见我的第一个示例),但即使在简单的情况下,使用它也是一个非常非常好的主意。但是现在我没有指示请求是否成功或失败,或者我是否错了?对于您的编辑:我个人倾向于使用
,即使在我不关心复杂错误处理的情况下。只要写
response.right.get
就可以打开标题(冒着运行时异常的风险)。然后,当你发现自己在重复使用这些代码,并且想要一些更健壮的东西时,很容易就能准确地看到你犯了什么错。