Saltar al contenido principal
Versión: Siguiente

IncomingMessage

La clase 4D.IncomingMessage le permite manejar el objeto recibido por un HTTP request handler. Las peticiones HTTP y sus propiedades se reciben automáticamente como una instancia de la clase 4D.IncomingMessage. Los parámetros dados directamente en la petición con el verbo GET son manejados por la propiedad .urlQuery, mientras que los parámetros pasados en el cuerpo de la solicitud están disponibles a través de funciones como .getBlob() o getText().

El gestor de peticiones HTTP puede devolver cualquier valor (o nada). Normalmente devuelve una instancia de la clase 4D.OutgoingMessage.

Todas las propiedades de esta clase son de sólo lectura. Son automáticamente llenados por el gestor de peticiones.

Historia
LanzamientoModificaciones
20 R8Clase añadida

Ejemplo

El siguiente archivo HTTPHandlers.json ha sido definido:

[
{
"class": "GeneralHandling",
"method": "gettingStarted",
"pattern": "start",
"verbs": "get, post"
}
]

La petición http://127.0.0.1/start/example?param=demo&name=4D se ejecuta con un verbo GET en un navegador. Se gestiona mediante la función gettingStarted de la siguiente clase singleton GeneralHandling:

shared singleton Class constructor()

Function gettingStarted($request : 4D.IncomingMessage) : 4D.OutgoingMessage

var $result:=4D.OutgoingMessage.new()
var $body : Text

$body:="Called URL: "+$request.url+"\n"

$body+="The parameters are received as an object: \n"+JSON Stringify($request.urlQuery; *)+"\n"

$body+="The verb is: "+$request.verb+"\n"

$body+="There are "+String($request.urlPath.length)+" url parts - Url parts are: "\
+$request.urlPath.join(" - ")+"\n\n"


$result.setBody($body)
$result.setHeader("Content-Type"; "text/plain")

return $result

La petición se recibe en el servidor como $request, una instancia de objeto de la clase 4D.IncomingMessage.

Esta es la respuesta:

Called URL: /start/example? param=demo&name=4D 
The parameters are received as an object:
{
"param": "demo",
"name": "4D"
}
The verb is: GET
There are 2 url parts - Url parts are: start - example

Objeto IncomingMessage

Los objetos 4D.IncomingMessage ofrecen las siguientes propiedades y funciones:

.getBlob() : Blob
devuelve el cuerpo de la petición como un Blob
.getHeader( key : Text ) : Text
devuelve el valor del encabezado key
.getJSON() : Variant
devuelve el cuerpo de la solicitud como una resolución JSON
.getPicture() : Picture
devuelve el cuerpo de la petición como una imagen (en caso de que un cuerpo enviado como una imagen)
.getText() : Text
devuelve el cuerpo de la solicitud como un valor de texto
headers : Object
los encabezados actuales del mensaje entrante como pares llave/valor (cadenas)
url : Text
la URL de la petición sin la parte IP:port y como cadena
urlPath : Collection
la URL de la solicitud sin la parte IP:port y como una colección de cadenas
urlQuery : Object
los parámetros de la petición cuando se han dado en la URL como pares llave/valor
verb : Text
el verbo usado por la petición
nota

Un objeto 4D.IncomingMessage es un objeto no compartible.

.getBlob()

.getBlob() : Blob

ParámetrosTipoDescripción
ResultadoBlob<-Cuerpo de la petición como Blob

Descripción

La función .getBlob() devuelve el cuerpo de la petición como un Blob.

Si el cuerpo no se ha dado como contenido binario, la función intenta convertir el valor pero puede dar resultados inesperados.

.getHeader()

.getHeader( key : Text ) : Text

ParámetrosTipoDescripción
keyText->Propiedad de encabezado a obtener
ResultadoText<-Valor de la propiedad del encabezado

Descripción

La función .getHeader() devuelve el valor del encabezado key .

nota

El parámetro key no distingue entre mayúsculas y minúsculas.

Ejemplo

var $value : Text
var $request : 4D.IncomingMessage
$value := $request.getHeader("content-type")

.getJSON()

.getJSON() : Variant

ParámetrosTipoDescripción
ResultadoVariant<-Resolución JSON del body de la petición

Descripción

La función .getJSON() devuelve el cuerpo de la solicitud como una resolución JSON.

Si el cuerpo no se ha dado como contenido JSON válido, se produce un error.

.getPicture()

.getPicture() : Picture

ParámetrosTipoDescripción
ResultadoPicture<-Cuerpo de la petición como imagen

Descripción

La función .getPicture() devuelve el cuerpo de la petición como una imagen (en caso de que un cuerpo enviado como una imagen).

El tipo de contenido debe indicarse en los encabezados para indicar que el cuerpo es una imagen.

nota

Si la solicitud se crea utilizando la clase HTTPRequest, la imagen debe ser enviada en el cuerpo como un Blob con el tipo de contenido apropiado.

Si el cuerpo no se recibe como una imagen válida, la función devuelve null.

.getText()

.getText() : Text

ParámetrosTipoDescripción
ResultadoText<-Cuerpo de la petición como texto

Descripción

La función .getText() devuelve el cuerpo de la solicitud como un valor de texto.

Si el cuerpo no se ha dado como cadena, la función intenta convertir el valor pero puede dar resultados inesperados.

.headers

headers : Object

Descripción

La propiedad .headers contiene los encabezados actuales del mensaje entrante como pares llave/valor (cadenas).

La propiedad .headers es de sólo lectura.

Los nombres de los encabezados (llaves) se escriben en minúsculas. Tenga en cuenta que los nombres de los encabezados diferencian entre mayúsculas y minúsculas.

.url

url : Text

Descripción

La propiedad .url contiene la URL de la petición sin la parte IP:port y como cadena.

Por ejemplo, si la solicitud va dirigida a "http://127.0.0.1:80/docs/invoices/today", la propiedad .url es "/docs/invoices/today".

La propiedad .url es de sólo lectura.

nota

La parte "host" de la petición (IP:port) es suministrada por el encabezado host.

.urlPath

urlPath : Collection

Descripción

La propiedad .urlPath contiene la URL de la solicitud sin la parte IP:port y como una colección de cadenas.

Por ejemplo, si la solicitud va dirigida a "http://127.0.0.1:80/docs/invoices/today", la propiedad .urlPath es ["docs", "invoices" , "today"].

La propiedad .urlPath es de sólo lectura.

.urlQuery

urlQuery : Object

Descripción

La propiedad .urlQuery contiene los parámetros de la petición cuando se han dado en la URL como pares llave/valor.

La propiedad .urlQuery es de sólo lectura.

Los parámetros se pueden pasar en la URL de las peticiones directamente o como contenido JSON.

Parámetros directos

Ejemplo: http://127.0.0.1:8044/myCall?firstname=Marie&id=2&isWoman=true

En este caso, los parámetros se reciben como valores stringificados en la propiedad urlQuery: urlQuery = {"firstname": "Marie" , "id": "2" , "isWoman": "true"}

Parámetros contenido JSON

Ejemplo: http://127.0.0.1:8044/myCall/?myparams='[{"firstname": "Marie", "isWoman": true, "id": 3}]'.

Los parámetros se pasan en formato JSON y dentro de una colección.

En este caso, los parámetros se reciben como texto JSON en la propiedad urlQuery y se pueden analizar utilizando JSON Parse.

//urlQuery.myparams: "[{"firstname": "Marie","isWoman": true,"id": 3}]"
$test:=Value type(JSON Parse($r.urlQuery.myparams))=Is collection) //true

Los caracteres especiales, como las comillas simples o los retornos de carro, deben escaparse.

Ejemplo: http://127.0.0.1:8044/syntax/?mdcode=%60%60%604d

//urlQuery.mdcode = ```4d
$test:=Length($r.urlQuery.mdcode) //5
nota

Los parámetros dados en el cuerpo de la petición utilizando los verbos POST o PUT son manejados a través de funciones dedicadas: getText(), getPicture(), getBlob(), getJSON().

.verb

verb : Text

Descripción

La propiedad .verb contiene el verbo usado por la petición.

Los verbos de solicitud HTTP y HTTPS incluyen, por ejemplo, "get", "post", "put", etc.

La propiedad .verb es de sólo lectura.