Passer un tableau de chaînes dans la requête de paramètre - swift 5. Je veux envoyer un tableau dans un paramètre à partir d'une requête alamofire.
Voici la requête sur Postman:
Voici ma solution:
var Token : String?
var tasksMO = [NSManagedObject]()
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ConfirmActivationEntity")
do {
let results = try pe.context.fetch(request)
tasksMO = results as! [NSManagedObject]
for taskmo in tasksMO {
Token = (taskmo.value(forKey: "access_token") as! String )
}
print("assbil")
} catch {
print("fild")
}
print(" Token :\(Token!)")
let levels : [String] = ["+972569431827","+972598110437","+972592923343","3555656","00970567163651","258258"]
let paramsJSON = JSON(levels)
debugPrint(paramsJSON)
let parameters : [String : Any] = ["contacts":paramsJSON,"platform":2]
let headers : HTTPHeaders = ["Authorization":"Bearer \(Token!)","Accept-Language" : Locale.current.languageCode ?? "ar", "Content-Type" : "application/x-www-form-urlencoded","Accept" : "application/json"]
guard let url = URL(string: "\(UrlApi.url)\(UrlApi.contactsPost)") else { return }
sdLoader.startAnimating(atView: self.view)
Alamofire.request(url, method: .post, parameters: parameters, headers: headers).responseJSON { response in
if let error = response.error {
print(error)
return
}
if let status = response.response?.statusCode {
print(status)
print(response.result.value!)
switch(status){
case 200:
self.sdLoader.stopAnimation()
do{
let decoder = JSONDecoder()
let userResultDec = try decoder.decode(ContactsJSON.self, from: response.data!)
decoder.keyDecodingStrategy = .convertFromSnakeCase
if userResultDec.status == true {
print(userResultDec.items)
} else if userResultDec.status == false {
self.showAlert(title: "Ø±Ø³Ø§ÙØ©", message: "ÙÙØ§Ù خطا باÙÙ
عÙÙÙ
ات اÙÙ
Ø¯Ø®ÙØ©", style: .alert)
}
} catch let parsingError {
print("Error", parsingError)
MessageBox.Show(Message: " \(parsingError) , خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ± ", MyVC: self)
}
case 401 :
self.sdLoader.stopAnimation()
print("error with response status: \(status)")
print("خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ±")
MessageBox.Show(Message: "error with response status: \(status) , خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ± ", MyVC: self)
case 404 :
self.sdLoader.stopAnimation()
print("error with response status: \(status)")
print("خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ±")
MessageBox.Show(Message: "error with response status: \(status) , خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ± ", MyVC: self)
case 500:
MessageBox.Show(Message: "error with response status: \(status) , خطأ ÙÙ Ø§ÙØ³ÙرÙÙØ± ", MyVC: self)
default:
print("Error")
}
}
}
Le problème est: Les éléments du tableau n'apparaissent pas dans la réponse de référence du serveur
J'utilise le pod Alamofire et le pod SwiftyJson avec iOS 13, Swift 5 et Xcode 11.
p >
3 Réponses :
Veuillez essayer cet exemple:
var apiRequest = URLRequest(url: url)
apiRequest.httpMethod = "POST"
apiRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
let levels = ["+972569431827","+972598110437","+972592923343","3555656","00970567163651","258258"]
apiRequest.httpBody = try! JSONSerialization.data(withJSONObject: values)
Alamofire.request(apiRequest)
.responseJSON { response in
switch response.result {
case .failure(let error):
print(error)
if let data = response.data, let responseStr = String(data: data, encoding: .utf8) {
print(responseStr)
}
case .success(let responseValue):
print(responseValue)
}
}
Il y a un problème avec les conversations application / x-www-form-urlencodées dans Alamofire / Swift. Cela fonctionne à la manière du facteur. Postman convertit automatiquement votre tableau, mais pas Swift.
struct ArrayEncoding: ParameterEncoding {
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
var request = try URLEncoding().encode(urlRequest, with: parameters)
request.url = URL(string: request.url!.absoluteString.replacingOccurrences(of: "%5B%5D=", with: "="))
return request
}
}
Comment l'utiliser dans la DEMANDE ??
Voici comment je fais la demande de poste en envoyant un tableau: (Alamofire v5)
let apiInputs = [
"input1": "example1",
"input2": "example2",
"input3": "example3",
"inputN": "exampleN",
]
AF.upload(multipartFormData: { multipartFormData in
for (key, value) in apiInputs {
multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) } // End for multipart form data.
}, to: "https://example.com/api")
.responseJSON { response in
debugPrint(response)
}
Je vous laisse la documentation officielle:
p>