我正在使用
akka.http.scaladsl.model.Uri
以下网址/ GET:
http://localhost:8000/some-service/getSomething?param= {" name":" john"," street":" SOMEWHERE STREET","姓":"史密斯"}
(是json
在get/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
但我仍然无法弄明白。有什么帮助吗?
答案 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
那么就不会发生这种情况