3

RAD サーバーの実験を始めたところです。投資を魅力的にする機能の 1 つは、自己文書化 API の機能です。これにより、REST インターフェイスに接続する外部パートナーをサポートするための多くの作業が節約され、常に遅れをとってしまう別のインターフェイス仕様ドキュメントを維持する必要がなくなります。開発。

最初の EMS リソースを作成するための wiki のチュートリアルに従って、テスト用の EMS サーバーにデプロイしました。これは問題なく正常に動作します。

しかし、カスタム API ドキュメントのチュートリアルにたどり着くと、単に機能しません。

SWAGGER / YAML AND SELF DOCUMENTING RESTFUL API'Sに関する Stephen Ball の投稿を見てきました。残念ながら、彼は RAD Studio EMS Sample プロジェクトを使用していますが、これは私にとっても完璧に機能します。しかし、同じ属性を自分の EMS パッケージに適用しようとすると、うまくいきません。

htt://localhost:8080/api/apidoc.yaml を呼び出すと、サーバーは次のように返します。

{
  "error":"Error",
  "description":"Error: No Responses defined for: get "
}

EMS 開発サーバーには、次の対応するログ エントリがあります。

{"Request":{"Resource":"API","Endpoint":"GetAPIYAMLFormat","Method":"GET","User":"(blank)","Time":"2017/08/11 12:59:46 AM","Thread":1732}}
{"Error":{"Type":"HTTP","Code":"500","Reason":"Error","Error":"","Description":"Error: No Responses defined for: get ","Thread":1732}}

チュートリアルからの私のコードのスニペットは次のとおりです。

unit Unit1;

// EMS Resource Unit

interface

uses
  System.SysUtils, System.Classes, System.JSON,
  EMS.Services, EMS.ResourceAPI,
  EMS.ResourceTypes, APIDocumentationEndPointObjectsDefinitions;

type
  [ResourceName('Test')]
  [EndPointObjectsYAMLDefinitions(YAMLDefinitions)]
  [EndPointObjectsJSONDefinitions(JSONDefinitions)]

  {$METHODINFO ON}
  TTestResource = class
  published
    // Declare the function
    function MakeJSON(I: Integer): TJSONObject; //It takes an integer as a parameter and returns a JSON Object.
    [EndPointRequestSummary('Items', 'Get items', 'Used to retrieve all the items', 'application/json', '')]
    [EndPointRequestParameter(TAPIDocParameter.TParameterIn.Path, 'Test', 'Path Parameter item Description', false, TAPIDoc.TPrimitiveType.spString, TAPIDoc.TPrimitiveFormat.None, TAPIDoc.TPrimitiveType.spString, '', '')]
    [EndPointResponseDetails(200, 'Ok', TAPIDoc.TPrimitiveType.spObject, TAPIDoc.TPrimitiveFormat.None, '', '#/definitions/items')]
    procedure Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
    [ResourceSuffix('{item}')]
    procedure GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
  end;
  {$METHODINFO OFF}

implementation
const
  TestValues: array [0 .. 2] of string = ('a', 'b', 'c'); // It creates an array of string values.

procedure TTestResource.Get(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  LJSON: TJSONArray;
  I: Integer;
begin
  LJSON := TJSONArray.Create;
  for I := Low(TestValues) to High(TestValues) do
    LJSON.Add(MakeJSON(I)); //[{"index":0,"value":"a"},{"index":1,"value":"b"},{"index":2,"value":"c"}]
  AResponse.Body.SetValue(LJSON, True) // True causes AResponse to free JSON
end;

procedure TTestResource.GetItem(const AContext: TEndpointContext; const ARequest: TEndpointRequest; const AResponse: TEndpointResponse);
var
  I: Integer;
begin
  if not TryStrToInt(ARequest.Params.Values['item'], I) then //{"index":I,"value":value}
    AResponse.RaiseBadRequest('Index expected');
  if (I < 0) or (I >= Length(TestValues)) then
    AResponse.RaiseBadRequest('Index out of range');
  AResponse.Body.SetValue(MakeJSON(I), True);
  // True causes AResponse to free JSON
end;

function TTestResource.MakeJSON(I: Integer): TJSONObject;
begin
  Result := TJSONObject.Create;
  Result.AddPair('index', TJSONNumber.Create(I)); //Adds to the JSON object a pair {"index": I}, the index number.
  Result.AddPair('value', TJSONString.Create(TestValues[I])); //Adds to the the JSON object a pair {"value":String}, the string corresponding to the index number.

end;

procedure Register;
begin
  RegisterResource(TypeInfo(TTestResource));
end;

initialization
  Register;
end.

サンプル プロジェクトには、RAD Studio EMS パッケージ ウィザードによって生成されたコードに欠けているものがあるようです。

新しい EMS ドキュメント属性を使用して、RAD Studio で提供されているサンプル プロジェクトではなく、独自の EMS パッケージから YAML ドキュメントを作成できた人はいますか?

他の誰かがこれを経験しましたか?get メソッドが完全に実装されていない可能性はありますか。これに対する修正はありますか (RAD Studio 10.2.1 にアップデートしたばかりです)?

4

2 に答える 2