首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lagom -如何发布x-www-form-urlencoded

Lagom -如何发布x-www-form-urlencoded
EN

Stack Overflow用户
提问于 2020-04-28 20:38:00
回答 1查看 111关注 0票数 0

我有一个服务定位器,它链接到外部URL。然后,我想在我的实现中invoke该服务。

这就是我的想法,在我的build.sbt中,我把我的服务的网址

代码语言:javascript
复制
lagomUnmanagedServices in ThisBuild := Map(
  "Foo" -> "https://www.xxxxxx.com"
)

然后,我得到了具有确切名称的服务

代码语言:javascript
复制
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来调用它了

代码语言:javascript
复制
fooService.fooServiceCall.invoke()

但问题是,我发送的请求应该格式化为x-www-form-urlencoded,而不是普通的Json格式。有可能做到这一点吗?

*PS。响应仍然是普通Json格式

EN

回答 1

Stack Overflow用户

发布于 2020-07-02 18:19:16

只需按照Lagom documentation中的说明为FooRequest case类添加序列化即可使用x-www-form-urlencoded

第一步:为FooRequestx-www-form-urlencoded创建协商好的序列化器和反序列化器

代码语言:javascript
复制
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

代码语言:javascript
复制
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
}

最后一步:将序列化程序添加到服务描述符中:

代码语言:javascript
复制
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对象生成消息序列化程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61480362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档