将对象序列化为x-www-form-urlencoded with Feign和Jackson

时间:2016-09-09 11:44:19

标签: java post jackson netflix-feign

我正在使用netflix-feign和jackson来创建Mailgun API的包装器。 问题是API要求POST请求与"Content-Type: application/x-www-form-urlencoded"

一起使用

这是一个示例代码:

@RequestLine("POST /messages")
@Headers("Content-Type: application/x-www-form-urlencoded")
ResponseMessage sendMessage(Message message);

Message对象包含必要的属性,并且它们具有JSON注释: @JsonProperty(value = "from") private String from;

问题是发送的对象是JSON对象:

{ "from" : "test@test.mailgun.org", "to" : "atestaccount@gmail.com", "subject" : "A test email", "text" : "Hello this is the text of a test email.", "html" : "<html><body><h1>Hello this is the html of a test email.</h1></body></html>" }

但这不是有效的x-www-form-urlencoded内容类型。

有没有办法自动将对象序列化为正确的内容类型?

我认为我可以使用@Body注释,但为了使用它,我必须将不同的属性传递给sendMessage方法。

1 个答案:

答案 0 :(得分:0)

传递xml内容映射的字符串

你可以在你的方法中发送一个字符串,它在之前被解析为xml:

@RequestLine("POST /messages")
@Headers("Content-Type: application/x-www-form-urlencoded")
ResponseMessage sendMessage(String message);

然后使用映射器(例如Jackson),您可以将Message映射到xml:

ObjectMapper xmlMapper = new XmlMapper();
String xml = xmlMapper.writeValueAsString(message);

然后用这个xml调用方法:

sendMessage(xml);

使用编码器

否则,我认为可以根据需要配置编码器和解码器。在这种情况下,要使用XML,您可以使用JaxBEncoderJaxBDecoder

api = Feign.builder()
              .encoder(new JAXBEncoder())
              .decoder(new JAXBDecoder())
              .target(Api.class, "https://apihost");