我有基于spray.io的webservice,它作为独立jar运行(我使用sbt assembly然后只是java -jar myws.jar).它与喷涂示例中的靴带非常相似,如下所示:
/** Bootstrap */
object Boot extends App {
// we need an ActorSystem to host our application in
implicit val system = ActorSystem("my-system")
// create and start our service actor
val service = system.actorOf(Props[MyServiceActor], "my-ws-service")
implicit val timeout = Timeout(10.seconds)
CLIOptionsParser.parse(args, CLIOptionsConfig()) map { config =>
// start a new HTTP server
IO(Http) ? Http.Bind(service, interface = config.interface, port = config.port)
}
}
Run Code Online (Sandbox Code Playgroud)
现在我只是在背景中运行该过程java -jar my-service "$@" &并停止 …
对于POST和PUT请求,我使用以下语法:
put {
entity(as[CaseClass]) { entity =>
returnsOption(entity).map(result => complete{(Created, result)})
.getOrElse(complete{(NotFound, "I couldn't find the parent resource you're modifying")})
}
}
Run Code Online (Sandbox Code Playgroud)
现在对于GET请求,我正在尝试做同样的事情,但我不能让它类似于我的PUT解决方案.使用GET请求执行此操作的好方法是什么?
更新:我已经使用以下hack:
(get & parameters('ignored.?)) {
//TODO find a way to do this without ignored parameters
(ingored:Option[String]) => {
returnsOption().map(result => complete(result))
.getOrElse(complete{(NotFound, "")})
}
}
Run Code Online (Sandbox Code Playgroud)
我希望类似的东西可以使用() =>或者ctx =>,但是它不会飞,因为它给编组提供了麻烦:
... could not find implicit value for evidence parameter of type spray.httpx.marshalling.Marshaller[(spray.http.StatusCodes.ClientError, String)]
}).getOrElse(ctx.complete{(NotFound, "")})
^
Run Code Online (Sandbox Code Playgroud)
可能是因为这与我使用spray-json的事实有关吗?
我想创建一个REST服务,用户帐户的路径应该以id前缀开头,但作为路径本身的一部分,但是像这样:
http://localhost:8080/profile/id2314234
Run Code Online (Sandbox Code Playgroud)
我试过玩PathMatcher,但没有成功.我如何2314234从uri中提取?
我正在制作网络抓取工具.我已经尝试过async http客户端,就像scala教程中的scala-and-akka和spray一样,但我无法让它工作.现在性能对我来说不是最重要的部分,但是后来我想在不改变库的情况下轻松提高req/s比率.
库应该能够在http标头上运行,并且不应该在dns解析时出现性能问题.什么库应该是最好的任务?
我有一个db-access我想缓存在我的akka/spray-application中.db返回Future [Option [X]].
我设置了一个lruCache并将其包装在我的db-access中.
我想要实现的是,仅缓存Option,如果它是Some(X)而不是,如果它是None.在后一种情况下,应再次从数据库中检索数据.
如果这会有所帮助,我可能会在未来失败......
到目前为止,我通过map再次从缓存中删除Option,如果它是None或者将来失败,则恢复:
cache(key) {
server.one[X](...)
}.map {
case Some(x) => Some(x)
case None => {
cache.remove(key)
None
}
}.recover {
case x => userCache.remove(key)
}
Run Code Online (Sandbox Code Playgroud)
但这非常难看,更不用说地图中的副作用等等......
先感谢您,
延
我已将Spray Client的示例代码复制到我自己的项目中,以便轻松使用它.我使用IntelliJ 13.
这是我的代码:
package mypackage
import scala.util.Success
import scala.concurrent.duration._
import akka.actor.ActorSystem
import akka.pattern.ask
import akka.event.Logging
import akka.io.IO
import spray.json.{JsonFormat, DefaultJsonProtocol}
import spray.can.Http
import spray.util._
import spray.client.pipelining._
import scala.util.Success
import scala.util.Failure
case class Elevation(location: Location, elevation: Double)
case class Location(lat: Double, lng: Double)
case class GoogleApiResult[T](status: String, results: List[T])
object ElevationJsonProtocol extends DefaultJsonProtocol {
implicit val locationFormat = jsonFormat2(Location)
implicit val elevationFormat = jsonFormat2(Elevation)
implicit def googleApiResultFormat[T :JsonFormat] = jsonFormat2(GoogleApiResult.apply[T])
}
object SprayExample extends App {
// we need an …Run Code Online (Sandbox Code Playgroud) 我有一个JSON表示(用于Web服务).JSON有很多字段.我想将Json反序列化(序列化)到案例类(案例到Json),以便我可以在Spray/Play框架中使用它.
在开始编写我的case类之前,我想知道是否有一些东西允许从一个示例Json创建一组case类.类似于如何为XML/SOAP模式创建Java类的东西.
我有(以前)REST spray.io webservice.现在,我需要在我的一个方法中生成SESSIONID以与其他一些方法一起使用.我希望它在响应标题中.
基本上,我想象逻辑如下:
path("/...") {
get {
complete {
// some logic here
// .....
someResult match {
case Some(something) =>
val sessionID = generateSessionID
session(sessionID) = attachSomeData(something)
// here I need help how to do my imaginary respond with header
[ respond-with-header ? ]("X-My-SessionId", sessionID) {
someDataMarshalledToJSON(something)
}
case None => throw .... // wrapped using error handler
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,它并不完整,我指的是respondWithHeader指令.我需要一个建议.
我有一个函数,它将采用某种类型的参数,将该参数转换为Json然后返回它.这里的问题是我的函数不能在参数上调用.toJson,因为它不知道它.
例:
def convertToJson[A](toConvert: A): JsValue =
toConvert.toJson
Run Code Online (Sandbox Code Playgroud)
这显然不起作用,但我想知道我怎么能做出类似这项工作的东西?我怎么能推广这个函数来处理我所有可序列化的案例类?我可以添加一些统一类型,允许此函数接受所有可序列化的案例类.
如果需要更多信息或需要更好的解释,请告诉我.
我试图简单地为我的case类创建一个json格式:
case class ImageRequest (inputs: Array[ImageObject])
case class ImageObject(data: Data)
case class Data(image: Image)
case class Image(url: String)
Run Code Online (Sandbox Code Playgroud)
这是隐式格式:
object ApplicationProtocol extends DefaultJsonProtocol {
lazy implicit val ImageRequestFormat = jsonFormat(ImageRequest, "inputs")
lazy implicit val ImageObjectFormat = jsonFormat(ImageObject, "data")
lazy implicit val DataFormat = jsonFormat(Data, "image")
lazy implicit val ImageFormat = jsonFormat(Image, "url")
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
> could not find implicit value for evidence parameter of type
> connectors.ClarifaiConnector.ApplicationProtocol.JF[Array[model.ImageObject]]
> [error] lazy implicit val ImageRequestFormat =
> jsonFormat(ImageRequest, "inputs") [error]
> ^ …Run Code Online (Sandbox Code Playgroud) spray ×10
scala ×9
spray-json ×2
akka ×1
caching ×1
case-class ×1
json ×1
match ×1
performance ×1
routing ×1
spray-dsl ×1
web-crawler ×1
web-services ×1