Создание тела для POST-запроса Alamofire Swift 4 - PullRequest
0 голосов
/ 12 октября 2018

Мне нужна помощь в создании собственного тела при отправке POST-запроса с Alamofire.

Я отправляю в API продукты.Есть два типа продуктов.Первый тип имеет только количество, второй - разные количества (size_id) и количества, соответствующие каждому size_id.

Конечное тело должно выглядеть следующим образом:

"factory_id": "1"

"order_products[0][product_id]": "1"
"order_products[0][size_id]": "2"
"order_products[0][quantity]": "10"

"order_products[1][product_id]": "1"
"order_products[1][size_id]": "3"
"order_products[1][quantity]": "10"

"order_products[1][product_id]": "2"
"order_products[1][size_id]": "2"
"order_products[1][quantity]": "10"

"order_products[2][product_id]": "3"
"order_products[2][quantity]": "10"

Вот то, чего я добился до сих пор:

var createOrderBody = [String: Any]()
let productIds = ["1", "2", "3"]
var body = [String: Any]()
var quantity = ["1" : "10", "2": "10"]
var noIdQuantity = ["10"]
var finalBody = [String: Any]()

func formBody(products: String, factoryId: String, productId: String, size_id: String, quantity: String) -> [String: Any] {

    createOrderBody["factory_id"] = factoryId
    createOrderBody["order_products[\(products)][product_id]"] = productId
    createOrderBody["order_products[\(products)][size_id]"] = size_id
    createOrderBody["order_products[\(products)][quantity]"] = quantity

    return createOrderBody
}

for (index, value) in productIds.enumerated() {

    for (id, size) in quantity {
        print(id)
        print(size)
        body = formBody(products: String(index), factoryId: "1", productId: String(value), size_id: id, quantity: size)
        print("Body quantity - ", body)
    }
}

И результат, который я получил:

"factory_id": "1",

"order_products[0][product_id]": "1"
"order_products[0][size_id]": "2", 
"order_products[0][quantity]": "10",

"order_products[1][product_id]": "2",
"order_products[1][size_id]": "2",  
"order_products[1][quantity]": "10",

"order_products[2][product_id]": "3",
"order_products[2][size_id]": "2", 
"order_products[2][quantity]": "10", 

Как видите, я почти достиг желаемого результата, но проблема в том, что он добавляет только последний элемент словаря quantity и пропускает другие значения.Кроме того, я не знаю, как добавить количество к продукту, у которого нет size_id

Кроме того, я знаю, что не рекомендуется помещать for in петлю в другие for in цикл, но я новичок в разработке, и это лучшая идея, которую я придумал.

Буду признателен за любую помощь в решении этой проблемы, поскольку я боролся с ней почти неделюпрямо сейчас.

Большое спасибо и хороших выходных!

1 Ответ

0 голосов
/ 13 октября 2018

После изучения и поиска в Интернете, вот решение проблемы, которую мы имеем здесь.Для справки, оригинальный пост здесь - Оригинальный пост

Предполагая, что каждый продукт должен содержать свое собственное количество:

Мы можем определить такую ​​структуру как:

struct Product {  
    let id: String  
    let quantities: [(sizeId: String, quantity: Int)]?  
    let noIdQuantity: Int?  

    init(id: String, quantities: [(sizeId: String, quantity: Int)]) {  
        self.id = id  
        self.quantities = quantities  
        self.noIdQuantity = nil  
    }  

    init(id: String, quantity: Int) {  
        self.id = id  
        self.quantities = nil  
        self.noIdQuantity = quantity  
    }  
} 

С приведенной выше структурой нам просто нужна только одна входная переменная и одна выходная переменная:

// Define input `product with id` as an Array of `Product`  
let products = [  
    Product(id: "1", quantities: [("1", 10), ("2", 10)]),  
    Product(id: "2", quantities: [("1", 10), ("2", 10)]),  
    Product(id: "3", quantities: [("1", 15), ("2", 20)]),  
    Product(id: "4", quantity: 10),  
]  
// Output dictionary  
var body = [String: Any]()  

Чтобы сделать записи для одного продукта в словаре:

extension Product {  
    func formBody(_ index: inout Int, into body: inout [String: Any]) {  
        if let quantities = self.quantities {  
            for (sizeId, quantity) in quantities {  
                body["order_products[\(index)][product_id]"] = self.id  
                body["order_products[\(index)][size_id]"] = sizeId  
                body["order_products[\(index)][quantity]"] = quantity  
                index += 1  
            }  
        }  
        if let quantity = self.noIdQuantity {  
            body["order_products[\(index)][product_id]"] = self.id  
            body["order_products[\(index)][quantity]"] = quantity  
            index += 1  
        }  
    }  
}  

И используйте их следующим образом:

var index = 0  
body["factory_id"] = "1"  
for product in products {  
    product.formBody(&index, into: &body)  
}  
print("Body quantity - ", body)  
body.sorted {$0.key < $1.key}.forEach{print("\($0.key)=\($0.value)")} //For showing readable result, not for Alammofire body  

Итак, конечный результат будет:

factory_id=1
order_products[0][product_id]=1
order_products[0][quantity]=10
order_products[0][size_id]=1
order_products[1][product_id]=1
order_products[1][quantity]=10
order_products[1][size_id]=2
order_products[2][product_id]=2
order_products[2][quantity]=10
order_products[2][size_id]=1
order_products[3][product_id]=2
order_products[3][quantity]=10
order_products[3][size_id]=2
order_products[4][product_id]=3
order_products[4][quantity]=15
order_products[4][size_id]=1
order_products[5][product_id]=3
order_products[5][quantity]=20
order_products[5][size_id]=2
order_products[6][product_id]=4
order_products[6][quantity]=10

Надеюсь, это поможет кому-то, кто имеет такую ​​же сложную структуру или подобное.

...