hum*_*ger 10 elixir slack-api elixir-poison
我正在使用Poison将地图编码为JSON,并将其发送到Slack API.这就是Poison给我的东西:
"{\"text\":\"changed readme fad996e98e04fd4a861840d92bdcbbcb1e1ec296\"}"
Run Code Online (Sandbox Code Playgroud)
当我把它放入JSON lint时,它说它是有效的JSON,但是Slack响应"无效的有效载荷".
如果我将JSON更改为这样
{"text":"changed readme fad996e98e04fd4a861840d92bdcbbcb1e1ec296"}
Run Code Online (Sandbox Code Playgroud)
然后它工作.有谁知道我在哪里出错?我是否需要对编码的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
Run Code Online (Sandbox Code Playgroud)
这是发送消息的库的一部分
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
Run Code Online (Sandbox Code Playgroud)
我的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
Run Code Online (Sandbox Code Playgroud)
创建JSON的部分位于最后一个块中.
您的请求有效负载似乎被 JSON 编码了两次:\n首先它返回输出字符串{"text":"..."},然后再次对该字符串进行编码。JSON 不仅可以对对象进行编码,还可以对字符串进行编码,因此上述编码将再次给出 的输出"{\\"text\\":\\"...\\"}"。\n也就是说,一个包含对象的 JSON 编码表示形式的字符串。
然而,Slack API 需要一个 形式的对象{"text": "..."},而不是 string "..."。后者仍然是有效的 JSON,但就 API 而言,它不是有效的请求。这就是为什么您会收到 \xe2\x80\x9cinvalid Payload\xe2\x80\x9d 错误。
其中 I\xe2\x80\x99m 不完全确定对象第二次编码的位置。上面的代码看起来不错,但也许还有其他处理步骤不在这些代码片段中。我建议您仔细检查代码,找出Poison.encode!对某些数据应用两次调用的路径。
然而,对于这个 \xe2\x80\x93 有一个解决方法,尽管我强烈建议您找到并修复根本原因,即双重 JSON 编码。您process_request_body/1可以匹配参数 \xe2\x80\x93 ,如果它已经是字符串,则跳过Poison.encode!. 为此,请使用以下代码:
def process_request_body(body) when is_binary(body), do: body\ndef process_request_body(body)\n body\n |> Poison.encode! # Turns map into JSON\nend\nRun Code Online (Sandbox Code Playgroud)\n\n这将逐字传递字符串,并对其他任何内容进行 JSON 编码。\n但是,这可能很危险,因为字符串仍然是 JSON 编码的有效输入,因此如果您想通过 API 发送纯 JSON 编码的字符串,则必须小心。再次,我建议修复根本原因,但根据您的情况,此解决方法也可能是可行的。
\n| 归档时间: |
|
| 查看次数: |
5160 次 |
| 最近记录: |