我明白,如果我有:
case class Person(name: String)
Run Code Online (Sandbox Code Playgroud)
我可以用
object PersonJsonImplicits extends DefaultJsonProtocol {
implicit val impPerson = jsonFormat1(Person)
}
Run Code Online (Sandbox Code Playgroud)
并因此序列化:
import com.example.PersonJsonImplicits._
import spray.json._
new Person("somename").toJson
Run Code Online (Sandbox Code Playgroud)
但是,如果我有
trait Animal
case class Person(name: String) extends Animal
Run Code Online (Sandbox Code Playgroud)
我的代码中有一个地方
val animal = ???
Run Code Online (Sandbox Code Playgroud)
我需要序列化它,我想使用json喷雾
我应该添加哪个序列化程序我希望有类似的东西:
object AnimalJsonImplicits extends DefaultJsonProtocol {
implicit val impAnimal = jsonFormat???(Animal)
}
Run Code Online (Sandbox Code Playgroud)
也许我需要添加一些匹配器,以检查什么类型的动物,所以如果它是一个人,我会指向它但没有发现任何东西......正在阅读https://github.com/spray/spray-json 并且不明白该怎么做..
那么如何序列化这一组呢?
trait Animal
case class Person(name: String) extends Animal
Run Code Online (Sandbox Code Playgroud)
用json喷雾?
我正在使用一个简单的测试规范使用喷雾,我无法正确编译,不知道我做错了什么.我的scala版本是2.9.3并且喷涂1.0.1(更新其中任何一个都不是合适的选项).这是我的测试规范代码:
import org.specs2.mutable.Specification
import spray.testkit.Specs2RouteTest
import spray.http._
import akka.util.Duration
import java.util.concurrent.TimeUnit
import service.MyProxy
abstract class MyTestSpec extends Specification with Specs2RouteTest with MyProxy{
val duration = Duration(30, TimeUnit.SECONDS)
implicit val routeTestTimeout = RouteTestTimeout(duration)
"MyProxy" should {
"return a json for GET requests to the /api/getclass/classCode path for a regular request" in {
Get("/api/getclass/123/") ~> myRoutes~> check {
responseAs[String] must contain("classCode")
contentType === ContentTypes.`application/json`
}
}
} // end should...
} //end class
Run Code Online (Sandbox Code Playgroud)
我在运行测试时遇到此错误.
[error] C:\Users\Desktop\Project\MyTestSpec.scala:23: could not find implicit value for …Run Code Online (Sandbox Code Playgroud) 我有一个服务,它在Future中返回一个Option [ProductDoc](作为akka问)
我如何回应喷涂路线,以便有效的产品代表产品但是未知但形成良好的产品会返回404?
我希望代码填补这里的空白:
get {
path("products" / PathElement) { productID:String =>
val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]
// THE CODE THAT GOES HERE SO THAT
// IF PRODUCT.ISDEFINED RETURN PRODUCT ELSE REJECT
}
}
Run Code Online (Sandbox Code Playgroud)
我可以上班的唯一方法就是这种可憎的行为:
get {
path(PathElement) { productID:String =>
val productFuture = (productService ? ProductService.Get(productID)).mapTo[Option[ProductDoc]]
provide(productFuture).unwrapFuture.hflatMap {
case x => provide(x)
} { hResponse:shapeless.::[Option[ProductDoc], HNil] =>
hResponse.head match {
case Some(product) => complete(product)
case None => reject
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这肯定不是实现这一目标的正确方法吗?这似乎是一个非常简单的模式,必须已经被某人解决了!
我正在查看即将进入的标头,但似乎没有IP:
HttpRequest(GET,http://127.0.0.1:8080/track/check,List(Accept-Language: uk-UA,
uk, ru, en-US, en, Encoding: gzip, deflate, sdch, User-Agent: Mozilla/5.0
(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29
Safari/537.36, Accept: text/html, application/xhtml+xml, application/xml;q=0.9,
*/*;q=0.8, Connection: keep-alive, Host: 127.0.0.1:8080),EmptyEntity,HTTP/1.1)
Run Code Online (Sandbox Code Playgroud)
这是我从浏览器做的请求.基本上我在寻找:
path("check") {
get {
implicit request => {
val a = 5
}
}
} ~
Run Code Online (Sandbox Code Playgroud)
这里请求对象没有关于IP地址的任何信息.非常感谢任何帮助.谢谢.
Akka HTTP(正式名称为Spray)的一个特性是它能够自动编组和解组从json到案例类等的数据.我已经成功地使这个工作得很好.
目前,我正在尝试创建一个使用查询参数执行GET请求的HTTP客户端.代码目前看起来像这样:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/""" +
s"query?seq=${seq}" +
s"&max-mismatches=${maxMismatches}" +
s"&pam-policy=${pamPolicy}"))
Run Code Online (Sandbox Code Playgroud)
嗯,那不是那么漂亮.如果我可以传入一个包含查询参数的case类,并且让Akka HTTP自动生成查询参数,就像它对json一样.(另外,Akka HTTP的服务器端有一种解析GET查询参数的优雅方式,所以人们会认为它也会有一种优雅的方式来生成它们.)
我想做类似以下的事情:
val httpResponse: Future[HttpResponse] =
Http().singleRequest(HttpRequest(
uri = s"""http://${config.getString("http.serverHost")}:${config.getInt("http.port")}/query""",
entity = QueryParams(seq = seq, maxMismatches = maxMismatches, pamPolicy = pamPolicy)))
Run Code Online (Sandbox Code Playgroud)
只是,上述实际上并不起作用.
我想用Akka HTTP以某种方式做什么?或者我只是需要以老式的方式做事?即,显式生成查询参数,就像我在上面的第一个代码块中一样.
(我知道如果我要将其从GET更改为POST,我可能会让它更像我希望它工作,从那时起我可以从案例中自动转换POST请求的内容上课到json,但我真的不想这样做.)
Akka HTTP和Spray提供了一个authenticateOAuth2指令,但他们的文档说明了这一点
该指令不实现完整的OAuth2协议,而是通过从HTTP头中提取所需的令牌来实现它.
我也找不到任何为Akka HTTP或Spray实现OAuth2的库.有什么我想念的,或者这只是现在这些库的状态?
我有一个简单的喷雾客户端:
val pipeline = sendReceive ~> unmarshal[GoogleApiResult[Elevation]]
val responseFuture = pipeline {Get("http://maps.googleapis.com/maps/api/elevation/jsonlocations=27.988056,86.925278&sensor=false") }
responseFuture onComplete {
case Success(GoogleApiResult(_, Elevation(_, elevation) :: _)) =>
log.info("The elevation of Mt. Everest is: {} m", elevation)
shutdown()
case Failure(error) =>
log.error(error, "Couldn't get elevation")
shutdown()
}
Run Code Online (Sandbox Code Playgroud)
完整代码可以在这里找到.
我想模拟服务器的响应来测试Success和Failure案例中的逻辑.我找到的唯一相关信息是在这里,但我无法使用蛋糕模式来模拟sendReceive方法.
任何建议或例子将不胜感激.
这就是代码部分的样子
get{
respondWithMediaType(MediaTypes.`application/json`){
entity(as[HttpRequest]){
obj => complete{
println(obj)
"ok"
}
}
}
}~
Run Code Online (Sandbox Code Playgroud)
我可以将请求映射到一个spray.http.HttpRequest对象,我可以从这个对象中提取uri但我想有一种更简单的方法来解析get请求中的参数而不是手动执行.
例如,如果我的获取请求是
http://localhost:8080/url?id=23434&age=24
Run Code Online (Sandbox Code Playgroud)
我希望能够从这个请求中获得id和年龄
在远程Linux服务器上部署Scala应用程序的首选方法是什么.
这是在远程服务器上部署Scala应用程序的一种相当简单但有限的方法(非常适合快速测试不那么敏感的项目):
然后我使用nohup运行Scala应用程序,它允许您退出远程会话而不终止进程:
nohup java -jar myapp.jar> myapp.log 2> myapp.err </ dev/null&
首先,考虑到它正在使用数据库等资源,一旦它运行就停止进程的最佳方法是什么?我只是查找java进程ID并对其进行核对吗?
其次,重启时自动启动java应用程序的最佳方法是什么.我记得过去曾使用init.d,但是记得因为它是一个java应用程序而变得一些上坡.
更新:
我在这里错过了房间里的大象.我正在使用Spray库,它反过来使用Akka,因此提供了许多有趣的选项.
我在ASP.NET中使用RESTful API创建了一个服务,该服务托管在IIS中.在这个服务中,我想用Akka.NET创建一个actor系统.
在创建actor系统时:
var actorSystem = ActorSystem.Create("myActorSystem");
Run Code Online (Sandbox Code Playgroud)
抛出以下异常:
System.Web.dll中发生类型为"System.InvalidOperationException"的第一次机会异常附加信息:此时无法启动异步操作.异步操作只能在异步处理程序或模块中启动,或者在页面生命周期中的某些事件中启动.如果在执行页面时发生此异常,请确保将页面标记为<%@ Page Async ="true"%>.此异常还可能表示尝试调用"异步void"方法,该方法通常在ASP.NET请求处理中不受支持.相反,异步方法应该返回一个Task,调用者应该等待它.
actor系统本质上是一个并发系统,在actor之间交换异步消息.正如这里所解释的那样,这个actor系统无法在IIS中取消AppDomain,这可能就是为什么抛出上述异常的原因.
本文介绍如何在ASP.NET中运行后台任务.但是,我不知道如何将它用于我的actor系统,因为我无法控制可能由Akka.NET创建的后台任务的生命周期.
有没有办法使这项工作,或者我应该放弃在ASP.NET应用程序中使用actor系统的想法?
编辑:我还在Stackoverflow上看到一个关于使用Akka实现REST服务的问题.关于类似于Spray工具包的解决方案的任何建议,但欢迎为Akka.NET工作.
spray ×10
scala ×8
akka ×4
akka-http ×2
akka.net ×1
asp.net ×1
hangfire ×1
http ×1
httprequest ×1
ip-address ×1
java ×1
linux ×1
oauth-2.0 ×1
process ×1
routing ×1
scala-2.9 ×1
spray-client ×1
spray-json ×1
spray-test ×1
unit-testing ×1