Отправить JSON массив в качестве параметра Alamofire - PullRequest
1 голос
/ 08 апреля 2020

У меня проблемы с параметром, который содержит массив Json с использованием Alamofire

Вот строка моего Json:

"[{\"id\":546836102,\"count\":1},{\"id\":216479424,\"count\":1}]"

Вот мой код, где Я делаю запрос:

let data = (params["cart"] as! String).data(using: .utf8)!
do {
    if let jsonArray = try JSONSerialization.jsonObject(with: data, options : .fragmentsAllowed) as? [Dictionary<String, Int>] {

       let parameters: Parameters = [
           "address_id": params["address_id"] as! Int,
           "delivery_day": params["delivery_day"] as! String,
           "delivery_hour": params["delivery_hour"] as! Int,
           "cart": jsonArray,
           "via": params["via"] as! String
       ]

       Alamofire.request(Global.baseURL + "orders/finish", method: .post, parameters: parameters, encoding: URLEncoding.default, headers: header)
                .responseSwiftyJSON {

Распечатка моего parameters

["cart": [["id": 546836102, "count": 1], ["count": 1, "id": 216479424]], "address_id": 641589205, "delivery_day": "1399-01-20", "delivery_hour": 21, "via": "ios"]

Бэкэнд должен получить cart, как показано ниже:

[
 {
  "id": 123456,
  "count": 2
 },
 {
  "id": 654321,
  "count": 3
 }
]

Но вместо этого он получает такие данные:

{
 "delivery_hour" : "21",
 "delivery_day" : "1399-01-20",
 "cart" : [
  {
   "count" : "1"
  },
  {
   "id" : "546836102"
  },
  {
   "count" : "1"
  },
  {
   "id" : "216479424"
  }
 ],
 "via" : "ios",
 "address_id" : "641589205"
}

Я пробовал варианты JSONEncoding и URLEncoding от Alamofire, но, похоже, ничего не работает, и это самое близкое, что я получил к шаблону API до сих пор.

Что я здесь не так делаю?

// MARK: - Update

Итак, я обновился до последней версии Alamofire и все еще не получил хороших результатов :( Вот код:

let payload = MyParameters(address_id: 641589205, delivery_day: "1399-01-21", delivery_hour: 21, cart: items, via: "ios")

AF.request(url, method: .post, parameters: payload, encoder: JSONParameterEncoder.default, headers: .init(header), interceptor: nil).response { dataResponse in
        switch dataResponse.result {
        case .success(let value):
            if dataResponse.response?.statusCode == 200 {
                let json = JSON(value!)
                completionHandler(json, nil)
            } else {
                print(dataResponse.response?.statusCode ?? -1)
            }
        case .failure(let error):
            print(error)
            completionHandler(nil, error.localizedDescription)
        }
}

Мой payload выглядит именно так, как я хочу, чтобы оно было

{
  "cart" : [
    {
      "count" : 1,
      "id" : 546836102
    },
    {
      "count" : 1,
      "id" : 216479424
    }
  ],
  "via" : "ios",
  "address_id" : 641589205,
  "delivery_day" : "1399-01-21",
  "delivery_hour" : 21
}

Но опять же конечная точка получает это:

{
  "{\"delivery_day\":\"1399-01-21\",\"address_id\":641589205,\"delivery_hour\":21,\"cart\":" : {
"{\"id\":546836102,\"count\":1},{\"id\":216479424,\"count\":1}" : null
  }
}

1 Ответ

0 голосов
/ 08 апреля 2020

Используя Alamofire 4, вы не можете отправлять массивы указанным вами способом, так как тип Parameters равен [String: Any]. Вы также не используете правильный ParameterEncoding. Если вы хотите отправить тело JSON, вам нужно использовать JSONEncoding. Что вы можете сделать, это вручную сериализовать массив в URLRequest и выполнить этот запрос с помощью Alamofire.

Кроме того, если вы обновите Alamofire 5, теперь поддерживаются параметры Encodable, так что вы можете определить ваши параметры типа Encodable, их отправка будет такой же простой, как и передача массива.

AF.request(..., parameters: [some, encodable, values], encoder: JSONEncoder.default)...
...