首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配HTTPoison.Response

模式匹配HTTPoison.Response
EN

Stack Overflow用户
提问于 2017-11-13 04:12:30
回答 3查看 2K关注 0票数 4

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

在我的应用程序中我有

代码语言:javascript
复制
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

我返回的错误是:

代码语言:javascript
复制
CaseClauseError at POST /order
no case clause matching: %HTTPoison.Response{response content}

我在代码的其他地方使用了这个模式,它匹配得很好,但是当我把它放在这里时,它似乎不起作用。

我确信这还不足以提供足够的信息来工作,但我不确定在这一点上还需要做些什么。如有任何指导,将不胜感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-13 05:02:35

“灵丹妙药”的惯例是:函数的重击版本--而不是{:ok, result}{:error, reason}-return result --在成功和错误时提出。Grep这一页用于“Elixir不强加异常”的引用。

HTTPoison 遵循本公约.

要使您的代码正常工作,在最上面的情况下应该使用HTTPoison.post (而不是 banged),或者分别匹配结果:

代码语言:javascript
复制
try
  %HTTPoison.Response{status: status, body: body} =
    HTTPoison.post!(...)
  case status do
    201 -> ...
    404 -> ...
  end
rescue
  e in HTTPoison.Error ->
    IO.inspect e
end  
票数 9
EN

Stack Overflow用户

发布于 2017-11-13 08:11:09

那么HTTPoison文档所建议的一个漂亮的、优雅的模式匹配呢?只要去掉感叹号就行了,试试这样的方法:

代码语言:javascript
复制
case HTTPoison.post(stuff) do
  {:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
    decoded_stuff = Poison.decode(body) # use another nice case statement here
  {:ok, %HTTPoison.Response{status_code: 404}} ->
    IO.puts "Not found :("
  {:error, %HTTPoison.Error{reason: reason}} ->
    IO.inspect reason
end
票数 3
EN

Stack Overflow用户

发布于 2017-11-13 04:16:39

根据该错误消息,您不需要元组中的:ok:error原子,请尝试将它们更改为:

代码语言:javascript
复制
{:ok, %HTTPoison.Response{status_code: 201, body: body}} -> #...
{:error, %HTTPoison.Error{reason: reason}} -> #...

至:

代码语言:javascript
复制
%HTTPoison.Response{status_code: 201, body: body} -> #...
%HTTPoison.Error{reason: reason} -> #...

我认为在您的应用程序中的其他地方,您可能使用的是post/4而不是post!/4post/4 (没有!)使用:ok原子返回元组,而post post!/4 (使用!)则假设一切都会正常工作,不返回元组中的一个原子,如果出了问题就会抛出异常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47256950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档