Неудачный ответ от alamofire swift3 - PullRequest
0 голосов
/ 04 мая 2018

Здравствуйте, я застрял с alamofire.

    let keys = [CNContactPhoneNumbersKey, CNContactGivenNameKey]
    let request = CNContactFetchRequest(keysToFetch: keys as [CNKeyDescriptor])
    let contactStore = CNContactStore()
    do {
        try contactStore.enumerateContacts(with: request) {
            (contact, stop) in
            // Array containing all unified contacts from everywhere
            self.contacts.append(contact)
        }
    }
    catch {
        print("unable to fetch contacts")
    }
    var contactArray = [[String:String]]()

    for i in 0..<contacts.count{
        var mobiles = ""
        for num in contacts[i].phoneNumbers {

            mobiles = num.value.stringValue
        }



        var theDict = ["contact_id": "\(i)", "full_name": contacts[i].givenName, "mobile_number": "\(mobiles)"]
        contactArray.append(theDict)

    }

    dictParams["contacts"] = dictContacts



    let theParams = ["contacts":contactArray] as [String:AnyObject]
    print("dict theParams: \(theParams)")

это напечатанные параметры

dict theParams: ["contacts": <Swift._SwiftDeferredNSArray 0x604000233280>(
{
    "contact_id" = 0;
    "full_name" = Kate;
    "mobile_number" = "62123123";
},
{
    "contact_id" = 1;
    "full_name" = Daniel;
    "mobile_number" = "621231123";
},
{
    "contact_id" = 2;
    "full_name" = John;
    "mobile_number" = "625435345";
}
)
]

и я отправляю его на alamofire с этим кодом

func sendFriendList(dictContacts: [String:AnyObject] ,successBlock:((_ isSuccess: Bool, _ theFriendsResponse: FriendsResponse)->Void)?,errorBlock:((_ errorString:String)->Void)? )-> Void
    {

Alamofire.request("url/ListRetrieve",
        method: .post,
        parameters: dictContacts,
        encoding: URLEncoding.default,
        headers: headers)
        .responseJSON { response in
            print("this is response retrieve \(response)")

и ответ от alamofire:

this is the response = retrieve FAILURE: responseSerializationFailed(Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 1." UserInfo={NSDebugDescription=Invalid value around character 1.}))

но если я изменю параметры только строку, как это ["контакты": "тестовый контакт"]

Реакция alamofire стала успешной, и это работа.

пожалуйста, помогите мне :) спасибо

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Это не проблема Alamofire. Для API необходим параметр «контакты» как String, а вы отправляете Array из Dictionaries. Если вы отправляете данные Array в параметре "contacts", попросите разработчиков API изменить тип параметра или, если возможно, отправить строку в качестве данных в параметре "contacts".

Выпуск:

это ответ = получить НЕИСПРАВНОСТЬ: responseSerializationFailed (Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed (Ошибка домена = NSCocoaErrorDomain Code = 3840 "Недопустимое значение вокруг символа 1." UserInfo = {NSDebugDescription = Invalid) = недопустимое значение)

также указывает только недопустимый символ.

0 голосов
/ 04 мая 2018

Мои параметры похожи на

// .toJson to your array object or dictonary object and try out
let parameters: [String : Any] = [
    "products":[
         ["pid":"72","qnty":"1"],
         ["pid":"4","qnty":"1"],
         ["pid":"3","qnty":"1"]
     ].toJson ?? "[]",   
]

Используйте это расширение для преобразования объекта Array в строку JSON.

extension Array where Element: Codable {

    public var toData: Data {
        let encoder = JSONEncoder()
        do {
            return try encoder.encode(self)
        }
        catch {
            fatalError(error.localizedDescription)
        }
    }

    public var toJson: String? {
        return toData.toJson
    }
}
0 голосов
/ 04 мая 2018

Используйте responseString вместо responseJSON. Затем используйте JSONSerialization для преобразования ответа в JSON .
Что-то вроде:

JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]  


func convertToDictionary(text: String) -> [String: Any]? {
    if let data = text.data(using: .utf8) {
        do {
            return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        } catch {
            print(error.localizedDescription)
        }
    }
    return nil
}
...