¿cómo es posible que para enviar una petición POST con una simple cadena de caracteres en el cuerpo HTTP con Alamofire en mi app de iOS?

Como predeterminado Alamofire necesidades de los parámetros de la petición:

Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"])

Estos parámetros contienen clave-valor en los pares. Pero no quiero enviar una solicitud con una llave de cadena de valor en el cuerpo HTTP.

Me refiero a algo como esto:

Alamofire.request(.POST, "http://mywebsite.com/post-request", body: "myBodyString")
InformationsquelleAutor Karl | 2015-01-09

10 Comentarios

  1. 82

    Su ejemplo Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: ["foo": "bar"]) ya contiene «foo=bar» de la cadena como su cuerpo.
    Pero si realmente quieres cadena con formato personalizado. Usted puede hacer esto:

    Alamofire.request(.POST, "http://mywebsite.com/post-request", parameters: [:], encoding: .Custom({
                (convertible, params) in
                var mutableRequest = convertible.URLRequest.copy() as NSMutableURLRequest
                mutableRequest.HTTPBody = "myBodyString".dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
                return (mutableRequest, nil)
            }))

    Nota: parameters no debe ser nil

    ACTUALIZACIÓN (Alamofire 4.0, Swift 3.0):

    En Alamofire 4.0 API ha cambiado. Así que para la codificación personalizada necesitamos valor/objeto que se ajusta a ParameterEncoding protocolo.

    extension String: ParameterEncoding {
    
        public func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
            var request = try urlRequest.asURLRequest()
            request.httpBody = data(using: .utf8, allowLossyConversion: false)
            return request
        }
    
    }
    
    Alamofire.request("http://mywebsite.com/post-request", method: .post, parameters: [:], encoding: "myBody", headers: [:])
    • Esto funciona perfectamente, no sólo por simple pero todos los tipos de JSON tipo asignado cadenas.
    • salvó mi día 🙂 Gracias (y)
    • en mi situación no puede obtener sin formato de solicitud de backend sólo si utilizo el método PUT, podrían por favor ayudarme, ¿por qué solicitud POST no se ve nada
    • .Personalizado no está disponible ya en Alamofire 4 Swift 3, y no soy capaz de encontrar la alternativa, alguna pista?
    • actualizado
    • He publicado pregunta demasiado, por favor conteste que para que yo pueda cerrar: stackoverflow.com/questions/39573514/…
    • no funciona para mí. Convierte «myBody» a { myBody: '' }. Swift 3. Alamofire 4.0.0.
    • No puedo decirle lo que estás haciendo mal. Acabo de doble comprobado y funciona. $ curl -i \ -X POST \ -H "Accept-Language: en;q=1.0" \ -H "User-Agent: TestCalendar/1.0 (com.test.alamofire; build:1; iOS 10.0.0) Alamofire/4.0.0" \ -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \ -d "myBody" \ "http://mywebsite.com/post-request"
    • el parámetro de codificación no se supone que es una Cadena
    • compruebe por favor mi respuesta: no es un ejemplo de cómo la cadena puede ser un válido parámetro de codificación con una ayuda de la extensión
    • He publicado una pregunta como esta aquí si puedes por favor compartir una respuesta stackoverflow.com/questions/40385992/…
    • Esto es genial 🙂 🙂 @quemeful la Cadena está hecha para extender ParameterEncoding en la primera pardo, e del código
    • Suena como una solución, pero funciona…
    • Funciona a la perfección. Este debe marcar la respuesta correcta.
    • con Alamofire 4.7.3, Swift 4.2 y Xcode 10 todo se ve perfecto
    • Se puede saber cómo usarlo con más detalle? qué hacer con codificar la función?
    • La última línea Alamofire.request(.... muestra el uso de la. encode método es llamado por Alamofire en la petición de poner String valor en la solicitud del cuerpo con la ayuda de encode método
    • Este no es el envío de mensajes mediante el cuerpo, es la publicación de parámetros

  2. 49

    Usted puede hacer esto:

    1. He creado un separado solicitud Alamofire objeto.
    2. Convertir la cadena a Datos
    3. Poner en httpBody los datos

      var request = URLRequest(url: URL(string: url)!)
      request.httpMethod = HTTPMethod.post.rawValue
      request.setValue("application/json", forHTTPHeaderField: "Content-Type")
      
      let pjson = attendences.toJSONString(prettyPrint: false)
      let data = (pjson?.data(using: .utf8))! as Data
      
      request.httpBody = data
      
      Alamofire.request(request).responseJSON { (response) in
      
      
          print(response)
      
      }
    • Esto debe ser aceptado respuesta. Es simple, hace exactamente lo que se necesita, y sin las extensiones innecesarias o conversiones. Gracias, hombre.
    • P. S. me ha «prestado» su respuesta de otra pregunta – stackoverflow.com/a/42411188/362305
    • ¿qué es attendences, puede plz publicar un fragmento de fuller
    • No importa lo asistencias son, el sólo pensar que es importante es pjson es una cadena json. Usted puede poner cualquier cadena json allí.
  3. 11

    Si utiliza Alamofire, es suficiente para el tipo de codificación para «URLEncoding.httpBody»

    Con eso, usted puede enviar sus datos como una cadena en la httpbody aunque usted la ha definido json en el código.

    A mí me funcionó..

    ACTUALIZADO para

      var url = "http://..."
        let _headers : HTTPHeaders = ["Content-Type":"application/x-www-form-urlencoded"]
        let params : Parameters = ["grant_type":"password","username":"mail","password":"pass"]
    
        let url =  NSURL(string:"url" as String)
    
        request(url, method: .post, parameters: params, encoding: URLEncoding.httpBody , headers: _headers).responseJSON(completionHandler: {
            response in response
    
            let jsonResponse = response.result.value as! NSDictionary
    
            if jsonResponse["access_token"] != nil
            {
                access_token = String(describing: jsonResponse["accesstoken"]!)
    
            }
    
        })
    • ¿Puede dar un ejemplo con el código ?
    • i ll actualizar mi respuesta y escribir el código de un usado, porque no pude encontrar cómo escribir código como un comentario de aqui.. lo Siento por [email protected] Filali
    • Gracias que gran
    • Trabajó para mí, pero mi cuerpo necesita ser un JSON, así que, he cambiado la codificación: URLEncoding.httpBody de la codificación: JSONEncoding.por defecto y todo funcionaba bien.
    • Sí @AngeloPolotto gracias por contrubition:) Esto es acerca de la codificación del tipo de servicio. Puede ser utilizado en función de su api rest como URLEncoding o JSONEncoding.
    • Gracias por la respuesta. Pero el problema que estoy enfrentando es cuando puedo enviar una variable en lugar de double quotes strings y obtener el código de error 400. ¿Cómo puedo solucionar eso?
    • Me pueden enviar el código de ejemplo puede ser me pueden ayudar mejor con esta manera @viper
    • Esto es lo que hice :- vamos parámetros = [ «password»(contraseña:»[email protected]», «grant_type»:»contraseña», «client_id»:»Sipradi-mbl», «client_secret»:»295265f0-c060-4782-9688-36854dba9af5″, «margen»:»offline_access», «nombre de usuario»: edtEmail?.el texto ] @CemalBAYRI
    • yo quería compartir conmigo la obtención de func que se llama Alamofire. No veo ningún problema en esta línea de código. si es posible me pueden ayudar mejor
    • No estoy recibiendo problema, mientras que la captura de datos si reemplazar edtEmail?.text o cualquier valor dinámico con una estática comillas dobles de cadena.
    • ¿Unwrap «edtMail.el texto?» ?? Pueden ser tus campos de texto o etc. los elementos son nulos?

  4. 8

    He modificado @Silmaril de la respuesta a extender Alamofire del Administrador.
    Esta solución utiliza EVReflection para serializar un objeto directamente:

    //Extend Alamofire so it can do POSTs with a JSON body from passed object
    extension Alamofire.Manager {
        public class func request(
            method: Alamofire.Method,
            _ URLString: URLStringConvertible,
              bodyObject: EVObject)
            -> Request
        {
            return Manager.sharedInstance.request(
                method,
                URLString,
                parameters: [:],
                encoding: .Custom({ (convertible, params) in
                    let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
                    mutableRequest.HTTPBody = bodyObject.toJsonString().dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
                    return (mutableRequest, nil)
                })
            )
        }
    }

    A continuación, se puede utilizar como esto:

    Alamofire.Manager.request(.POST, endpointUrlString, bodyObject: myObjectToPost)
  5. 5

    Si desea publicar en la cadena de formato raw cuerpo en la solicitud

    return Alamofire.request(.POST, "http://mywebsite.com/post-request" , parameters: [:], encoding: .Custom({
                (convertible, params) in
                let mutableRequest = convertible.URLRequest.copy() as! NSMutableURLRequest
    
                let data = ("myBodyString" as NSString).dataUsingEncoding(NSUTF8StringEncoding)
                mutableRequest.HTTPBody = data
                return (mutableRequest, nil)
            }))
  6. 4

    Lo he hecho de una matriz de cadenas. Esta solución se ajusta cadena en el cuerpo.

    El «nativo» de manera de Alamofire 4:

    struct JSONStringArrayEncoding: ParameterEncoding {
        private let myString: String
    
        init(string: String) {
            self.myString = string
        }
    
        func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
            var urlRequest = urlRequest.urlRequest
    
            let data = myString.data(using: .utf8)!
    
            if urlRequest?.value(forHTTPHeaderField: "Content-Type") == nil {
                urlRequest?.setValue("application/json", forHTTPHeaderField: "Content-Type")
            }
    
            urlRequest?.httpBody = data
    
            return urlRequest!
        }
    }

    Y, a continuación, hacer su solicitud con:

    Alamofire.request("your url string", method: .post, parameters: [:], encoding: JSONStringArrayEncoding.init(string: "My string for body"), headers: [:])
  7. 2
    func paramsFromJSON(json: String) -> [String : AnyObject]?
    {
        let objectData: NSData = (json.dataUsingEncoding(NSUTF8StringEncoding))!
        var jsonDict: [ String : AnyObject]!
        do {
            jsonDict = try NSJSONSerialization.JSONObjectWithData(objectData, options: .MutableContainers) as! [ String : AnyObject]
            return jsonDict
        } catch {
            print("JSON serialization failed:  \(error)")
            return nil
        }
    }
    
    let json = Mapper().toJSONString(loginJSON, prettyPrint: false)
    
    Alamofire.request(.POST, url + "/login", parameters: paramsFromJSON(json!), encoding: .JSON)
    • ¿Qué es Mapper?
  8. 2

    He usado respuesta de @afrodev como referencia. En mi caso me tome el parámetro a mi función como una cadena de texto que tiene que ser publicado en la solicitud. Así que, aquí está el código:

    func defineOriginalLanguage(ofText: String) {
        let text =  ofText
        let stringURL = basicURL + "identify?version=2018-05-01"
        let url = URL(string: stringURL)
    
        var request = URLRequest(url: url!)
        request.httpMethod = HTTPMethod.post.rawValue
        request.setValue("text/plain", forHTTPHeaderField: "Content-Type")
        request.httpBody = text.data(using: .utf8)
    
        Alamofire.request(request)
            .responseJSON { response in
                print(response)
        }
    }
    • Qué es exactamente lo que no se consigue?
  9. 0

    Basado en Illya Krit‘s respuesta

    Detalles

    • Versión de Xcode 10.2.1 (10E1001)
    • Swift 5
    • Alamofire 4.8.2

    Solución

    import Alamofire
    
    struct BodyStringEncoding: ParameterEncoding {
    
        private let body: String
    
        init(body: String) { self.body = body }
    
        func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest {
            guard var urlRequest = urlRequest.urlRequest else { throw Errors.emptyURLRequest }
            guard let data = body.data(using: .utf8) else { throw Errors.encodingProblem }
            urlRequest.httpBody = data
            return urlRequest
        }
    }
    
    extension BodyStringEncoding {
        enum Errors: Error {
            case emptyURLRequest
            case encodingProblem
        }
    }
    
    extension BodyStringEncoding.Errors: LocalizedError {
        var errorDescription: String? {
            switch self {
                case .emptyURLRequest: return "Empty url request"
                case .encodingProblem: return "Encoding problem"
            }
        }
    }

    Uso

    Alamofire.request(url, method: .post, parameters: nil, encoding: BodyStringEncoding(body: text), headers: headers).responseJSON { response in
         print(response)
    }
  10. -3

    Xcode 8.X , Swift 3.X

    Fácil De Usar;

     let params:NSMutableDictionary? = ["foo": "bar"];
                let ulr =  NSURL(string:"http://mywebsite.com/post-request" as String)
                let request = NSMutableURLRequest(url: ulr! as URL)
                request.httpMethod = "POST"
                request.setValue("application/json", forHTTPHeaderField: "Content-Type")
                let data = try! JSONSerialization.data(withJSONObject: params!, options: JSONSerialization.WritingOptions.prettyPrinted)
    
                let json = NSString(data: data, encoding: String.Encoding.utf8.rawValue)
                if let json = json {
                    print(json)
                }
                request.httpBody = json!.data(using: String.Encoding.utf8.rawValue);
    
    
                Alamofire.request(request as! URLRequestConvertible)
                    .responseJSON { response in
                        //do whatever you want here
                       print(response.request)  
                       print(response.response) 
                       print(response.data) 
                       print(response.result)
    
                }

Dejar respuesta

Please enter your comment!
Please enter your name here