我正在尝试为我的应用程序编写一个测试用例akka-http.其中一个测试用例如下:
import akka.http.scaladsl.model.headers.RawHeader
import akka.http.scaladsl.testkit.{ ScalatestRouteTest}
import com.reactore.common.core.{CommonCoreSystem, CommonActors, BootedCommonCoreSystem}
import scala.concurrent.duration._
import com.reactore.common.feature.referencedata.{DepartmentRepository, DepartmentService, DepartmentController, DepartmentRest}
import org.scalatest.concurrent.AsyncAssertions
import org.scalatest.time.Span
import org.scalatest.{WordSpec, Matchers}
import akka.http.scaladsl.model.StatusCodes._
/**
* Created by krishna on 18/6/15.
*/
class DepartmentITTest extends WordSpec with Matchers with ScalatestRouteTest with CommonCoreSystem with CommonActors {
// override val departmentRouter = system.actorOf(Props(classOf[DepartmentService], DepartmentRepository), Constants.DEPARTMENT_ROUTER_NAME)
val deptRoute = (new DepartmentRest(departmentRouter)(DepartmentController).deptRoutes)
implicit val timeout = AsyncAssertions.timeout(Span.convertDurationToSpan(5.second))
val departmentJson = """{"id":13,"name":"ENGP22","shortCode":"ENGP2","parentDepartmentId":null,"mineId":null,"photoName":null,"isRemoved":false,"isPendingForApproval":false,"createdBy":0,"createDate":"2015-03-09 00:00:00","modifiedBy":0,"modifiedDate":"2015-03-09 00:00:00"}"""
val header = RawHeader("apiKey", "xxxxx")
"Service" should …Run Code Online (Sandbox Code Playgroud) 我正在使用akka-http 1.0,我想使用定义为的路由
def route: Route = path("") {
// start actor with requestContext
// call requestContext.complete(...) in actor with the result
}
Run Code Online (Sandbox Code Playgroud)
我该如何做到这一点?
是否有可能从Akka HTTP 动态反序列化未知长度的外部ByteString流到域对象?
我称一个无限长的HTTP端点输出一个JSON Array不断增长的端点:
[
{ "prop": true, "prop2": false, "prop3": 97, "prop4": "sample" },
{ "prop": true, "prop2": false, "prop3": 97, "prop4": "sample" },
{ "prop": true, "prop2": false, "prop3": 97, "prop4": "sample" },
{ "prop": true, "prop2": false, "prop3": 97, "prop4": "sample" },
{ "prop": true, "prop2": false, "prop3": 97, "prop4": "sample" },
...
] <- Never sees the daylight
Run Code Online (Sandbox Code Playgroud) 在我的场景中,客户端发送"再见"websocket消息,我需要在服务器端关闭先前建立的连接.
来自akka-http 文档:
通过从服务器逻辑中取消传入连接流(例如,将其下游连接到Sink.cancelled,将其上游连接到Source.empty),可以关闭连接.也可以通过取消IncomingConnection源连接来关闭服务器的套接字.
但是我不清楚如何考虑到这一点Sink并Source在协商新连接时设置一次:
(get & path("ws")) {
optionalHeaderValueByType[UpgradeToWebsocket]() {
case Some(upgrade) ?
val connectionId = UUID()
complete(upgrade.handleMessagesWithSinkSource(sink, source))
case None ?
reject(ExpectedWebsocketRequestRejection)
}
}
Run Code Online (Sandbox Code Playgroud) 我是acala和akka的新手,所以这个问题可能有点傻.
我有一节课:
case class Foo(colUNO: String, colDOS: Long)
Run Code Online (Sandbox Code Playgroud)
我有一个功能:
getById() : Future[Option[Foo]]
Run Code Online (Sandbox Code Playgroud)
我试图在akka-http路线中使用它
def main(args: Array[String]) {
implicit val actorSystem = ActorSystem("system")
implicit val actorMaterializer = ActorMaterializer()
val route = pathSingleSlash {
get {
complete {
val fut = getById()
}
}
}
Http().bindAndHandle(route,"localhost",8080)
println("server started at 8080")
Run Code Online (Sandbox Code Playgroud)
}
但错误说:
错误:(39,20)类型不匹配; 发现:scala.concurrent.Future [Option [com.cassandra.phantom.modeling.MiTabla.User]]必需:akka.http.scaladsl.marshalling.ToResponseMarshallable getById(id)
我要做什么才能归还Foo的Json?
谢谢!!
查看:http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/http/common/json-support.html 并添加以下代码:
import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json._
trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
implicit val userFormat = jsonFormat2(Foo)
}
Run Code Online (Sandbox Code Playgroud) 使用Akka-HTTP绑定对端口9000的调用时
Http().bindAndHandle(routes, "localhost", 9000)
Run Code Online (Sandbox Code Playgroud)
它开始监听端口,如'netstat -tulpn'所示
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp6 0 0 127.0.0.1:9000 :::* LISTEN
Run Code Online (Sandbox Code Playgroud)
本地可以使用此端口.但是,当我拨打远程电话时,我得到:
curl: (7) Failed to connect to 169.254.0.2 port 9000: Connection refused
Run Code Online (Sandbox Code Playgroud)
即使可以进行ping操作,也可以直接连接设备.我究竟做错了什么?
我正在编写基于Akka-HTTP的REST API.由于我是Akka和Scala的新手,我不确定在我的项目中组织代码的最佳方法是什么.我会有约.7个具有基本CRUD的不同实体.这意味着我将在API中拥有超过25条路线.我想保持路由根据它们逻辑关联的实体进行分组.有什么可能是实现这个目标的好方法?目前,我从GitHub上的一些项目中获取灵感,并将这些路线分为特征.我有一个主要特征,包括一些一般的东西,扩展指令和添加编组:
trait Resource extends Directives with JsonSupport{
...
}
Run Code Online (Sandbox Code Playgroud)
然后我有其他组织如下所示.
trait UserResource extends Resource{
def userRoutes:Route =
pathPrefix("authenticate") {
pathEndOrSingleSlash {
post {
entity(as[LoginRequest]) { request =>
...
}
}
}
}
} ~
pathPrefix("subscribe") {
pathEndOrSingleSlash {
post {
entity(as[UserSubscribeRequest]) { request =>
...
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
有一个类定义异常处理程序,实例化一些帮助程序并将路由放在一起:
class Routes extends UserResource with OtherResource with SomeOtherResource{
... handlers definitions ...
... helpers ...
def allRoutesUnified: Route =
handleErrors {
cors() {
pathPrefix("api") {
authenticateOAuth2("api", PasswordAuthenticator) …Run Code Online (Sandbox Code Playgroud) 我有一个Http Client,它在现实生活中使用代理将请求发送到API。我正在尝试使用WireMock运行我的http客户端测试并模拟API的响应。但是,我无法使Wiremock与代理设置一起使用。我已经尝试了所有相关组合,但仍然无法通过成功的测试。
我尝试了viaProxy配置,proxiedWith但是也不确定我是否正确使用它们。该文档也无济于事。
客户端代码具有以下配置:
private val httpsProxySettings: ConnectionPoolSettings =
ConnectionPoolSettings(actorSystem)
.withConnectionSettings(ClientConnectionSettings(actorSystem))
.withTransport(
ClientTransport.httpsProxy(
InetSocketAddress.createUnresolved(PROXY_HOST, PROXY_PORT)
)
)
Run Code Online (Sandbox Code Playgroud)
测试配置大致如下:
val wireMockServer = new WireMockServer(
wireMockConfig().port(API_PORT).proxyVia(PROXY_HOST, PROXY_PORT)
)
wireMockServer.start()
WireMock.configureFor("localhost", API_PORT)
wireMockServer.stubFor(
put(anyUrl())
.willReturn(
aResponse()
.withStatus(201)
// .proxiedFrom(API_HOST)
)
)
Run Code Online (Sandbox Code Playgroud) 大多数阿卡HTTP例子表明它是很容易定义Routes使用 path.
我从介绍性示例中得到以下(略微简化),
val route =
path("hello") {
complete(
HttpEntity(
ContentTypes.`text/html(UTF-8)`,
"<h1>Say hello to akka-http</h1>"))
}
Run Code Online (Sandbox Code Playgroud)
但是,上面只适用于"/ hello",我想匹配所有可能的路径或URL,而不仅仅是"你好".空字符串""仅匹配根路径并"*"与文字路径"/*"匹配.参数to path是必需的,不能简单地省略.
我有一个用例,我使用 GET 请求从 URL 下载文件。是否可以在不保存到磁盘或将整个对象保存在内存中的情况下计算文件流的 SHA256?
akka-http ×10
scala ×9
akka ×3
akka-stream ×3
json ×2
akka-testkit ×1
architecture ×1
http ×1
http-proxy ×1
port ×1
routes ×1
wiremock ×1