Ir al contenido

HTTP POST

Tipo: http-post  ·  Paquete: HTTP Activities v1.0.5  ·  Salida: ZoanHttpResponse

Envía una petición POST, normalmente para crear un recurso o enviar datos a una API: registrar un cliente, enviar un formulario, disparar una acción. A diferencia de GET, incluye un cuerpo (body) con los datos.

Envía el body a la url y devuelve un ZoanHttpResponse.

  • Cuerpo: con el contentType por defecto (application/json) el body se convierte a JSON — un diccionario se envía como objeto, una lista como arreglo. Con cualquier otro contentType, el body se envía como texto tal cual. Siempre en UTF-8. Ver cuerpo y Content-Type.
  • Códigos de respuesta: con 2xx termina bien; cualquier otro código hace fallar la actividad — ver qué códigos hacen fallar la actividad.
  • Tiempos: 30 s para conectar y, por defecto, 5 min para la petición completa (parámetro timeout). Si se agotan, la actividad falla con un error normal que Try / Catch y Retry capturan — ver tiempos de espera.
  • No es idempotente: repetir un POST suele crear el recurso dos veces. Antes de envolverlo en Retry, confirma que la API lo tolera (por ejemplo, con una clave de idempotencia en headers, si la API la ofrece).
ParámetroTipoPor defectoDescripción
urlstring—URL absoluta de la petición (https://…).
bodyobject—El cuerpo: un diccionario o lista (se envía como JSON) o un texto (para otros contentType). Con contentType JSON, un texto se envía como cadena JSON entre comillas; si tienes JSON en un texto, usa parseJson(texto).
ParámetroTipoPor defectoDescripción
contentTypestring"application/json"Tipo de medio del cuerpo, sin parámetros (ej. application/json, text/xml, application/x-www-form-urlencoded). charset=utf-8 se agrega solo.
headersDictionary—Cabeceras extra (nombre → valor), en el editor JSON. Las cabeceras de contenido se ignoran: usa contentType. Ver cabeceras.
authorizationDictionary—Autenticación en el editor JSON: bearer, basic o apikey. Ver autenticación.
timeoutint300Segundos que se espera la petición completa (conexión, envío y respuesta); máximo 3600, admite decimales (0.5). Desde la versión 1.0.5. Ver tiempos de espera.

Devuelve un ZoanHttpResponse con .StatusCode (2xx; las APIs suelen responder 201 al crear), .Ok (siempre true en una salida recibida), .Body (JSON → diccionario/lista; otra cosa → texto; vacío → "") y .Headers. Muchas APIs devuelven en .Body el recurso creado con su nuevo id, o su ubicación en resp.Headers["Location"].

MensajeCausa y solución
El servidor respondió HTTP 400 (Bad Request) a la solicitud POST.El servidor rechazó la petición (400 datos inválidos, 401/403 autenticación, 409 duplicado, 5xx error del servidor). El mensaje no trae el cuerpo de la respuesta: revisa el formato que espera la API. Para manejarlo, usa Try / Catch.
The format of value 'application/json; charset=utf-8' is invalid.contentType lleva parámetros. Deja solo el tipo de medio (application/json); el charset UTF-8 se agrega solo.
No such host is known. (u otro error de red del sistema)No hubo respuesta (nombre de servidor, red, certificado). error.Type es "HttpRequestException".
La solicitud POST a api.ejemplo.com no terminó en 300 s (tiempo de espera agotado). Sube «Tiempo de espera» si el servicio tarda más.El servidor no respondió dentro de timeout. error.Type es \"TimeoutException\": captúralo con Try / Catch o reintenta con Retry; si la API tarda por naturaleza, sube timeout. Si el fallo es al conectar, el mensaje dice No se pudo conectar con … en 30 s.
An invalid request URI was provided. Either the request URI must be an absolute URI or BaseAddress must be set.La url no es absoluta. Incluye https://.
'url' es obligatorio.La expresión de url dio nulo.

Desde la versión 1.0.5, si el servidor no responde a tiempo la actividad falla con un error capturable (TimeoutException); antes la ejecución terminaba como cancelada — ver tiempos de espera.

Crear un cliente enviando un objeto como JSON y usar el id que devuelve la API:

HTTP POST
url = "https://api.erp.com/clientes"
body = new Dictionary<string, object> { ["nombre"] = nombreCliente, ["nit"] = nit, ["activo"] = true }
authorization = { "type": "bearer", "token": credential("api-erp")["value"] }
→ output: resp
Set Variable name = nuevoId value = resp.Body["id"]
Log message = "Cliente creado con id " + nuevoId + " (HTTP " + resp.StatusCode + ")"

Enviar XML a un servicio que no usa JSON:

HTTP POST
url = "https://servicios.ejemplo.com/facturas"
contentType = "text/xml"
body = xmlFactura
→ output: resp
Log message = "Respuesta del servicio: " + str(resp.Body)