模式匹配HTTPoison.Response

Joe*_*oom 4 elixir

我正在尝试使用HTTPoison处理来自API调用的响应

在我的应用程序上下文中我有

def add_to_cart(data, user) do
  case HTTPoison.post!(
      "https://api.moltin.com/v2/carts/" <> user <> 
      "/items", data,
      [{"Authorization",
        "Bearer #{Agent.get(:token, fn state -> state end)}"},
       {"Content-Type", "application/json"}] do

    {:ok, %HTTPoison.Response{status_code: 201, body: body}} ->
      case Poison.decode(body) do
        {:ok, decoded} -> decoded
        {:error, error} -> {:error, error}
      end

    {:ok, %HTTPoison.Response{status_code: 404}} ->
      IO.puts "Not found :("

    {:error, %HTTPoison.Error{reason: reason}} ->
      IO.inspect reason

  end
end
Run Code Online (Sandbox Code Playgroud)

我返回的错误是:

CaseClauseError at POST /order
no case clause matching: %HTTPoison.Response{response content}
Run Code Online (Sandbox Code Playgroud)

我在我的代码中的其他地方使用了这种模式并且匹配正常但是当我把它放在这里时,它似乎不起作用.

我确信这不是足够的信息可供使用,但我不确定此时还有什么可放.任何指导将不胜感激.

Ale*_*kin 8

仙丹约定:撞的函数,而不是版本{:ok, result}{:error, reason}-返回result成功,并提高对错误.Grep这个页面为"Elixir没有强制例外"供参考.

HTTPoison 遵循这一观点.

为了使你的代码能够工作,你应该在最好的情况下使用HTTPoison.post(不是 banged),或者分别匹配结果:

try
  %HTTPoison.Response{status: status, body: body} =
    HTTPoison.post!(...)
  case status do
    201 -> ...
    404 -> ...
  end
rescue
  e in HTTPoison.Error ->
    IO.inspect e
end  
Run Code Online (Sandbox Code Playgroud)