C. Escenario con datos incorrectos

Versión para imprimir.

1. El usuario activa la forma sin capturar datos

Forma

2. Se activa el código del evento submit

Forma

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

3. Se invoca el servicio, incluyendo los datos de la forma

Forma

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Request

POST /srv/valida.php HTTP/1.1 Accept: application/json, application/problem+json
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Connection: keep-alive
Content-Length: 230
Content-Type: multipart/form-data;
boundary=----WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Cookie: __gsas=ID=329641bd2728ff51:T=1743534294:RT=1743534294:S=ALNI_MavjA3FPY-hDE5wNZO5LxFSOVeIIQ; __test=6409d42a9d124b0fcecbb489e113453c
Host: srvvalida.rf.gd
Origin: http://srvvalida.rf.gd
Referer: http://srvvalida.rf.gd/?i=1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36

saludo:
nombre:
------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Content-Disposition: form-data; name="saludo"


------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Content-Disposition: form-data; name="nombre"


------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN--

srv/valida.php

$saludo = recibeTexto("saludo");
$nombre = recibeTexto("nombre");
if (
 $saludo === false
 || $saludo === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltasaludo.html",
  title: "Falta el saludo.",
 );
}
if (
 $nombre === false
 || $nombre === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltanombre.html",
  title: "Falta el nombre.",
 );
}
$resultado =
 "{$saludo} {$nombre}.";
devuelveJson($resultado);

Despierta y recibe request.

4. El servicio lee los datos

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Hace wait esperando response.

srv/valida.php

$saludo = recibeTexto("saludo");
$nombre = recibeTexto("nombre");
if (
 $saludo === false
 || $saludo === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltasaludo.html",
  title: "Falta el saludo.",
 );
}
if (
 $nombre === false
 || $nombre === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltanombre.html",
  title: "Falta el nombre.",
 );
}
$resultado =
 "{$saludo} {$nombre}.";
devuelveJson($resultado);

Request

POST /srv/valida.php HTTP/1.1 Accept: application/json, application/problem+json
Accept-Encoding: gzip, deflate
Accept-Language: es-ES,es;q=0.9,en;q=0.8
Connection: keep-alive
Content-Length: 230
Content-Type: multipart/form-data;
boundary=----WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Cookie: __gsas=ID=329641bd2728ff51:T=1743534294:RT=1743534294:S=ALNI_MavjA3FPY-hDE5wNZO5LxFSOVeIIQ; __test=6409d42a9d124b0fcecbb489e113453c
Host: srvvalida.rf.gd
Origin: http://srvvalida.rf.gd
Referer: http://srvvalida.rf.gd/?i=1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36

saludo:
nombre:
------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Content-Disposition: form-data; name="saludo"


------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN
Content-Disposition: form-data; name="nombre"


------WebKitFormBoundaryWv6BXE9Yr1Q8AqnN--

Memoria (Servidor)

$saludo
""
$nombre
""

5. El servicio comprueba que el saludo sea válido

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Hace wait esperando response.

srv/valida.php

$saludo = recibeTexto("saludo");
$nombre = recibeTexto("nombre");
if (
 $saludo === false
 || $saludo === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltasaludo.html",
  title: "Falta el saludo.",
 );
}
if (
 $nombre === false
 || $nombre === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltanombre.html",
  title: "Falta el nombre.",
 );
}
$resultado =
 "{$saludo} {$nombre}.";
devuelveJson($resultado);

Memoria (Servidor)

$saludo
""
$nombre
""

6. Como el saludo no es válido, aborta y genera la response

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Hace wait esperando response.

srv/valida.php

$saludo = recibeTexto("saludo");
$nombre = recibeTexto("nombre");
if (
 $saludo === false
 || $saludo === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltasaludo.html",
  title: "Falta el saludo.",
 );
}
if (
 $nombre === false
 || $nombre === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/errors/faltanombre.html",
  title: "Falta el nombre.",
 );
}
$resultado =
 "{$saludo} {$nombre}.";
devuelveJson($resultado);

Response

HTTP/1.1 400 Bad Request Server: openresty
Date: Fri, 02 May 2025 13:53:21 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
{"title":"Falta el saludo.","type":"\/errors\/faltasaludo.html"}

7. El servicio devuelve la response, que es recibida en el cliente

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Despierta y recibe response.

Response

HTTP/1.1 400 Bad Request Server: openresty
Date: Fri, 02 May 2025 13:53:21 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
{"title":"Falta el saludo.","type":"\/errors\/faltasaludo.html"}

srv/valida.php

$saludo = recibeTexto("saludo");
$nombre = recibeTexto("nombre");
if (
 $saludo === false
 || $saludo === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/error/faltasaludo.html",
  title: "Falta el saludo.",
 );
}
if (
 $nombre === false
 || $nombre === ""
) {
 throw new ProblemDetails(
  status: ProblemDetails::BadRequest,
  type: "/error/faltanombre.html",
  title: "Falta el nombre.",
 );
}
$resultado =
 "{$saludo} {$nombre}.";
devuelveJson($resultado);

Devuelve response y se duerme.

8. Como hay error, lanza una excepción cuyos detalles se muestran en la consola y en un alert

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Memoria

error
ProblemDetails
status
400
type
"/errors/faltasaludo.html"
title
"Falta el saludo."

Alert

Falta el saludo

Consola

POST http://srvvalida.rf.gd/php/valida.php 400 (Bad Request) enviaFormRecibeJson.js:10 enviaFormRecibeJson @ enviaFormRecibeJson.js:10
submit @ ?i=1:56
ProblemDetailsError: Falta el saludo. muestraError.js:29
at consume (consume.js:16:10)
at async HTMLFormElement.submit (?i=1:55:22)
{status: 400, title: 'Falta el saludo.', type: '/erros/faltasaludo.html'} "status": 400
"title": "Falta el saludo."
"type": "/erros/faltasaludo.html"
[[Orototype]]: Object
muestraError @ muestraError.js:29
(anónimo) @ manejaErrores.js:32

9. Al cerrar el alert, termina el evento

index.html

const respuesta = await consume(
 enviaFormRecibeJson(
  "php/valida.php", formulario))
const json =
 await respuesta.json()
alert(json)

Consola

POST http://srvvalida.rf.gd/php/valida.php 400 (Bad Request) enviaFormRecibeJson.js:10 enviaFormRecibeJson @ enviaFormRecibeJson.js:10
submit @ ?i=1:56
ProblemDetailsError: Falta el saludo. muestraError.js:29
at consume (consume.js:16:10)
at async HTMLFormElement.submit (?i=1:55:22)
{status: 400, title: 'Falta el saludo.', type: '/erros/faltasaludo.html'} "status": 400
"title": "Falta el saludo."
"type": "/erros/faltasaludo.html"
[[Orototype]]: Object
muestraError @ muestraError.js:29
(anónimo) @ manejaErrores.js:32