# Making a POST request

**URL:** <https://forums.swift.org/t/making-a-post-request/63400>\
**Category:** Alamofire\
**Created:** [February 27, 2023, 6:25pm UTC](https://forums.swift.org/t/making-a-post-request/63400 "2023-02-27T18:25:09Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![caraberdop](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/caraberdop/32/28907_2.png) [@caraberdop](https://forums.swift.org/u/caraberdop)\
**Post date:** [February 27, 2023, 6:25pm UTC](https://forums.swift.org/t/making-a-post-request/63400/1 "2023-02-27T18:25:09Z")

</div>

Trying to make JSON a payload for a POST request

I have a Model that comes from my API

```swift
struct Series: Codable, Hashable, Identifiable {
    let id: Int
    let title: String
    let overview: String

    func hash(into hasher: inout Hasher) {
        hasher.combine(id)
    }

    static func == (lhs: Series, rhs: Series) -> Bool {
        lhs.id == rhs.id
    }

    enum CodingKeys: String, CodingKey {
        case id
        case title
        case overview
    }
}

```

Lets say that I have one already made

```swift
let series = Series(...args)

```

I Need the payload for the post request to look like this

```swift
{
     "id: 1,
     "title": "Random title",
     "overview": "This is an overview",
     "additionalField1": 2,
     "additionalField2": false,
     "additionalField3": "red"

}

```

Is there an easier way to do that insted of this?  
(in reality a Series has 50+ fields on it that need to get sent in the payload as well)

```swift
let payload = [String, (Int, String, Bool)] = [
    "id": series.id,
    "title": series.title,
    "overview": series.overview,
    "additionalField1": randomVariable1,
    "additionalField2": randomVariable2,
    "additionalField3": randomVariable2
]

```

I know in javascript I would just do something like:

```js
{
    ...series,
    "additionalField1": randomVariable1,
    "additionalField2": randomVariable2,
    "additionalField3": randomVariable2
}

```

Ive played around with making another struct

```swift
struct AdditionalParams: Codable {
    let additionalField1: Int
    let additionalField2: Bool
    let additionalField3: String
}

```

But how would I merge AdditionalParams() and Series() together to make the post request?

---

<div class="post-metadata">

**Author:** ![tera](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/tera/32/38201_2.png) [@tera](https://forums.swift.org/u/tera)\
**Post date:** [February 27, 2023, 6:55pm UTC](https://forums.swift.org/t/making-a-post-request/63400/2 "2023-02-27T18:55:55Z")

</div>

Based on [this suggestion](https://forums.swift.org/t/merging-data-for-post-request/63357/4) here's a simple "merger" helper:

```swift
struct Merger: Encodable {
    let values: [Encodable]
    
    func encode(to encoder: Encoder) throws {
        for value in values {
            try value.encode(to: encoder)
        }
    }
}

let series = Series(id: 123, title: "some title", overview: "some overview")
let additional = AdditionalParams(additionalField1: 1, additionalField2: false, additionalField3: "3")
let v = Merger(values: [series, additional])
                     
let encoder = JSONEncoder()
encoder.outputFormatting = .sortedKeys
let data = try! encoder.encode(v)
let s = String(data: data, encoding: .utf8)!
print(s)
// {"additionalField1":1,"additionalField2":false,"additionalField3":"3","id":123,"overview":"some overview","title":"some title"}

```

_Edit: modified code a bit to support multi-merge._

---

<div class="post-metadata">

**Author:** ![Jon\_Shier](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/jon_shier/32/921_2.png) [@Jon\_Shier](https://forums.swift.org/u/Jon_Shier)\
**Post date:** [February 27, 2023, 7:32pm UTC](https://forums.swift.org/t/making-a-post-request/63400/3 "2023-02-27T19:32:10Z")

</div>

Last I tried this didn't work, but perhaps Swift 5.7 has made `any Encodable` useful finally.

---

<div class="post-metadata">

**Author:** ![tera](https://sea2.discourse-cdn.com/swift/user_avatar/forums.swift.org/tera/32/38201_2.png) [@tera](https://forums.swift.org/u/tera)\
**Post date:** [February 28, 2023, 12:13am UTC](https://forums.swift.org/t/making-a-post-request/63400/4 "2023-02-28T00:13:47Z")

</div>

> [@Jon\_Shier](#):
>
> Last I tried this didn't work, but perhaps Swift 5.7 has made `any Encodable` useful finally.

Merger compiles fine since swift 4.0 according to godbolt. Note that Encodable has no associated type or self requirement.
