标签: spray

如何使用jsonspray序列化具有特征的case类

我明白,如果我有:

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 spray spray-json

17
推荐指数
1
解决办法
1万
查看次数

如何在测试规范中修复参数ta:TildeArrow的缺失隐式值

我正在使用一个简单的测试规范使用喷雾,我无法正确编译,不知道我做错了什么.我的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)

routing scala scala-2.9 spray spray-test

17
推荐指数
2
解决办法
3622
查看次数

喷涂路由404响应

我有一个服务,它在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)

这肯定不是实现这一目标的正确方法吗?这似乎是一个非常简单的模式,必须已经被某人解决了!

scala akka spray

16
推荐指数
1
解决办法
5321
查看次数

如何在Spray框架中获取传入的IP地址

我正在查看即将进入的标头,但似乎没有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地址的任何信息.非常感谢任何帮助.谢谢.

scala http ip-address akka spray

16
推荐指数
2
解决办法
3864
查看次数

使用Akka HTTP查询GET请求的参数(正式名称为Spray)

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 spray akka-http

16
推荐指数
1
解决办法
9765
查看次数

使用akka-http执行OAuth2身份验证的最佳方法是什么?

Akka HTTP和Spray提供了一个authenticateOAuth2指令,但他们的文档说明了这一点

该指令不实现完整的OAuth2协议,而是通过从HTTP头中提取所需的令牌来实现它.

我也找不到任何为Akka HTTP或Spray实现OAuth2的库.有什么我想念的,或者这只是现在这些库的状态?

scala oauth-2.0 spray akka-http

16
推荐指数
1
解决办法
2821
查看次数

如何模拟喷涂客户端响应

我有一个简单的喷雾客户端:

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)

完整代码可以在这里找到.

我想模拟服务器的响应来测试SuccessFailure案例中的逻辑.我找到的唯一相关信息是在这里,但我无法使用蛋糕模式来模拟sendReceive方法.

任何建议或例子将不胜感激.

unit-testing scala spray spray-client

15
推荐指数
2
解决办法
5212
查看次数

如何在喷涂路由中解析获取请求参数?

这就是代码部分的样子

    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和年龄

scala httprequest akka spray

14
推荐指数
1
解决办法
1万
查看次数

在远程服务器上部署,启动和停止Scala应用程序

在远程Linux服务器上部署Scala应用程序的首选方法是什么.

这是在远程服务器上部署Scala应用程序的一种相当简单但有限的方法(非常适合快速测试不那么敏感的项目):

  1. 从远程服务器我从git中提取源代码
  2. 使用sbt-assembly插件我在服务器上构建一个jar
  3. 然后我使用nohup运行Scala应用程序,它允许您退出远程会话而不终止进程:

    nohup java -jar myapp.jar> myapp.log 2> myapp.err </ dev/null&

首先,考虑到它正在使用数据库等资源,一旦它运行就停止进程的最佳方法是什么?我只是查找java进程ID并对其进行核对吗?

其次,重启时自动启动java应用程序的最佳方法是什么.我记得过去曾使用init.d,但是记得因为它是一个java应用程序而变得一些上坡.

更新:

我在这里错过了房间里的大象.我正在使用Spray库,它反过来使用Akka,因此提供了许多有趣的选项.

java linux scala process spray

13
推荐指数
1
解决办法
4421
查看次数

ASP.NET中的Akka.NET actor系统

我在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工作.

asp.net spray akka.net hangfire

13
推荐指数
2
解决办法
5770
查看次数