Alamofire не позволяет отправлять объект напрямую - PullRequest
0 голосов
/ 30 апреля 2019

Мой API принимает только объект как тело, но alamofire только отправляет Словарь как объект, который мой сервер не принимает, запрашивая помощь

Мне нужно вызвать API, который является post api с использованием alamofire

как только я конвертирую модель в словарь и диникант в json и опубликовать его Alamofire не позволяет мне опубликовать строку

позволяет отправить словарь, который не принимает мой API

["key":"value"]- Not acceptable
{"key":"value"}- Acceptable

Может кто-нибудь поделиться каким-либо решением?

Я использую Swift 5, Xcode 10, Alamofire 4.8.2

do{
    let d  = try data.asDictionary()
    jsonString = DictionaryToJSON(data: dictionary)
} catch {
    print(error)
}
Alamofire.request(url, method: .post, parameters: jsonString, encoding: .utf8, headers: [: ]).responseJSON { (res) in
    print(res.result)
    print("Request Data \(res.request) \n Dictionary \(jsonString)")
    do {
        let d = try JSONDecoder().decode([OTPMessage].self, from: res.data!)
        print(d[0].message)
    } catch {
        print(error)
    }
}

// Dictionary to JSON

func DictionaryToJSON(data: [String:Any])->String {
    if let theJSONData = try? JSONSerialization.data(
        withJSONObject: data,
        options: .prettyPrinted
    ),
    let theJSONText = String(data: theJSONData, encoding: String.Encoding.ascii) {
        print("JSON string = \n\(theJSONText)")
        return theJSONText
    }
    else {
        return ""
    }
}

// Object to Dictionary

extension Encodable {
    func asDictionary() throws -> [String: Any] {
        let data = try JSONEncoder().encode(self)
        guard let dictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] else {
            throw NSError()
        }
        return dictionary
    }
}

//Struct
struct OTPMessage:Codable {
    var message = String()
}

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Вам не нужно преобразовывать свой словарь в строку JSON, потому что Alamofire может выполнять кодировку, см. пример .

Я предлагаю вам изменить код на что-то вроде этого

do{
   let dictionary = try data.asDictionary()
   Alamofire.request(url, method: .post, parameters: dictionary, encoding: .JSON, headers: [:]).responseJSON { (res) in
        print(res.result)
        print("Request Data \(res.request) \n Dictionary \(jsonString)")
        do{
            let d = try JSONDecoder().decode([OTPMessage].self, from: res.data!)
            print(d[0].message)
        }catch{
            print(error)
        }
    }
} catch{
    print(error)
}
0 голосов
/ 30 апреля 2019

С Alamofire вы не можете этого сделать.Вам нужно создать объект URLRequest, задать для него свойство httpBody и передать его Alamofire.

URLRequest позволяет вам иметь Data в качестве тела POST.

            var request = URLRequest(url: urlFinal)
            request.httpMethod = HTTPMethod.post.rawValue
            request.allHTTPHeaderFields = dictHeader
            request.timeoutInterval = 10
            request.httpBody = newPassword.data(using: String.Encoding.utf8)

            Alamofire.request(request).responseString { (response) in
                if response.response!.statusCode >= 200 && response.response!.statusCode <= 300 {
                    completion("success")
                }else {
                    completion("failed")
                }
            }

здесь newPassword - строка.оттуда я создал объект Data.Вы должны преобразовать ваш пользовательский объект класса в Data объект.

...