API オブジェクトで宣言されたサービスのパスをカスタマイズします。
' [ 'RestPath("/<SubPath1> [ /'{'&var1'}'/'{'&var2'}'/<SubPath2> ] ")' ] '
構文の表記規則の表示
注: SubPath と変数の数は、必要に応じて変更できます。また、それらを分散させることもできます。
入力値の説明:
SubPath1,..., SubPathN サービスにアクセスするためのパスの一部です。これらは、サービス ベース パスの後に自動的に追加されます。
&var1,..., &varN 省略可能な変数が API オブジェクト内で定義されています。これは、
in 演算子で定義されたサービスのパラメーターである必要があります。
説明
サービスのパスには、所定の方法で、
サービス ベース パスとそれに続くサービスの名前が含まれます。このアノテーション (注釈) を使用すると、パスをカスタマイズし、その中に in パラメーターを含めることもできます。
既定では、次に示すように [ Services base path ] プロパティには、定義時に API オブジェクトに割り当てられた名前があります。
つまり、この例では、
API オブジェクトを実行すると、サービスにアクセスするための既定のパスは次のようになります。
http://<AppPath>/APICustomer/ListCustomers
RestPath を使用すると、サービスのパスをカスタマイズできます。たとえば、ListCustomers から Customers に変更するには、次のようにします。
http://<AppPath>/APICustomer/Customers
これを実現するには、サービス定義の前に [ RestPath("/Customers”) ] を追加します。
1.顧客のリストを取得します。
次のような
トランザクションについて考えます:
Customer
{
CustomerId* (Autonumber property = Yes)
CustomerName
CustomerLastName
}
SDTCustomer という名前の
Structured Data Type (SDT) オブジェクトを作成します。Customer トランザクションを
KB エクスプローラーから SDT 構造にドラッグします。 [ Is Collection ] チェックボックスをオンにして、SDT をコレクションとして定義します。SDTCustomersItem という名前を Customer に置き換えます。
DPCustomerList という
Data Provider オブジェクトを作成し、次のように入力します。
SDT をデータプロバイダーのソースにドラッグすると、
[ Output ] プロパティが SDTCustomer 値で自動的に構成されます。
APICustomer という
API オブジェクトを作成し、以下を定義します。
変数:
SDTCustomer (Type:SDTCustomer)
サービスソース:
Customer
{
[ RestPath("/Customers") ]
ListCustomers(out:&SDTCustomer) => DPCustomerList(&SDTCustomer);
}
DPCustomerList オブジェクトは、ListCustomers というサービスとして公開されます。
最後に、OpenAPI 形式でサービスを公開する場合は、API オブジェクトの
[ Generate OpenAPI interface ] プロパティを [ Yes ] に設定する必要があります。
API オブジェクトを実行すると、次のように表示されます。
2.顧客に関する情報を取得します。
次に、前述の例と同じ顧客取引を
ビジネスコンポーネントとして定義します。
次に以下の定義を使用して、ReturnOneCustomerData という
Procedure オブジェクトを作成します。
変数:
&Customer (Type: Customer)
&CustomerId (Type:Attribute:CustomerId)
ルール:
Parm(in:&CustomerId, out:&Customer);
ソース:
&Customer.Load(&CustomerId)
if &Customer.Fail()
&Customer.CustomerId = 0
&Customer.CustomerLastName = "Invalid Customer"
Endif
注: CustomerId の
[ Autonumber ] プロパティが [ Yes ] であることに注意してください。
このプロシージャーは、顧客の ID を受け取り、
Load メソッドを使用してデータベースにアクセスし、必要な顧客に対応する情報を返します。情報が見つからない場合は、Customer ID が割り当てられ、値 0 と顧客名には "Invalid Customer"が返されます。
次に、API オブジェクト (たとえば、APICustomer など) を作成し、以下を定義します。
変数:
&Customer (Type: Customer)
&CustomerId (Type: Attribute:CustomerId)
&Message (Type: Messages.Message, GeneXus.Common)
&Messages (Type: Messages, GeneXus.Common)
サービスソース:
Customer
{
[ RestPath("/Customer/{&CustomerId}") ]
GetCustomer(in:&CustomerId, out:&Customer, out:&Messages) => ReturnOneCustomerData(&CustomerId, &Customer);
}
ReturnOneCustomerData プロシージャーは、GetCustomer というサービスとして公開されます。
イベント:
Event GetCustomer.Before
if &CustomerId < 0
&RestCode = 412
return
Endif
EndEvent
Event GetCustomer.After
if &Customer.CustomerId = 0
&Message.Type = MessageTypes.Error
&Message.Description = format("Customer %1 not found", &CustomerId)
&Messages.Add(&Message)
&RestCode = 404
Endif
EndEvent
トリガー
イベント GetCustomer.Before は、入力された Id が 0未満かどうかを確認します。この場合、ReturnOneCustomerData プロシージャーは実行されず、エラー 412 (宛先リソースへのアクセスが拒否されました) が返されます。
さらに、GetCustomer.After イベントは、ReturnOneCustomerData プロシージャーの実行と ID 0 の取得に続いて、エラーと説明を返します。それ以外の場合は、入力した顧客のデータが画面に表示されます。
最後に、OpenAPI 形式でサービスを公開する場合は、API オブジェクトの
[ Generate OpenAPI interface ] プロパティを [ Yes ] に設定する必要があります。
API オブジェクトを実行すると、次のように表示されます。
必要に応じて、RestPaht に別の変数を追加できます。たとえば、CustomerName を追加できます。
Customer
{
[ RestPath("/Customer/{&CustomerId}/{&CustomerName}") ]
GetCustomer(in:&CustomerId, in:&CustomerName, out:&Customer, out:&Messages) => ReturnOneCustomerData(&CustomerId, &CustomerName, &Customer);
}
注:
- ResPath アノテーションは、たとえば RestMethod と組み合わせることができます。 [ RestMethod(GET),RestPath("/Customer/{&CustomerId}/{&CustomerName}") ]
- RestPath アノテーションは、その直下のサービスに影響します。
GeneXus 17 Upgrade 9 以降。