2016-05-23 42 views
5

chcę dodać Int wartości do multipartFormData:Jak dodać wartość int do przesyłania Alamofire Parametry

Alamofire.upload(.POST, 
       url, 
       headers: headers, 
       multipartFormData: { multipartFormData in 
        //add some jpg image 
        //add other vaues: 
        for (key, value) in parameters { 
         if value is String { 
          multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
         } else if value is Int { 
          let convertedValueNumber: NSNumber = NSNumber(int: value.intValue) 
          let data = NSKeyedArchiver.archivedDataWithRootObject(convertedValueNumber) 
          multipartFormData.appendBodyPart(data: data, name: key) 
         } 
        } 

    }, encodingCompletion: { encodingResult in 
     //some processing 
}) 

Ale błąd zwrotny Serwer że nie wysyłaj Int wartość. Jak dodać wartość Int do parametrów?

+0

masz opcję wpisania rzutu int na ciąg. –

+0

Twój serwer naprawdę oczekuje pliku 'NSKeyedArchiver' binarnego plist?!? Najczęściej serwer oczekiwałby tylko reprezentacji łańcuchowej wartości liczbowej. – Rob

+0

@Rob Próbowałem konwertować bez NSKeyedArchiver Użyłem niech dane = NSData (bajty: & vInt, długość: sizeof (Int)) multipartFormData.appendBodyPart (dane: dane, nazwa: klucz) A to nie pomaga –

Odpowiedz

12

The NSKeyedArchiver jest bardzo ciekawy. Zazwyczaj po prostu chcesz wysłać reprezentację ciąg, np

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: { multipartFormData in 
    //add some jpg image 
    //add other values: 
    for (key, value) in parameters { 
     if value is String { 
      multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
     } else if value is Int { 
      multipartFormData.appendBodyPart(data: "\(value)".dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
     } 
    } 
}, encodingCompletion: { encodingResult in 
    //some processing 
}) 

Lub jeszcze prostsze, ponieważ interpolacja ciąg współpracuje zarówno String i Int:

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: { multipartFormData in 
    //add some jpg image 
    //add other values: 
    for (key, value) in parameters { 
     if value is String || value is Int { 
      multipartFormData.appendBodyPart(data: "\(value)".dataUsingEncoding(NSUTF8StringEncoding)!, name: key) 
     } 
    } 
}, encodingCompletion: { encodingResult in 
    //some processing 
}) 

Albo w Alamofire 4 z Swift 3:

Alamofire.upload(multipartFormData: { multipartFormData in 
    //add some jpg image 
    //add other values: 
    for (key, value) in parameters { 
     if value is String || value is Int { 
      multipartFormData.append("\(value)".data(using: .utf8)!, withName: key) 
     } 
    } 
}, to: url, method: .post, headers: headers, encodingCompletion: { encodingResult in 
    //some processing 
}) 
+0

Dziękuję, ale mam pytanie, co jeśli wartością może być '[String]', '[String: Any]' ... jeśli może mieć wiele typów, więc czy powinienem dla każdego typu utworzyć blok is? – Chlebta

+1

Lub możesz mieć tę pojedynczą metodę, która przyjmuje zarówno permutacje, np. Parametr "Any?", A następnie zrobić "jeśli parametry = parametry jako? [String] {...} jeśli jeszcze pozwolisz parametrom = parametry jako? [String: String] {...} 'lub cokolwiek innego. – Rob