es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Multipart Form Data POST con requisitos específicos de JSON

Soy nuevo en Alamofire y ahora estoy usando Alamofire 5. Quiero crear una solicitud POST con datos de formulario multipartes, pero hay un requisito específico para el cuerpo JSON. Aquí está:

"item": [
    {
        "name": "Subir imagen",
        "request": {
            "method": "POST",
            "header": [],
            "body": {
                "mode": "formdata",
                "formdata": [
                    {
                        "key": "files[]",
                        "type": "file",
                        "src": []
                    },
                    {
                        "key": "mode",
                        "value": "public",
                        "type": "text"
                    }
                ]
            },
            "url": {
                "raw": "https://jsonplaceholder.typicode.com/api/image/upload",
                "protocol": "https",
                "host": [
                    "jsonplaceholder",
                    "typicode",
                    "com"
                ],
                "path": [
                    "api",
                    "image",
                    "upload"
                ]
            }
        },
        "response": []
    }
]

¿Alguien puede ayudarme a cómo enviar los datos pero con datos de formulario multipartes? Por favor, ayúdame.
(Esta bien si la solicitud POST usa URLSession)

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear una solicitud POST con datos de formulario multipart en Alamofire 5, puedes usar el siguiente código:

    AF.upload(multipartFormData: { multipartFormData in
        multipartFormData.append(fileData, withName: "files[]")
        multipartFormData.append("public".data(using: .utf8)!, withName: "mode")
    }, to: "https://jsonplaceholder.typicode.com/api/image/upload")
    .response { response in
        debugPrint(response)
    }
    

    Suponiendo que fileData es el objeto Data que deseas enviar, este código lo agrega al formulario multipart con la clave adecuada (files[]). El valor mode también se agrega como una cadena con la clave mode.

    Ten en cuenta que los datos de formulario multipart se envían a la URL especificada en el parámetro to del método AF.upload. El punto final de la API que estás utilizando (`https://jsonplaceholder.typicode.com/api/image/upload`) debería poder manejar la carga de archivos y otros datos de formulario.

    Si prefieres utilizar URLSession en su lugar, puedes utilizar el siguiente código como punto de partida:

    guard let url = URL(string: "https://jsonplaceholder.typicode.com/api/image/upload") else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    
    let boundary = UUID().uuidString
    request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")
    
    var body = Data()
    body.append("--\(boundary)\r\n")
    body.append("Content-Disposition: form-data; name=\"files[]\"; filename=\"file.jpg\"\r\n")
    body.append("Content-Type: image/jpeg\r\n\r\n")
    body.append(fileData)
    body.append("\r\n")
    
    body.append("--\(boundary)\r\n")
    body.append("Content-Disposition: form-data; name=\"mode\"\r\n\r\n")
    body.append("public")
    body.append("\r\n")
    
    body.append("--\(boundary)--\r\n")
    
    request.httpBody = body
    
    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error?.localizedDescription ?? "Unknown error")
            return
        }
        print(String(data: data, encoding: .utf8) ?? "")
    }.resume()
    

    Este código configura las cabeceras y el cuerpo necesarios para enviar una solicitud de datos de formulario multipart. El objeto fileData se agrega al cuerpo con el nombre de archivo y el tipo de contenido adecuados, y el valor mode también se agrega como una cadena.

    Ten en cuenta que la cadena de límite utilizada en este ejemplo (UUID().uuidString) es un valor generado aleatoriamente que separa cada parte de los datos del formulario. Debes utilizar una cadena de límite única para cada solicitud.

Comments are closed.