我有一个服务定位器,它链接到外部URL。然后,我想在我的实现中invoke该服务。
这就是我的想法,在我的build.sbt中,我把我的服务的网址
lagomUnmanagedServices in ThisBuild := Map(
"Foo" -> "https://www.xxxxxx.com"
)然后,我得到了具有确切名称的服务
trait FooService extends Service {
override final def descriptor: Descriptor = {
import Service._
named("Foo")
.withCalls(
restCall(Method.POST, "/PostUrl", fooServiceCall _)
.withRequestSerializer(???)
)
.withAutoAcl(true)
}
def fooServiceCall(): ServiceCall[FooRequest, FooResponse]然后我就可以通过调用这个服务/ api来调用它了
fooService.fooServiceCall.invoke()但问题是,我发送的请求应该格式化为x-www-form-urlencoded,而不是普通的Json格式。有可能做到这一点吗?
*PS。响应仍然是普通Json格式
发布于 2020-07-02 18:19:16
只需按照Lagom documentation中的说明为FooRequest case类添加序列化即可使用x-www-form-urlencoded
第一步:为FooRequest和x-www-form-urlencoded创建协商好的序列化器和反序列化器
class FooUrlEncodedSerializer extends NegotiatedSerializer[FooRequest, ByteString] {
override val protocol = MessageProtocol(Some("application/x-www-form-urlencoded"))
// Convert your FooRequest in a ByteString following the format of urlencoded protocol
// "field1=value1;field2=value2;..."
def serialize(fooRequest: FooRequest) =
ByteString.fromString(...)
}
class FooUrlEncodedDeserializer extends NegotiatedDeserializer[FooRequest, ByteString] {
// Convert a ByteString urlencoded in a FooRequest object
def deserialize(bytes: ByteString): FooRequest = {...}
}第二步:创建要在调用中使用的MessageSerializer
class FooRequestFormUrlEncodedSerializer extends StrictMessageSerializer[FooRequest] {
override def serializerForRequest: NegotiatedSerializer[FooRequest, ByteString] = new FooUrlEncodedSerializer
override def deserializer(protocol: MessageProtocol): MessageSerializer.NegotiatedDeserializer[FooRequest, ByteString] = new FooUrlEncodedDeserializer
override def serializerForResponse(acceptedMessageProtocols: Seq[MessageProtocol]): NegotiatedSerializer[FooRequest, ByteString] = new FooUrlEncodedSerializer
}最后一步:将序列化程序添加到服务描述符中:
trait FooService extends Service {
override final def descriptor: Descriptor = {
import Service._
named("Foo")
.withCalls(
restCall(Method.POST, "/PostUrl", fooServiceCall _)
.withRequestSerializer(new FooRequestFormUrlEncodedSerializer)
)
.withAutoAcl(true)
}
def fooServiceCall(): ServiceCall[FooRequest, FooResponse]由于您希望接收作为Json的响应,因此不需要为FooResponse对象生成消息序列化程序。
https://stackoverflow.com/questions/61480362
复制相似问题