メインコンテンツまでスキップ
バージョン: 20 R8 BETA

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

引数説明
keyText->取得したいヘッダープロパティ
戻り値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 プロパティは、読み出し専用です。