Scala 返回准确响应/标题?
从webapp的客户端,我找到了一个服务器端路由,它只是第三方API的包装器。使用dispatch,我试图让服务器端请求返回确切的头和第三方API对客户端AJAX调用的响应 当我这样做时: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.
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
就可以打开标题(冒着运行时异常的风险)。然后,当你发现自己在重复使用这些代码,并且想要一些更健壮的东西时,很容易就能准确地看到你犯了什么错。