【发布时间】:2016-11-19 18:16:48
【问题描述】:
我正在使用 Poison 将地图编码为 JSON,然后将其发送到 Slack API。这就是毒药给我的:
"{\"text\":\"changed readme fad996e98e04fd4a861840d92bdcbbcb1e1ec296\"}"
当我将它放入 JSON lint 时,它说它是有效的 JSON,但 Slack 响应“无效负载”。
如果我将 JSON 更改为如下所示
{"text":"changed readme fad996e98e04fd4a861840d92bdcbbcb1e1ec296"}
然后就可以了。有谁知道我哪里错了?我是否需要对编码后的 JSON 进行额外处理,还是需要设置一些标头?
这是我的控制器
def create(conn, opts) do
message = Message.create_struct(opts)
response = Slack.Messages.send(message)
case response do
{:ok, data} ->
render conn, json: Poison.encode!(data)
{:error, reason} ->
render conn, json: reason
end
end
这是用于发送消息的库的一部分
defmodule Slack.Messages do
def format_simple_message(map) do
text = map.description <> " " <> map.commits
message = %{text: text}
end
def post_to_slack(map) do
Slack.post(:empty, map)
end
def send(map) do
map
|> format_simple_message
|> post_to_slack
end
end
还有我的 HTTPoison 处理
defmodule Slack do
use HTTPoison.Base
@endpoint "http://url.com"
def process_url() do
@endpoint
end
def process_response_body(body) do
body
|> Poison.decode! # Turns JSON into map
end
def process_request_body(body) do
body
|> Poison.encode! # Turns map into JSON
end
end
创建 JSON 的部分在最后一个块中。
【问题讨论】:
-
能贴出相关控制器功能的源码吗?你可能打电话给
json(conn, Poison.encode!(data))而不是json(conn, data)。 -
添加了一些代码,以便更好地了解我在做什么。
-
"这就是 Poison 给我的:..." 你是从代码中的什么地方得到这个值的?
-
这来自我使用 Poison 进行编码的任何时候。具体来自 process_request_body。在 Poison 文档中,这就是他在用法部分下的示例中的输出:github.com/devinus/poison
-
对从 Poison 编码映射到 JSON 的返回对象尝试 JSON.parse,然后将其发送到 slack API?
标签: elixir slack-api elixir-poison