Akka:无效的URI

时间:2016-08-22 14:22:02

标签: scala akka

我正在使用

akka.http.scaladsl.model.Uri

以下网址/ GET:

http://localhost:8000/some-service/getSomething?param= {" name":" john"," street":" SOMEWHERE STREET","姓":"史密斯"}

(是jsonget/query参数中)

但我得到了:

akka.http.scaladsl.model.IllegalUriException: Illegal URI reference: Invalid input ' ', expected raw-query-char, '#' or 'EOI'

我无法弄清楚该网址的错误。我在这里阅读使用的RFC规范:

http://tools.ietf.org/html/rfc3986#section-4.1

但我仍然无法弄明白。有什么帮助吗?

1 个答案:

答案 0 :(得分:5)

正如我在评论中提到的,你需要url endode json,以便根据RFC规范,带有查询参数的完整url是有效的。首先,让我们再次展示什么是破碎的。考虑一下你有这个代码:

//our root app component
import {Component, NgModule, OnInit} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

const window: any = {};

@Component({
selector: 'my-app',
template: `
  <div id="boolean"><p id="bv">1</p></div>
  <div id="numeric"><p id="nv">2</p></div> 
  <div id="string"><p id="sv">3</p></div> 
  <div id="enum"><p id="ev">4</p></div>
  `
})
export class App implements OnInit {
  ngOnInit() {
    changeValue();
  }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

这是构建Akka val json = """{"foo":"some foo"}""" val baseUri = "http://some.host.com:8080/test" val akkaUri = Uri(s"$baseUri/?json=$json") 的一种方法,但是这种方式将被破坏并抛出异常,因为查询参数未正确编码。如果您将代码更改为此代码,那么事情就会起作用:

Uri

通过使用val akkaUri = Uri(baseUri).withQuery(Uri.Query(Map("json" -> json))) ,您允许Akka Http框架正确地对params进行编码,如果您只是从完整的uri字符串构造withQuery那么就不会发生这种情况