16. Creating method to send request
16. Creación del método para enviar la solicitud a la API
¡Hola y bienvenido de nuevo!
En esta lección vamos a hacer la parte más emocionante - ¡enviar realmente nuestra solicitud a la API de OpenAI! Hasta ahora hemos preparado todo: la URL, las cabeceras y los datos. Ahora es el momento de conectar todo y recibir la respuesta.
🎯 ¿Qué vamos a crear?
Vamos a crear el método convert() que:
Inicia una sesión cURL
Configura todas las opciones
Envía la solicitud HTTP
Recibe y procesa la respuesta
Cierra la conexión
🔍 ¿Qué es cURL?
cURL (Client URL) es una herramienta de línea de comandos y biblioteca para transferir datos usando varios protocolos (HTTP, HTTPS, FTP, etc.).
Analogía simple:
cURL es como un cartero digital que:
Va a una dirección (URL)
Lleva un paquete (datos)
Muestra su identificación (cabeceras)
Trae de vuelta la respuesta
🛠️ Vamos a crear el método convert()
php
/**
* Método principal para enviar la solicitud a la API de OpenAI
*
* @return array|bool Respuesta de la API o false si falla
*/
public function convert()
{
// 1. Obtenemos la URL correcta
$apiUrl = $this->getApiUrl();
// 2. Inicializamos cURL
$ch = curl_init($apiUrl);
// 3. Configuramos que será una solicitud POST
curl_setopt($ch, CURLOPT_POST, true);
// 4. Preparamos el archivo si es necesario
$this->getFile();
// 5. Establecemos los datos a enviar
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getData());
// 6. Agregamos las cabeceras HTTP
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());
// 7. Decimos que queremos recibir la respuesta como string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 8. Ejecutamos la solicitud
$response = curl_exec($ch);
// 9. Cerramos la conexión cURL
curl_close($ch);
// 10. Procesamos la respuesta
if($response){
return json_decode($response, true); // Convertimos JSON a array
}else{
$this->error = "API REQUEST FAILED";
return false;
}
}
🔧 Método auxiliar: getFile()
php
/**
* Prepara el archivo para cURL (solo para ASR)
*/
public function getFile()
{
if($this->dataType === 'ASR'){
// curl_file_create() crea un objeto especial para enviar archivos
$this->file = curl_file_create($this->file);
}
}
¿Por qué necesitamos esto?
Para ASR: Necesitamos enviar un archivo real
curl_file_create() prepara el archivo para enviarlo correctamente vía POST
Para traducción: Solo enviamos texto, no archivos
📊 Proceso completo visualizado
text
┌─────────────────────────────────────────────────────────────┐
│ PROCESO DE ENVÍO cURL │
├─────────────────────────────────────────────────────────────┤
│ PASO 1: curl_init($apiUrl) │
│ → Crea una nueva sesión cURL │
│ │
│ PASO 2: curl_setopt() CONFIGURACIONES: │
│ ├── CURLOPT_POST: true │
│ ├── CURLOPT_POSTFIELDS: $this->getData() │
│ ├── CURLOPT_HTTPHEADER: $this->getHeader() │
│ └── CURLOPT_RETURNTRANSFER: true │
│ │
│ PASO 3: $this->getFile() (solo para ASR) │
│ → Prepara el archivo con curl_file_create() │
│ │
│ PASO 4: curl_exec($ch) │
│ → Ejecuta la solicitud y obtiene respuesta │
│ │
│ PASO 5: curl_close($ch) │
│ → Cierra la sesión cURL │
│ │
│ PASO 6: json_decode($response, true) │
│ → Convierte JSON a array PHP │
└─────────────────────────────────────────────────────────────┘
🎨 Analogía: La Fábrica de Transformación
Imagina que tenemos una fábrica mágica (OpenAI API):
text
TU APLICACIÓN FÁBRICA OPENAI
══════════════════════════════ ════════════════════════════
📦 Paquete a enviar: 🏭 Proceso en la fábrica:
• Dirección: getApiUrl() 1. Verifica credenciales
• Credenciales: getHeader() 2. Revisa qué tipo de trabajo
• Contenido: getData() 3. Procesa según instrucciones
4. Empaca resultado
🚚 Camión cURL: 📬 Respuesta que recibes:
1. Inicia viaje: curl_init() • Para ASR: {"text": "Hola mundo"}
2. Configura carga • Para traducción: {"choices": [...]}
3. Entrega paquete: curl_exec()
4. Vuelve con respuesta
5. Cierra viaje: curl_close()
🔍 Explicación detallada de cada paso
1. Inicializar cURL: curl_init()
php
$ch = curl_init($apiUrl);
Crea un nuevo "viaje" cURL
$ch = "cURL handle" (manejador de la sesión)
Es como abrir una nueva pestaña en el navegador
2. Configurar como POST: CURLOPT_POST
php
curl_setopt($ch, CURLOPT_POST, true);
Le decimos: "Vamos a ENVIAR datos" (no solo a pedir)
3. Enviar datos: CURLOPT_POSTFIELDS
php
curl_setopt($ch, CURLOPT_POSTFIELDS, $this->getData());
Adjuntamos nuestro "paquete" (datos preparados)
4. Agregar cabeceras: CURLOPT_HTTPHEADER
php
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getHeader());
Agregamos nuestras "credenciales e instrucciones"
5. Recibir respuesta: CURLOPT_RETURNTRANSFER
php
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
IMPORTANTE: Sin esto, cURL mostraría la respuesta directamente
Con true: Guarda la respuesta en una variable
6. Ejecutar: curl_exec()
php
$response = curl_exec($ch);
¡Aquí ocurre la magia! Se envía todo y se recibe respuesta
Puede tomar unos segundos según el tamaño del archivo
7. Cerrar conexión: curl_close()
php
curl_close($ch);
Buena práctica: Liberar recursos
Como cerrar la pestaña del navegador
🚀 Cómo usar el método en index.php
php
// En tu index.php, después de subir el archivo:
if(isset($_FILES['file'])){
if(!empty($_FILES['file']['name'][0])){
// 1. Subir archivo
$file = $whisperObj->upload($_FILES['file']);
if($file){
// 2. Configurar para ASR
$whisperObj->dataType = 'ASR';
$whisperObj->file = $file;
// 3. ENVIAR A LA API (¡NUEVO!)
$resultado = $whisperObj->convert();
// 4. Mostrar resultado
echo "<pre>";
print_r($resultado);
echo "</pre>";
// Resultado típico:
// Array
// (
// [text] => "Hola, esto es una prueba de audio"
// )
}
}
}
📝 Ejemplo completo en acción
Archivo de audio: "saludo.mp3"
Contiene: "Hola mundo, esto es una prueba"
Proceso:
php
// 1. Usuario sube saludo.mp3
// 2. upload() guarda el archivo
// 3. convert() envía a OpenAI
$respuesta = $whisperObj->convert();
// Respuesta recibida:
Array
(
[text] => "Hola mundo, esto es una prueba"
)
// 4. Podemos usar el texto:
echo $respuesta['text']; // Muestra: Hola mundo, esto es una prueba
🔍 Correcciones importantes
En el código original hay que corregir:
php
// ERROR común (typos):
'Authorication: Bearer ' . API_TOKEN // ← MAL
'Content-Type: mutlipart/form-data' // ← MAL
// CORRECTO:
'Authorization: Bearer ' . API_TOKEN // ← BIEN
'Content-Type: multipart/form-data' // ← BIEN
💡 Consejos para depuración
Si algo falla, puedes agregar:
php
public function convert()
{
$apiUrl = $this->getApiUrl();
echo "URL: $apiUrl<br>"; // Debug
$ch = curl_init($apiUrl);
// Si hay error:
curl_setopt($ch, CURLOPT_VERBOSE, true); // Muestra detalles
curl_setopt($ch, CURLOPT_FAILONERROR, true); // Falla si hay error HTTP
// ... resto del código
if(curl_errno($ch)){
echo 'cURL Error: ' . curl_error($ch); // Muestra error cURL
}
}
📊 Diagrama de flujo del proceso completo
text
┌─────────────────────────────────────────────────────┐
│ PROCESO COMPLETO: USUARIO → API → RESPUESTA │
├─────────────────────────────────────────────────────┤
│ 1. USUARIO: Sube archivo audio/video │
│ ↓ │
│ 2. upload(): Guarda archivo en servidor │
│ ↓ │
│ 3. dataType = 'ASR' │
│ file = 'ruta/del/archivo' │
│ ↓ │
│ 4. convert(): │
│ ├── getApiUrl() → URL correcta │
│ ├── getHeader() → Cabeceras con API Key │
│ ├── getFile() → Prepara archivo para cURL │
│ ├── getData() → {'file':..., 'model':'whisper-1'}│
│ ├── curl_init() → Inicia sesión │
│ ├── curl_setopt() → Configura todo │
│ ├── curl_exec() → ¡ENVÍA! │
│ └── curl_close() → Cierra conexión │
│ ↓ │
│ 5. Respuesta JSON → Array PHP │
│ ↓ │
│ 6. Mostrar texto transcrito al usuario │
└─────────────────────────────────────────────────────┘
🎯 Puntos Clave para Recordar
curl_init() → Inicia una nueva sesión cURL
curl_setopt() → Configura las opciones (POST, datos, cabeceras)
CURLOPT_RETURNTRANSFER → ESENCIAL para guardar respuesta en variable
curl_exec() → Ejecuta la solicitud (puede ser lento)
curl_close() → Siempre cerrar la sesión
json_decode() → Convierte JSON de OpenAI a array PHP
📋 Cuestionario de Repaso
Pregunta 1:
¿Qué hace la función curl_file_create()?
a) Crea un nuevo archivo en el disco
b) Prepara un archivo existente para enviarlo vía cURL
c) Convierte texto a archivo de audio
d) Codifica archivos en base64
Pregunta 2:
¿Por qué es importante CURLOPT_RETURNTRANSFER = true?
a) Para que cURL sea más rápido
b) Para enviar archivos más grandes
c) Para que la respuesta se guarde en una variable en vez de mostrarse
d) Para habilitar la compresión de datos
Pregunta 3:
¿Qué método llamamos para preparar el archivo antes de enviarlo?
a) upload()
b) getData()
c) getFile()
d) prepareFile()
Pregunta 4:
¿Qué hace json_decode($response, true)?
a) Codifica un array a JSON
b) Decodifica JSON a array asociativo PHP
c) Valida si un string es JSON válido
d) Comprime datos JSON
Pregunta 5:
¿Cuál es el ORDEN CORRECTO de operaciones cURL?
a) curl_exec → curl_setopt → curl_init → curl_close
b) curl_init → curl_close → curl_setopt → curl_exec
c) curl_init → curl_setopt → curl_exec → curl_close
d) curl_setopt → curl_init → curl_exec → curl_close
📝 Respuestas del Cuestionario
b) curl_file_create() toma un archivo existente y lo prepara para ser enviado correctamente mediante cURL con multipart/form-data.
c) Sin CURLOPT_RETURNTRANSFER = true, cURL imprimiría la respuesta directamente en lugar de guardarla en una variable para procesarla.
c) getFile() es el método específico que prepara el archivo con curl_file_create() cuando es una operación ASR.
b) json_decode($response, true) convierte el string JSON recibido de la API en un array asociativo PHP (el true es clave para array, no objeto).
c) El orden correcto es: 1) Inicializar, 2) Configurar opciones, 3) Ejecutar, 4) Cerrar.
🚀 Lo que viene después
¡Increíble! Ahora podemos:
✅ Subir archivos
✅ Enviarlos a OpenAI
✅ Recibir el texto transcrito
En la próxima lección vamos a:
Guardar los resultados en la base de datos
Mostrar archivos recientes
Crear la página para ver transcripciones
✨ ¡Felicidades! Has creado el corazón de tu aplicación. Ahora los archivos de audio realmente se convierten en texto gracias a la IA.
Comentarios
Publicar un comentario