我正在尝试使用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我返回的错误是:
CaseClauseError at POST /order
no case clause matching: %HTTPoison.Response{response content}我在代码的其他地方使用了这个模式,它匹配得很好,但是当我把它放在这里时,它似乎不起作用。
我确信这还不足以提供足够的信息来工作,但我不确定在这一点上还需要做些什么。如有任何指导,将不胜感激。
发布于 2017-11-13 05:02:35
“灵丹妙药”的惯例是:函数的重击版本--而不是{:ok, result}和{:error, reason}-return 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 发布于 2017-11-13 08:11:09
那么HTTPoison文档所建议的一个漂亮的、优雅的模式匹配呢?只要去掉感叹号就行了,试试这样的方法:
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发布于 2017-11-13 04:16:39
根据该错误消息,您不需要元组中的:ok和:error原子,请尝试将它们更改为:
{:ok, %HTTPoison.Response{status_code: 201, body: body}} -> #...
{:error, %HTTPoison.Error{reason: reason}} -> #...至:
%HTTPoison.Response{status_code: 201, body: body} -> #...
%HTTPoison.Error{reason: reason} -> #...我认为在您的应用程序中的其他地方,您可能使用的是post/4而不是post!/4,post/4 (没有!)使用:ok原子返回元组,而post post!/4 (使用!)则假设一切都会正常工作,不返回元组中的一个原子,如果出了问题就会抛出异常。
https://stackoverflow.com/questions/47256950
复制相似问题