MultiValuedMap无法使用RestTemplate生成正确的JSON

时间:2019-05-07 15:22:42

标签: java spring-boot jackson resttemplate

我正在尝试调用Slack API(SELECT json_object( "id", id, "execution_id", execution_id, "type", type, "info", REPLACE(info,'\\\\','\\'), "position", position, "created_at", json_object("$date", DATE_FORMAT(created_at,'%Y-%m-%dT%TZ')), "updated_at", json_object("$date", DATE_FORMAT(updated_at,'%Y-%m-%dT%TZ')) )as 'json' FROM myTable INTO OUTFILE 'myPath'; )。为此,我需要传递以下标头:

https://slack.com/api/chat.postMessage

此外,我还必须传递以下JSON请求正文:

Content-type: application/json
Authorization: Bearer YOUR_TOKEN_HERE

为此,我将{ "channel": "YOUR_CHANNEL_ID", "text": "Hello, world" } 与两个RestTemplate一起使用(用于标头和请求正文)。

例如:

MultiValuedMap

但是,这没有发送正确的JSON,因为我没有看到任何消息发布到Slack。

1 个答案:

答案 0 :(得分:0)

Jackson是在屏幕后面用于将正文序列化为JSON的库,能够将Map结构序列化为JSON。

但是,考虑到您使用MultiValuedMap作为正文,JSON将变为:

{
   "channel": ["YOUR_CHANNNEL_ID"],
   "text": ["Hello, world"]
}

这是由于MultiValuedMap接受多个值,因此它正被序列化为一个数组,您可能不希望这样做。

正确的解决方案是对主体使用非多值映射,例如HashMap

Map<String, String> body = new HashMap<>();
body.put("channel", "mychannel");
body.put("text", "mytext");

这将正确序列化为您在问题中发布的JSON结构。请注意,考虑到标头可以重复,标头本身应保持为MultiValuedMap

或者,您可以创建自己的POJO类:

public class SlackMessage {
    private String channel;
    private String text;

    // Constructors + Getters + Setters
}

然后您可以使用:

// ...
SlackMessage body = new SlackMessage("#my-channel", "Hello, World");
HttpEntity<?> request = new HttpEntity<>(body, headers);
// ...