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
Lanzamiento | Modificaciones |
---|---|
20 R8 | Clase 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 |
Un objeto 4D.IncomingMessage es un objeto no compartible.
.getBlob()
.getBlob(): Blob
Parámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Blob | <- | 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ámetros | Tipo | Descripción | |
---|---|---|---|
key | Text | -> | Propiedad de encabezado a obtener |
Resultado | Text | <- | Valor de la propiedad del encabezado |
Descripción
La función .getHeader()
devuelve el valor del encabezado key .
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ámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Variant | <- | 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ámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Picture | <- | 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.
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ámetros | Tipo | Descripción | |
---|---|---|---|
Resultado | Text | <- | 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.
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
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.