IncomingMessage
4D.IncomingMessage
クラスを使用すると、カスタムのHTTP リクエストハンドラー が受信したオブジェクトを管理できるようになります。 HTTP リクエストおよびそのプロパティは4D.IncomingMessage
クラスのインスタンスとして自動的に受信されます。 GET 動詞とともにリクエストに直接渡された引数は.urlQuery
プロパティで管理される一方、リクエストの本文に渡された引数は.getBlob()
あるいは getText()
といった関数を通して利用可能です。
HTTP リクエストハンドラーはあらゆる値を返すことが可能です(あるいは返さないことも可能です)。 通常は、4D.OutgoingMessage
クラスのインスタンスを返します。
このクラスの全てのプロパティは読み出し専用です。 これらはリクエストハンドラーによって自動的に値が入れられます。
履歴
リリース | 内容 |
---|---|
20 R8 | クラスを追加 |
例題
HTTPHandlers.json ファイル が、以下のように定義されているとします:
[
{
"class": "GeneralHandling",
"method": "gettingStarted",
"pattern": "start",
"verbs": "get, post"
}
]
http://127.0.0.1/start/example?param=demo&name=4D
リクエストが、GET
動詞とともにブラウザ内で実行されます。 このリクエストは、以下のGeneralHandling シングルトンクラスのgettingStarted 関数によって管理されます:
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
The request is received on the server as $request, an object instance of the 4D.IncomingMessage
class.
レスポンスのヘッダーは以下のようになります:
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
IncomingMessageオブジェクト
4D.IncomingMessage オブジェクトは、以下のプロパティと関数を提供します:
.getBlob() : Blob リクエストの本文部分をBlob として返します |
.getHeader( key : Text ) : Text key 引数でキーを指定したヘッダーの値を返しますheader |
.getJSON() : Variant JSON 解決をしたリクエストの本文を返します |
.getPicture() : Picture リクエストの本文をピクチャーとして返します(本文がピクチャーとして送信されていた場合) |
.getText() : Text リクエストの本文部分をテキスト値として返します |
headers : Object 受信したメッセージのカレントのヘッダーがキー/値のペア(文字列)が格納されています |
url : Text リクエストのURL からIP:port 部分を抜いたものが文字列として格納されています |
urlPath : Collection リクエストのURL からIP:port 部分を抜いたものが文字列のコレクションとして格納されています |
urlQuery : Object リクエストの引数がURL 内でキー/値のペアとして渡されていた場合にはそれが格納されています |
verb : Text リクエストで使用された動詞が格納されています |
4D.IncomingMessage オブジェクトは共有不可 のオブジェクトです。
.getBlob()
.getBlob() : Blob
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | BLOB | <- | Blob 形式のリクエストの本文 |
説明
.getBlob()
関数は、リクエストの本文部分をBlob として返します。
本文がバイナリーコンテンツとして渡されていない場合、この関数は値をBlob に変換することを試みますが、想定外の結果を返す可能性もあります。
.getHeader()
.getHeader( key : Text ) : Text
引数 | 型 | 説明 | |
---|---|---|---|
key | Text | -> | 取得したいヘッダープロパティ |
戻り値 | Text | <- | ヘッダープロパティの値 |
説明
.getHeader()
関数は、key 引数でキーを指定したヘッダーの値を返しますheader。
key 引数は大文字と小文字を区別しません。
例題
var $value : Text
var $request : 4D.IncomingMessage
$value := $request.getHeader("content-type")
.getJSON()
.getJSON() : Variant
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | Variant | <- | JSON解決したリクエストの本文 |
説明
.getJSON()
関数は、JSON 解決をしたリクエストの本文を返します。
本文がJSON として有効なコンテンツとして与えられていなかった場合、エラーが発生します。
.getPicture()
.getPicture() : Picture
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | Picture | <- | ピクチャー形式のリクエストの本文 |
説明
.getPicture()
関数は、リクエストの本文をピクチャーとして返します(本文がピクチャーとして送信されていた場合)。
本文がピクチャーであるということを示すために、ヘッダー内でcontent-type が与えられている必要があります。
リクエストがHTTPRequest
クラス を使用してビルドされていた場合、ピクチャーは本文内にてBlob として送信されるとともに、適切なcontent-type が指定されている必要があります。
本文が有効なピクチャーとして受信されていない場合、この関数はnull を返します。
.getText()
.getText() : Text
引数 | 型 | 説明 | |
---|---|---|---|
戻り値 | Text | <- | テキスト形式のリクエストの本文 |
説明
.getText()
関数は、リクエストの本文部分をテキスト値として返します。
本文が文字列の値として渡されていない場合、この関数は値をテキストに変換することを試みますが、想定外の結果を返す可能性もあります。
.headers
headers : Object
説明
.headers
プロパティには受信したメッセージのカレントのヘッダーがキー/値のペア(文字列)が格納されています。
.headers
プロパティは、読み出し専用です。
ヘッダー名(キー)は全て小文字となっています。 ヘッダー名は全て大文字・小文字は区別されます。
.url
url : Text
説明
.url
プロパティには、リクエストのURL からIP:port 部分を抜いたものが文字列として格納されています。
例えば、リクエストが "http://127.0.0.1:80/docs/invoices/today" だった場合、.url
プロパティには"/docs/invoices/today" が格納されています。
.url
プロパティは、読み出し専用です。
リクエストの"host" 部分(IP:port) は、host
ヘッダー にて提供されています。
.urlPath
urlPath : Collection
説明
.urlPath
プロパティには、リクエストのURL からIP:port 部分を抜いたものが文字列のコレクションとして格納されています。
例えば、リクエストが "http://127.0.0.1:80/docs/invoices/today" だった場合、.urlPath
プロパティには、["docs", "invoices" ,"today"] が格納されています。
.urlPath
プロパティは、読み出し専用です。
.urlQuery
urlQuery : Object
説明
.urlQuery
プロパティには、リクエストの引数がURL 内でキー/値のペアとして渡されていた場合にはそれが格納されています。
.urlQuery
プロパティは、読み出し専用です。
引数はリクエストのURL 内に直接またはJSON コンテンツとして渡すことができます。
直接引数
例: http://127.0.0.1:8044/myCall?firstname=Marie&id=2&isWoman=true
この場合、引数はurlQuery
プロパティ内に文字列化された値として受け取られます: urlQuery = {"firstname":"Marie" ,"id":"2" ,"isWoman":"true"}
JSONコンテンツ引数
例: http://127.0.0.1:8044/myCall/?myparams='[{"firstname": "Marie","isWoman": true,"id": 3}]'
引数はJSON フォーマットで渡されかつコレクションとして括られています。
この場合、引数はurlQuery
プロパティ内にJSON テキストとして受け取られ、JSON Parse
を使用することでパースすることができます。
//urlQuery.myparams: "[{"firstname": "Marie","isWoman": true,"id": 3}]"
$test:=Value type(JSON Parse($r.urlQuery.myparams))=Is collection) //true
シングルクオーテーションやキャリッジリターンなどの特殊文字はエスケープする必要があります。
例: http://127.0.0.1:8044/syntax/?mdcode=%60%60%604d
//urlQuery.mdcode = ```4d
$test:=Length($r.urlQuery.mdcode) //5
POST または PUT 動詞を使用してリクエストの本文部分に渡された引数は、専用の関数を通して管理されます: getText()
、getPicture()
、getBlob()
、getJSON()
.verb
verb : Text
説明
.verb
プロパティには、リクエストで使用された動詞が格納されています。
HTTP または HTTPS リクエスト動詞には、例えば"get"、"post"、"put" などと言ったものが含まれます。
.verb
プロパティは、読み出し専用です。