Ответ 1
Кажется, ваша полезная нагрузка вашего запроса JSON кодируется дважды:
Сначала он возвращает строку вывода {"text":"..."}
, а затем эта строка снова закодирована. JSON может не только кодировать объекты, но также строки, поэтому кодировка вышеописанного даст результат "{\"text\":\"...\"}"
.
То есть, строка, содержащая кодированное JSON представление объекта.
Однако Slack API ожидает объект формы {"text": "..."}
, а не строку "..."
. Последний по-прежнему действителен JSON, но он не является допустимым запросом в отношении API. Вот почему вы возвращаете ошибку "неправильной полезной нагрузки".
Где Im не совсем уверен, где объект закодирован второй раз. Ваш код выше выглядит нормально, но, возможно, есть другие этапы обработки, которые не содержатся в этих фрагментах кода. Я бы посоветовал вам внимательно изучить ваш код для пути, где к некоторым данным применяются два вызова Poison.encode!
.
Однако для этого существует обходной путь - хотя я настоятельно рекомендую вам найти и исправить первопричину, двойную кодировку JSON. В process_request_body/1
вы можете сопоставить аргумент - и если это уже строка, пропустите Poison.encode!
. Для этого используйте следующий код:
def process_request_body(body) when is_binary(body), do: body
def process_request_body(body)
body
|> Poison.encode! # Turns map into JSON
end
Это передаст строки через дословно и JSON закодирует что-нибудь еще. Однако это может быть опасно, потому что строка по-прежнему является допустимым входом для кодирования JSON, поэтому вам нужно быть осторожным, если вы хотите отправлять чистые строки JSON, закодированные по API. Опять же, я рекомендую установить основную причину, но в зависимости от вашей ситуации это обходное решение также может быть жизнеспособным.