Я использую Poison для кодирования карты в JSON, которая отправит ее в Slack API. Вот что дает мне Poison:
"{\"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)
. - person Dogbert   schedule 16.07.2016chat.postMessage
API? Первый принимаетapplication/json
(но вы должны убедиться, что установлен HTTP-заголовокContent-type: application/json
), а второй не поддерживает POST-сообщения на основе JSON таким образом. - person Taylor Singletary   schedule 26.07.2016