как сделать почтовый запрос используя tesla в эликсире - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь сделать пост-запрос с использованием 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-адресе tesla: https://api.sendgrid.com/v3, а такжеустановить авторизацию key.как мы можем передать данные для запроса по почте?

, как в документации tesla, определить запрос по почте следующим образом:

Tesla.post("http://httpbin.org/post", "data", headers: [{"content-type", "application/json"}])

Есть ли на этой планете кто-нибудь, кто мог бы помочь избавиться от этого сбоя:(.

1 Ответ

0 голосов
/ 29 ноября 2018

Ваша цитата из документов о 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, Tesla автоматически преобразует карту Elixir, заданную в качестве второго аргумента, в функцию post() в формат, который форма на веб-странице отправляет на сервер, который просто выглядитthis:

"name=Joel&age=21"

Tesla также автоматически добавляет следующий заголовок к запросу:

Contet-Type: application/x-www-form-urlencoded

Если вы хотите, чтобы Tesla преобразовала карту Elixir в строку json, укажите Tesla.Middleware.JSONвместо этого (обратите внимание, это требует jason в ваших зависимостях).Tesla также автоматически добавит следующий заголовок к запросу:

 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 я могу увидеть запрос (нажмите на изображение, чтобы увеличить его):

enter image description here

, а также установить авторизациюключ

Тесла имеет два промежуточных модуля для авторизации :

Tesla.Middleware.BasicAuth 
Tesla.Middleware.DigestAuth
...