README.md

# HttpParamsSerializer

A small library to serialize deeply nested datastructures into HTTP parameters that most backends do understand

## tl;dr

Turns this `Map`

```elixir
%{ a: %{ b: %{ d: [1,2], f: 4 } }, c: 3 }
```

or the equivalent `Keyword list`:

```elixir
[a: [b: [d: [1, 2], f: 4]], c: 3]
```

into a `list of key-value tuples`:

```elixir
[
  {"a[b][d][]", 1},
  {"a[b][d][]", 2},
  {"a[b][f]", 4},
  {"c", 3}
]
```

which can be easily turned into
```
"a[b][d][]=1&a[b][d][]=2&a[b][f]=4&c=3"
```
for communication with backend APIs.



## Longer Explanation

I couldn't find an Elixir package that serializes HTTP params as `maps` or nested `keyword lists` into a list of key-value pairs that many REST APIs (in Rails or similar MVC frameworks) require. So I've build one. Enjoy!

This is supposed to be the Elixir equivalent of [Jquery.param](http://api.jquery.com/jquery.param/) in JS world.


## Features

  - serialization of arbirary deeply nested datastructures
  - sorted keys for more predictable output
  - the output (list with tuples) can be directly consumed by following Elixir/Erlang HTTP clients:
    - [HTTPoison](https://github.com/edgurgel/httpoison)
    - [Hackney](https://github.com/benoitc/hackney)

## Usage

```elixir
iex> params = %{id: "aaa-1234",
  account: %{name: "Best", last_name: "User Eva"},
  balance: %{limit: 1000, currency: "$", balance: 1500},
  roles: ["admin", "manager", "staff"]
}
%{account: %{last_name: "User Eva", name: "Best"},
  balance: %{balance: 1500, currency: "$", limit: 1000}, id: "aaa-1234"}
iex> params |> HttpParamsSerializer.serialize
[{"account[last_name]", "User Eva"}, {"account[name]", "Best"},
 {"balance[balance]", 1500}, {"balance[currency]", "$"},
 {"balance[limit]", 1000}, {"id", "aaa-1234"}, {"roles[]", "staff"},
 {"roles[]", "manager"}, {"roles[]", "admin"}]
```



## Installation
  1. Add http_params_serializer to your list of dependencies in `mix.exs`:

        def deps do
          [{:http_params_serializer, "~> 0.1"}]
        end


## License
Copyright © 2016 Roman Heinrich <roman.heinrich@gmail.com>

This work is free. You can redistribute it and/or modify it under the
terms of the MIT License. See the LICENSE file for more details.