当前位置: 首页 > 知识库问答 >
问题:

识别Akka HttpRequest和HttpRequest?

巫马星雨
2023-03-14

当使用Akka HttpRequest将请求发送给一个actor时,我无法识别响应。actor将处理收到的每条消息,但它不知道哪个请求用于获得该响应。有什么方法可以识别每个请求并匹配响应呢?

注意:我没有服务器来再次发送请求体的任何部分。

预先感谢

import akka.actor.{ Actor, ActorLogging }
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.{ ActorMaterializer, ActorMaterializerSettings }
import akka.util.ByteString

class Myself extends Actor with ActorLogging {

import akka.pattern.pipe
import context.dispatcher

final implicit val materializer: ActorMaterializer = 
       ActorMaterializer(ActorMaterializerSettings(context.system))

def receive = {
  case HttpResponse(StatusCodes.OK, headers, entity, _) =>
    entity.dataBytes.runFold(ByteString(""))(_ ++ _).foreach { body =>
      log.info("Got response, body: " + body.utf8String)
  }
  case resp @ HttpResponse(code, _, _, _) =>
    log.info("Request failed, response code: " + code)
    resp.discardEntityBytes()
  }

}
import akka.actor.{ActorSystem, Props}
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer

object HttpServerMain extends App {

import akka.pattern.pipe

//  import system.dispatcher
implicit val system = ActorSystem()
implicit val materializer = ActorMaterializer()
// needed for the future flatMap/onComplete in the end
implicit val executionContext = system.dispatcher

val http = Http(system)

val myActor = system.actorOf(Props[MySelf])

http.singleRequest(HttpRequest(uri = "http://akka.io"))
    .pipeTo(myActor)

http.singleRequest(HttpRequest(uri = "http://akka.io/another-request"))
    .pipeTo(myActor)
Thread.sleep(2000)
system.terminate()

共有2个答案

柯骏
2023-03-14

我认为你不能直接使用pipeTo做到这一点,因为它本质上只是添加调用你的未来。一种选择是映射(请求,响应)元组,然后将其发送到actor:

val request = HttpRequest(uri = "http://akka.io")
http.singleRequest(request).map {
  response => myActor ! (request, response)
}

class Myself extends Actor with ActorLogging {
  ...
  def receive = {
    case (request, HttpResponse(StatusCodes.OK, headers, entity, _)) =>
      ...

    case (request, resp @ HttpResponse(code, _, _, _)) =>
      log.info(request.toString)
      ...
  }
}
高森
2023-03-14

您可以简单地使用 map 来转换未来,并在通过管道将其传送到 myActor 之前向其添加某种 ID(通常为此目的称为相关 ID):

http.singleRequest(HttpRequest(uri = "http://akka.io"))
    .map(x => (1, x)).pipeTo(myActor)

您需要更改模式匹配块以取补码:

case (id, HttpResponse(StatusCodes.OK, headers, entity, _)) =>

如果出于某种原因,您不能/不想更改模式匹配块,您可以使用相同的方法,但可以在已完成的请求中添加一个唯一的HTTP头(使用复制),如下所示(如果编译,则不检查):

// make a unique header name that you are sure will not be
// received from http response:
val correlationHeader: HttpHeader = ... // mycustomheader

// Basically hack the response to add your header:
http.singleRequest(HttpRequest(uri = "http://akka.io"))
    .map(x => x.copy(headers = correlationHeader +: headers)).pipeTo(myActor)

// Now you can check your header to see which response that was:
case HttpResponse(StatusCodes.OK, headers, entity, _) =>
  headers.find(_.is("mycustomheader")).map(_.value).getOrElse("NA")

与前面的选项相比,这更像是一个黑客,因为您正在修改一个响应。

 类似资料:
  • 我正在构建一个Web应用程序,并计划使用语音识别和navigator.getUserMedia进行音频输入。 我注意到我的桌面浏览器(Chrome在Mac上,v.31.0.1650.63)两次请求使用麦克风的权限。虽然这对用户来说可能有点烦人,但语音识别和音频输入似乎都可以工作。 但是,如果我在Android(Nexus 7, Android v4.4.2;Chromev31.0.1650.59)

  • 我正在尝试使用amazon rekognition和kinesis执行人脸检测和识别。我正在使用位于本地网络上的IP摄像头 根据AWS文件,我做了以下工作: 1.-在本地计算机(ubuntu 18)上。我已经使用“C生产者库”将数据发送到“Kinesis视频流”。我可以在名为“示例流”的“Kinesis视频流”中观看ip摄像机的视频 2.-我使用“EC2”服务创建了一个“t2.micro”实例。在

  • 我在设计一个可以同时录制语音和将语音转换为文本的应用程序时遇到了这个bug。我使用Google API进行语音识别部分,并使用audioRecorder对象进行录音。它没有成功,因此我转而使用onBufferReceived()来检索过程中的字节(当用户说话时)。Google API代码现在是我代码的onResults()部分,它可以在没有UI的情况下进行语音识别。 这是代码

  • 我正在做一个关于语音识别的项目,并试图使用Tkinter为我的项目创建一个GUI。。。SR部分工作得很好,但是当我将它与Tkinter集成时,它就不工作了。。。请帮忙。(我是编程新手,所以请不要介意我的代码:)) 我希望它能在标签上显示翻译后的文本,但它不能。它只会在说话后显示“说点什么”。

  • 我想知道从哪里可以开始语音识别。不是用一个库或任何相当“黑匣子”的东西,而是我想知道在哪里可以制作一个简单的语音识别脚本。我做了一些搜索,发现的不多,但我看到的是,有一些“发音”或音节的字典可以拼凑成文本。所以基本上我的问题是从哪里开始? 此外,由于这有点乐观,我也可以在我的程序中使用一个库(目前)。我看到一些语音到文本库和API只给出一个结果。这是可以的,但它是不负责任的。我目前的程序已经检查了

  • 我们计划使用Flink CEP根据一些动态模板处理大量事件。系统必须识别事件链(有时是带有条件和分组的复杂链)。模板将由用户创建。换句话说,我们必须在不接触代码的情况下创建复杂的模板。是否可以使用Apache Flink解决此问题?Filnk是否支持动态模板?