【问题标题】:akka-http how to accept invalid URI [will not solve]akka-http 如何接受无效的 URI [未解决]
【发布时间】:2017-01-30 11:55:05
【问题描述】:

我正在开发一种服务,该服务在具有不同查询参数的一条路径上调用。我已经将路由绑定到 Http:

val route: Route = {
    get {
        pathPrefix("myRoute"){
            parameterMap{ params =>
                complete(
                   MyHandler.genExternResponse(params)
                )
            }
        }
    }

val bindingFuture = Http().bindAndHandleAsync(Route.asyncHandler(new myEndpoint().route), "localhost", 8081)

由于我对使用的参数没有任何影响,因此我无法消除包含未编码特殊字符(如德语变音符号或商标符号)的调用。 例如

www.myhost.com/myRoute?param1=asd&param2=adäöü

我知道这些 URL 无效但其中一项要求是即使带有这些字符的请求也被接受,并且我使用 URL 编码处理它们。 问题是,当我像上面那样调用服务时,akka-http 拒绝了响应状态为 400 的请求,甚至没有将其交给我的代码。 有没有一种方法可以让我自己捕获这些请求并处理它们,或者让 akka-http URL 为我编码特殊字符。

编辑: 解决不了

【问题讨论】:

  • 你能发布一个堆栈跟踪吗?
  • 不知道如何,因为打印堆栈跟踪的代码没有错误,而 akka-http 只是响应 400。
  • 会不会是MyHandler.genExternResponse 抛出异常?此处抛出的异常将转换为 400。如果将代码更改为完整(“ok”),则不会收到错误,因此不太可能是 Akka 的错
  • 不,问题是,请求甚至从未到达我的端点。即使我使用 akka-http 文档中最基本的示例,它也不会使用带有变音符号的 uri 参数
  • 嗯,很奇怪,当我尝试使用 complete("ok") 时,它确实可以正常工作

标签: scala akka akka-http


【解决方案1】:

试试这个

 val route: Route = {
  get {
    pathPrefix("myRoute"){
        parameters('params)
           { params =>
            complete(
               MyHandler.genExternResponse(params)
            )
        }
    }
}

val bindingFuture = Http().bindAndHandleAsync(Route.asyncHandler(new myEndpoint().route), "localhost", 8081)

【讨论】:

  • 很遗憾这不起作用:~ curl -i localhost:8080/myRoute\?page\=täst HTTP/1.1 400 错误请求服务器:akka-http/10.0.3 日期:2017 年 1 月 31 日,星期二10:10:18 GMT 连接:关闭内容类型:文本/纯文本; charset=UTF-8 Content-Length: 96 Illegal request-target: Invalid input 'Ã',预期的 raw-query-char 或 'EOI'(第 1 行,第 13 列)%
  • 更改参数名称 curl -i localhost:8080/myRoute?params=täst
  • 请求也没有到达我的端点。我认为 akka-http 无法从正常配置的连接中创建 HttpRequest,因为它包含非 7 位 ASCII 字符
  • 你打错了路线 curl -i localhost:8080/myRoute\?page\=täst 你应该这样打 curl -i localhost:8080/myRoute?params=täst
  • 不是 \ 转义 '?' 所必需的吗? ?如果我做同样的卷曲但使用 \?page\=test 而不是 täst 它工作正常,我可以使用参数
猜你喜欢
  • 2019-11-03
  • 2010-10-28
  • 1970-01-01
  • 2020-10-06
  • 2011-02-22
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-18
相关资源
最近更新 更多