2017-09-06 1 views
0

J'ai un problème avec Alamofire. Lorsque j'essaie de poster une requête en utilisant des paramètres génériques comme ["name":"John", "age":"27"], ça réussit toujours. Mais lorsque j'essaie d'utiliser un service Web qui nécessite des paramètres et un corps brut pour une chaîne base64, je ne parviens pas à obtenir une réponse satisfaisante du serveur. Bien qu'il réussisse quand j'utilise Postman. Est-ce que quelqu'un sait comment faire cela sur Alamofire 4? Voici la capture d'écran de mon facteur.Réplication de la méthode de publication dans Postman avec paramètres et body-raw dans Alamofire

postman screenshot

Merci!

+0

Pourriez-vous fournir le code Swift qui renvoie une réponse incorrecte? – nathan

+0

Copie possible de [demande POST avec une chaîne simple dans le corps avec Alamofire] (https://stackoverflow.com/questions/27855319/post-request-with-a-simple-string-inbody-with-alamofire) – nathan

Répondre

0

Je l'ai déjà compris. Il a besoin d'un encodage personnalisé pour le faire fonctionner. Tous les paramètres doivent être insérés dans l'url afin que la chaîne base64 à l'intérieur du paramètre soit la seule à être encodée. Voici le code que j'ai utilisé.

struct CustomPostEncoding: ParameterEncoding { 
func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest { 
    var request = try URLEncoding().encode(urlRequest, with: parameters) 

    let base64 = parameters?["data"] as! String 
    let finalBase64Format = "\"" + base64 + "\"" 
    let postData = NSData(data: finalBase64Format.data(using: String.Encoding.utf8)!) 
    request.httpBody = postData as Data 
    return request 
} 
} 

func uploadImageBase64(){ 


    let jpegCompressionQuality: CGFloat = 0.9 // Set this to whatever suits your purpose 
    if let base64String = UIImageJPEGRepresentation(testIMG, jpegCompressionQuality)?.base64EncodedString() { 

     var token = String() 
     if let data = UserDefaults.standard.data(forKey: "userProfile"), 
      let user = NSKeyedUnarchiver.unarchiveObject(with: data) as? UserProfile{ 
      token = user.token 
     } else { 
      print("There is an issue") 
     } 

     let headers = [ 
      "content-Type": "application/json" 
     ] 
     let urlString = "http://localhost/FormsService.svc/Getbase64?filename=test.png&fileID=1151&token=80977580xxx" 
     let paramsDict = ["data": base64String] as [String : Any] 
     Alamofire.request(urlString, method: .post, parameters: paramsDict, encoding: CustomPostEncoding(), headers: headers) 

      .responseJSON{ response in 
       print("response JSON \(response.result)") 
     } 
      .response{ response in 
       print("RESPONSE \(response)") 
     } 

    } 
} 
0

@ nathan- c'est le code que j'ai utilisé. J'ai juste supposé que le base64String à l'intérieur du "laissez paramsDict" a une valeur clé nommée "données" bien qu'il n'ait pas de nom de clé dans le facteur.

let urlString = ApiManager.sharedInstance.formsURL + ApiManager.sharedInstance.mobileFormsImageUpload 
     let paramsDict = ["token": token, "fileID":"2", "filename":"images.png", "data": base64String] as [String : Any] 

     Alamofire.request(urlString, method: .post, parameters: paramsDict, encoding: URLEncoding.httpBody, headers: [:]) 
      .responseJSON{ response in 

       switch response.result { 
       case .success(let data): 

        debugPrint("SUCCESS") 


       case .failure(let error): 
        debugPrint("Request Error") 

       } 
     }