0Pricing
Lua Academy · Lección

Solicitudes HTTP

Obtenga recursos web

Solicitudes HTTP es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

El módulo socket.http

LuaSocket incluye un cliente HTTP de alto nivel en socket.http. Se basa en TCP sin cifrar, pero se encarga de dar formato a las solicitudes, gestionar los encabezados y descodificar los mensajes fragmentados.

Habla HTTP/1.1 sobre TCP sin cifrar. Para HTTPS necesita el módulo complementario ssl.https de LuaSec.

local http = require("socket.http")
print(http.PORT)

Un GET sencillo

La forma más sencilla recibe una URL y devuelve el cuerpo, el código de estado, los encabezados de respuesta y la línea de estado.

Un código de estado 200 indica que la operación se realizó correctamente. Un cuerpo nil indica un fallo en el nivel de transporte, no un error HTTP.

local http = require("socket.http")
local body, code, headers = http.request("http://example.com/")
print(code, #body)

Lectura del estado

Compruebe siempre el code numérico antes de confiar en el cuerpo. Un 404 también devuelve un cuerpo, en este caso la página de error, por lo que la llamada se completó correctamente en el nivel TCP.

El cuarto valor devuelto es la cadena de la línea de estado, como "HTTP/1.1 200 OK", y resulta útil para los registros.

local body, code, headers, status = http.request(url)
if code == 200 then
  process(body)
else
  print("unexpected:", status)
end

Inspección de encabezados

La tabla headers devuelta tiene las claves en minúsculas, por lo que puede leer headers["content-type"] independientemente de las mayúsculas y minúsculas utilizadas por el servidor.

Entre los campos habituales se encuentran content-length, content-type y location para las redirecciones.

local body, code, headers = http.request(url)
print(headers["content-type"])
print(headers["content-length"])

El formulario de solicitud genérico

Pasar una tabla a http.request proporciona un control total: método, encabezados personalizados, fuente del cuerpo de la solicitud y sumidero para la respuesta.

Esta forma devuelve 1 —no el cuerpo— además del código, los encabezados y el estado. El cuerpo se recopila mediante el sumidero.

local http = require("socket.http")
local ltn12 = require("ltn12")
local chunks = {}
http.request{
  url = "http://example.com/",
  sink = ltn12.sink.table(chunks)
}

Envío de un POST

Para POST, establezca method = "POST", proporcione una source con el cuerpo y establezca content-length. El asistente ltn12.source.string convierte una cadena de Lua en una fuente.

Establezca content-type para que coincida con la carga útil, como application/json.

local body = "{\"name\":\"Lua\"}"
http.request{
  url = url,
  method = "POST",
  source = ltn12.source.string(body),
  headers = {
    ["content-type"] = "application/json",
    ["content-length"] = tostring(#body)
  }
}

Recopilación del cuerpo con ltn12

LuaSocket transmite los datos mediante filtros de ltn12. Un sumidero consume fragmentos; ltn12.sink.table(t) los añade a una tabla que después puede combinar con table.concat.

Este modelo de transmisión mantiene bajo el uso de memoria para descargas grandes, en lugar de almacenarlo todo en un búfer de una sola vez.

local ltn12 = require("ltn12")
local t = {}
http.request{ url = url, sink = ltn12.sink.table(t) }
local full = table.concat(t)

Encabezados de solicitud personalizados

Añada autenticación, agentes de usuario o cookies mediante la tabla headers. Las claves deben estar en minúsculas, tal como las espera LuaSocket.

Por ejemplo, envíe un token de portador o un user-agent personalizado para que el servidor identifique correctamente a su cliente.

http.request{
  url = url,
  headers = {
    ["authorization"] = "Bearer " .. token,
    ["user-agent"] = "lua-client/1.0"
  }
}

Seguimiento de redirecciones

De forma predeterminada, socket.http sigue automáticamente las redirecciones de GET. Puede desactivar este comportamiento con redirect = false en la tabla de solicitudes para inspeccionar directamente la respuesta 3xx.

Si desactiva el seguimiento, lea headers["location"] para encontrar la siguiente URL.

local body, code, headers = http.request{
  url = url,
  redirect = false
}
if code == 301 then print("moved to", headers["location"]) end

Tiempos de espera y HTTPS

Establezca un tiempo de espera global para las llamadas HTTP con http.TIMEOUT = 10, ya que, de lo contrario, las descargas bloqueadas podrían detener el programa indefinidamente.

Como socket.http solo funciona con TCP sin cifrar, use require("ssl.https") de LuaSec para las URL https://; su API es equivalente a la de socket.http.

local http = require("socket.http")
http.TIMEOUT = 10
-- for TLS:
local https = require("ssl.https")
local body, code = https.request("https://example.com/")

Gestión de errores

Distinga dos niveles de fallo. Un fallo de transporte devuelve nil y una cadena de error, como "connection refused" o "timeout".

Un fallo de la aplicación devuelve un cuerpo con un código 4xx o 5xx. El código robusto comprueba primero el caso nil y, después, actúa según el código de estado.

local body, code = http.request(url)
if not body then
  print("transport error:", code)
elseif code >= 400 then
  print("http error:", code)
end

Comprobación rápida

Recuerde qué devuelve la forma simple de URL de http.request.

Resumen

Ha aprendido a usar el módulo socket.http: solicitudes GET simples que devuelven el cuerpo, el código y las cabeceras; la forma genérica de tabla con sumideros y fuentes de ltn12; cuerpos POST; cabeceras personalizadas; redirecciones y tiempos de espera.

También ha distinguido los errores de transporte (nil) de los errores de estado HTTP y ha visto que HTTPS necesita ssl.https de LuaSec. Así se completa el recorrido por las redes, desde TCP sin procesar hasta HTTP.

Preguntas frecuentes

¿La lección «Solicitudes HTTP» es gratis?

Sí — el texto completo de «Solicitudes HTTP» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Solicitudes HTTP»?

Obtenga recursos web Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Solicitudes HTTP»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos básicos de TCP
  2. Crear un cliente
  3. Crear un servidor
  4. Solicitudes HTTP
← Volver a Lua Academy