我正在尝试调用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。
答案 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);
// ...