mikejm
I am attempting to make my first Phoenix HTTP request using HTTPoison but it is not working and I cannot figure out why.
If I create a basic project with HTTPoison in it, then go to iex on this project, I type in the following commands:
userPass = "user:pass"
base64UserPass = Base.encode64(userPass)
authString = "Basic " <> base64UserPass
headers = ["Authorization": authString, "Content-Type": "application/json"]
headers = [{"Authorization", authString}, {"Content-Type", "application/json"}]
body = [language: "sql", command: "select from Profile"]
body = [{"language", "sql"}, {"command", "select from Profile"}]
url = "http://serveraddress.amazonaws.com:2480/api/v1/command/mydb"
HTTPoison.post(url, body, headers)
I am not sure which syntax I should be using for the headers or body out of those options, but either way it doesn’t even seem to get that far as I get:
** (ArgumentError) errors were found at the given arguments:
* 1st argument: not an iodata term
:erlang.iolist_to_binary([{"language", "sql"}, {"command", "select from Profile"}])
(hackney 1.20.1) /deps/hackney/src/hackney_request.erl:352: :hackney_request.handle_body/4
(hackney 1.20.1) /hackney/src/hackney_request.erl:87: :hackney_request.perform/2
(hackney 1.20.1) /deps/hackney/src/hackney.erl:378: :hackney.send_request/2
(httpoison 2.2.1) lib/httpoison/base.ex:888: HTTPoison.Base.request/6
iex:22: (file)
I have searched for info on what I’m doing wrong.
I found this thread that says I should use \ to escape the quotes or use Jason.encode somehow to circumvent this issue, but I could not figure out how to do this:
https://forum.elixirforum.com/t/1st-argument-not-an-iodata-term-error-for-multilingual-text/48225
I found this but that suggested I am not doing anything entirely wrong I can see:
https://stackoverflow.com/questions/59224740/httpoison-doesnt-accept-this-custom-header
I tried:
body = Jason.encode(%{"language": "sql", "command": "select from Profile"})
headers = Jason.encode(%{"Authorization": authString, "Content-Type": "application/json"})
But that didn’t work either as it said it was bad data. So I don’t actually know what the problem is or how to fix it. The request is not being rejected by the server, but rather it is just giving Elixir errors without sending as I can’t find the right syntax.
Any help? Thanks.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 5- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
D4no0
First of all the body parameter should be a string, not a list.
Second thing is that
Jason.encode/2returns response in format{:ok, binary}, you either pattern match on response or use the bang variantJason.econde!/2.The third thing is that jason doesn’t know how to encode tuples, since json format doesn’t have this concept, so you have to use a map instead:
mikejm
Thank you for your advice. Between that and this example I found:
https://stackoverflow.com/questions/37385314/httpoison-insert-body-parameters-in-elixir
I was able to figure it out. The correct approach is:
So I just needed to “encode” the body and the headers was supposed to be used in either format above. Worked and returned correct from server. Thanks again.
Perhaps this will be helpful to other people, but I find of all programming languages I’ve gone into, Elixir/Pheonix has the most opaque documentation. Most of the Hex Docs (like HTTPoison) have no examples of any use that would show things work.
I’m not sure why that is. I suspect there are very few “beginners” or “intermediate” programmers using Elixir in any scenario so everything is written with the notion you already know what you’re supposed to do intuitively.
benwilson512
I think a key challenge is that each library tends to be unopinionated about which other libraries you use. HTTPoison raised the error, but the mistake was earlier and involved other libraries.
Elixir is certainly a language that favors a good grasp of fundamentals before stitching together different libraries.
D4no0
This is absolutely not true. Elixir from conception was created to have a good documentation infrastructure in mind and all mature libraries have great documentation. It is a lot to take in as a beginner as @benwilson512 said, because there are a lot of things to unpack.
A short description on how you should read documentation is the following:
This states clearly that you can create headers in the following formats:
Could this documentation be improved? definetly, more examples could be added also, nothing is perfect
Is it missing vital documentation? absolutely no
And that is all you need to know, as long as you respect these specs, you requests should work as expected.
My advice is that if you don’t want to keep shooting yourself in the leg, take some time to learn elixir syntax, preferably read a book that covers the philosophy of the language, then dive into more complex things like phoenix, as that is a full fledged mature framework that is not meant to be beginner friendly, but to get things done.
arcyfelix
One very important thing - Elixir uses snake case naming. If you don’t follow that, formatting might have issues.