IOS, как разместить несколько пользовательских объектов с помощью Alamofire - PullRequest
0 голосов
/ 25 апреля 2018

Привет, я новичок в iOS и использую Alamofire для сетевых звонков.Все шло хорошо, и я не сталкиваюсь с проблемами при совершении сетевых звонков.Но так как я должен опубликовать свой объект, мне не повезло.так вот, что я делал до

let parameters: Parameters = [
        "Phone": phone,
        "ApiKey":"x-y-z"
    ]

это работало нормально.

но теперь я должен опубликовать свои объекты, например

let parameters: Parameters = [
        "ApiKey": Common.API_KEY,
        "cardModel": cardModel,
        "clientModel" : clientModel
    ]

Моя модель cardModel и клиента уже преобразована в строку Json, я просто помещаю их в словарь.преобразованная модель выглядит следующим образом:

"cardModel": {
    "ExpiryYear": 2018,
    "ExpiryMonth": 1,
    "CardNumber": "55555",
    "CardHolderName": "xyz"
}

, поэтому я помещаю эти сериализованные модели в словарь и помещаю эти данные в тело запроса с помощью Alamofire.

Но на стороне сервера эти модели не имеют значения.Любая идея, как поставить пользовательскую модель так, как я хочу?помогите пожалуйста

PS Я просто распечатываю свой словарь параметров, и я изучил этот вывод

    ["ApiKey": "x-y-z",
     "\cardModel\": "{
     "\ExpiryYear\": 2018,
     "\ExpiryMonth\": 1,
     "\CardNumber\": "\55555\",
     "\CardHolderName\": "\xyz\"
    }
]

Я поместил эти параметры json напечатал вывод в jsonLint, и это было неправильноформат.Я просто удалил «\» и заменил [] на {}, а затем он оказался действительным Json

Так что мне теперь делать ????Пожалуйста, помогите

Обновление 1: это действительно JSON для моей конечной точки (отправка с Android)

{
"ApiKey": "XXX-XXX-XXX",
"cardModel": {
    "CardHolderName": "Fjj",
    "CardNumber": "555",
    "CardExpiryMonth": 1,
    "CardExpiryYear": 2018
    ......
}

}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Я предлагаю вам прочитать протокол Codable , это очень элегантный способ сопоставить основные типы Swift с данными JSON. Детская площадка поможет вам со следующим

import Cocoa

let jsonData = """
{
    "ApiKey": "XXX-XXX-XXX",
    "cardModel": {
        "CardHolderName": "Fjj",
        "CardNumber": "555",
        "CardExpiryMonth": 1,
        "CardExpiryYear": 2018
    }
}
""".data(using: .utf8)!
// ... missing here (but added a closing brace for cardModel

struct CardModel: Codable {
    let holderName: String
    let number: String
    let expiryMonth: Int
    let expiryYear: Int

    enum CodingKeys: String, CodingKey {
        case holderName = "CardHolderName"
        case number = "CardNumber"
        case expiryMonth = "CardExpiryMonth"
        case expiryYear = "CardExpiryYear"
    }
}

struct ApiCardPayment: Codable {
    let apiKey: String
    let cardModel: CardModel

    enum CodingKeys: String, CodingKey {
        case apiKey = "ApiKey"
        case cardModel
    }
}

do {
    let apiPayment = try JSONDecoder().decode(ApiCardPayment.self, from:jsonData)
    print(apiPayment)
} catch {
    print(error)
}

С этим гораздо легче справиться, чем с кошмаром [String:AnyObject], который вам, вероятно, придется интерпретировать иначе. Кроме того, сообщения об ошибках JSONDecoder быстро улучшались, и теперь он довольно хорошо показывает, что происходит не так.

P.S .: Конечно, есть и JSONEncoder().encode(), но это в любом случае просто часть.

0 голосов
/ 25 апреля 2018

Сначала вам нужно иметь метод / вычисляемое свойство, которое преобразует вашу модель в словарь типа [String: AnyObject] или [String: Any]. Затем вместо добавления вашей модели в словарь параметров добавьте словарь моделей, как показано в примере ниже.

class CardModel: NSObject {
    var expiryYear: Int?
    var expiryMonth: Int?
    var cardNumber: String?
    var cardHolderName: String?


    var jsonDict: [String: AnyObject] {
        var json: [String: AnyObject] = [:]//Initializing an Empty Dictionary
        json["expiryYear"] = expiryYear as AnyObject // Inserting expiryYear into Dictionary
        json["expiryMonth"] = expiryMonth as AnyObject // Inserting expiryMonth into Dictionary
        json["cardNumber"] = cardNumber as AnyObject // Inserting cardNumber into Dictionary
        json["cardHolderName"] = cardHolderName as AnyObject // Inserting cardHolderName into Dictionary
        return json // returning newly populated dictionary
    }
}

func requestToServer(cardModel: CardModel) {
    var parameters = [String: AnyObject]()
    parameters["ApiKey"] = "dfv12345df234t" as AnyObject
    parameters["cardModel"] = cardModel.jsonDict as AnyObject// adding card model dictionary into you paramters dictionary.

    //Same logic will be use for your next clientModel
}
...