Как сделать почтовый запрос с помощью Tesla в эликсире
Я пытаюсь сделать запрос с помощью Tesla, но получаю сообщение об ошибке:
(CaseClauseError) no case clause matching: %{name: "ecdebit"}
(hackney) /deps/hackney/src/hackney_request.erl:312::hackney_request.handle_body/4
(hackney) /deps/hackney/src/hackney_request.erl:81::hackney_request.perform/2
(hackney) /deps/hackney/src/hackney.erl:372::hackney.send_request/2
(tesla) lib/tesla/adapter/hackney.ex:69: Tesla.Adapter.Hackney.request/5
(tesla) lib/tesla/adapter/hackney.ex:31: Tesla.Adapter.Hackney.call/2
мой код запроса
request_body = %{
name: "ecdebit",
}
Tesla.post(client, "/contactdb/lists", request_body)
в базе Тесла URL-адрес: https://api.sendgrid.com/v3
а также установить авторизацию key
, как мы можем передать данные для почтового запроса?
как в документации Tesla, определите почтовый запрос следующим образом:
Tesla.post("http://httpbin.org/post", "data", headers: [{"content-type", "application/json"}])
Есть ли на этой планете кто-нибудь, кто мог бы помочь избавиться от этого глюка:(.
1 ответ
Ваша цитата из документов о Tesla.post()
:
Tesla.post("http://httpbin.org/post",
"data",
headers: [{"content-type", "application/json"}])
показывает, что первый аргумент представляет собой строку, содержащую URL, а второй аргумент представляет собой строку, содержащую данные, а третий аргумент представляет собой список ключевых слов. Тем не менее, когда вы звоните Tesla.post()
вы передаете путь в качестве второго аргумента и карту Elixir в качестве третьего аргумента:
Tesla.post(client,
"/contactdb/lists",
request_body)
Вот как вы можете воспользоваться возможностями Tesla для постепенного преобразования вашего запроса в то, что вы хотите:
1) Создайте смешанный проект:
~/elixir_programs$ mix new http
* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/http.ex
* creating test
* creating test/test_helper.exs
* creating test/http_test.exs
Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:
cd http
mix test
Run "mix help" for more commands.
~/elixir_programs$ cd http
2) Добавьте Джейсона, Хакни и Теслу в качестве зависимостей в mix.ex
файл:
defp deps do
[
{:jason, "~> 1.0"}, #for tesla JSON middleware
{:hackney, "~> 1.14.0"}, #recommended for tesla
{:tesla, "~> 1.2.1"}, #http requests
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
]
end
3) Изменить lib/http.ex
к следующему:
defmodule Http do
use Tesla
plug Tesla.Middleware.BaseUrl, "https://webhook.site/ab8b7259-feb4-4e62-b8dd-46bb03b614ba"
plug Tesla.Middleware.FormUrlencoded
#plug Tesla.Middleware.Headers, [{"header-name", "header-value"}]
def go do #Use this function to test whether a Tesla request succeeds without having to repeatedly type the following variables and their values into iex.
request_body = %{name: "Joel", age: 21}
path = "/"
post(path, request_body) #Outside of this module, you would need to write Http.post(...)
end
end
Когда вы указываете Tesla.Middleware.BaseUrl
Tesla автоматически добавит базовый URL к строке, которую вы указали в качестве первого аргумента в post()
функция (если строка не начинается с "http" или "https").
Когда вы указываете Tesla.Middleware.FormUrlencoded
Тесла автоматически преобразует карту эликсира, заданную в качестве второго аргумента, в post()
Функция в формате, который форма на веб-странице отправляет на сервер, который просто выглядит следующим образом:
"name=Joel&age=21"
Тесла также автоматически добавляет следующий заголовок к запросу:
Contet-Type: application/x-www-form-urlencoded
Если вы хотите, чтобы Tesla преобразовала карту Elixir в строку json, укажите Tesla.Middleware.JSON
вместо этого (обратите внимание, это требует jason
в ваших зависимостях). Тесла также автоматически добавит следующий заголовок к запросу:
Contet-Type: application/json
Когда вы указываете Tesla.Middleware.Headers
, Tesla автоматически добавит указанные заголовки ко всем вашим запросам.
Теперь попробуйте это в iex:
~/elixir_programs/http$ iex -S Mix
...
...
iex(1)> {:ok, response} = Http.go
{:ok,
%Tesla.Env{
__client__: %Tesla.Client{adapter: nil, fun: nil, post: [], pre: []},
__module__: Http,
body: "",
headers: [
{"cache-control", "no-cache"},
{"connection", "keep-alive"},
{"date", "Thu, 29 Nov 2018 03:56:49 GMT"},
{"server", "nginx/1.10.3"},
{"vary", "Accept-Encoding"},
{"content-length", "0"},
{"content-type", "text/plain; charset=UTF-8"},
{"x-request-id", "55a92302-6459-49bc-b7eb-f3e7ff037599"},
{"x-token-id", "ab8b7259-feb4-4e62-b8dd-46bb03b614ba"},
{"x-ratelimit-limit", "30"},
{"x-ratelimit-remaining", "29"},
{"strict-transport-security", "max-age=63072000; includeSubdomains"},
{"x-frame-options", "DENY"},
{"x-content-type-options", "nosniff"}
],
method: :post,
opts: [],
query: [],
status: 200,
url: "https://webhook.site/ab8b7259-feb4-4e62-b8dd-46bb03b614ba/"
}}
Форматированный вывод является ответом. На сайте webhook.site
Я могу видеть запрос (нажмите на изображение, чтобы увеличить его):
а также установить ключ авторизации
Tesla имеет два промежуточных модуля для авторизации:
Tesla.Middleware.BasicAuth
Tesla.Middleware.DigestAuth